Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAneesh Dogra <lionaneesh@gmail.com>2012-12-24 21:27:04 (GMT)
committer Aneesh Dogra <lionaneesh@gmail.com>2012-12-24 21:27:04 (GMT)
commit500ce60b002d7f61fcb294b075441329b42350b2 (patch)
treeb28812c2120138174dd5ff2dd08bf861bc8fd650
Initial commit
-rw-r--r--AUTHORS8
-rw-r--r--ChangeLog71
-rw-r--r--LICENSE339
-rwxr-xr-xNEWS49
-rw-r--r--activity.py103
-rw-r--r--activity/activity-wikipedia-en-simple.pngbin0 -> 3254 bytes
-rw-r--r--activity/activity-wikipedia-en-simple.svg67
-rw-r--r--activity/activity-wikipedia-en.svg90
-rw-r--r--activity/activity-wikipedia-es.svg90
-rw-r--r--activity/activity-wikipedia-fr.pngbin0 -> 3149 bytes
-rw-r--r--activity/activity-wikipedia-fr.svg90
-rw-r--r--activity/activity-wikipedia-gn.svg68
-rw-r--r--activity/activity-wikipedia-pl.pngbin0 -> 3130 bytes
-rw-r--r--activity/activity-wikipedia-pl.svg90
-rw-r--r--activity/activity-wikipedia-qu.svg107
-rw-r--r--activity/activity-wikipedia-rw.pngbin0 -> 3317 bytes
-rw-r--r--activity/activity-wikipedia-rw.svg68
-rw-r--r--activity/activity-wikipedia.svg11
-rw-r--r--activity/activity.info6
-rw-r--r--activity/activity.info.base6
-rw-r--r--activity/activity.info.en6
-rw-r--r--activity/activity.info.en_simple6
-rw-r--r--activity/activity.info.es_lat6
-rw-r--r--activity/activity.info.fr6
-rw-r--r--activity/activity.info.gn6
-rw-r--r--activity/activity.info.pl6
-rw-r--r--activity/activity.info.qu6
-rw-r--r--activity/activity.info.rw6
-rw-r--r--activity_en.py43
-rw-r--r--activity_en_simple.py43
-rw-r--r--activity_es.py44
-rw-r--r--activity_fr.py44
-rw-r--r--activity_gn.py43
-rw-r--r--activity_pl.py44
-rw-r--r--activity_qu.py44
-rw-r--r--activity_rw.py43
-rwxr-xr-xbin/armv7l/bzip-tablebin0 -> 11519 bytes
-rwxr-xr-xbin/armv7l/seek-bunzipbin0 -> 12035 bytes
-rwxr-xr-xbin/linux32/bzip-tablebin0 -> 10785 bytes
-rwxr-xr-xbin/linux32/seek-bunzipbin0 -> 11373 bytes
-rwxr-xr-xbin/linux64/bzip-tablebin0 -> 17221 bytes
-rwxr-xr-xbin/linux64/seek-bunzipbin0 -> 17971 bytes
-rwxr-xr-xbinarylibs/armv7l_27/_expander.sobin0 -> 60882 bytes
-rwxr-xr-xbinarylibs/armv7l_27/_mwscan.sobin0 -> 78445 bytes
-rwxr-xr-xbinarylibs/armv7l_27/_wp.sobin0 -> 124844 bytes
-rwxr-xr-xbinarylibs/linux32_26/_expander.sobin0 -> 22716 bytes
-rwxr-xr-xbinarylibs/linux32_26/_mwscan.sobin0 -> 31900 bytes
-rwxr-xr-xbinarylibs/linux32_26/_wp.sobin0 -> 57596 bytes
-rwxr-xr-xbinarylibs/linux32_27/_expander.sobin0 -> 60911 bytes
-rwxr-xr-xbinarylibs/linux32_27/_mwscan.sobin0 -> 81898 bytes
-rwxr-xr-xbinarylibs/linux32_27/_wp.sobin0 -> 119821 bytes
-rwxr-xr-xbinarylibs/linux64_27/_expander.sobin0 -> 71257 bytes
-rwxr-xr-xbinarylibs/linux64_27/_mwscan.sobin0 -> 99068 bytes
-rwxr-xr-xbinarylibs/linux64_27/_wp.sobin0 -> 146870 bytes
-rw-r--r--cert8.db1
-rw-r--r--data_repository.cfg6
-rw-r--r--dataretriever.py187
-rw-r--r--en/enwiki-20111201-pages-articles.xml.processed.bz2bin0 -> 110702691 bytes
-rw-r--r--en/enwiki-20111201-pages-articles.xml.processed.bz2t512
-rw-r--r--en/search.dbbin0 -> 7526400 bytes
-rw-r--r--icons/add-link.svg7
-rw-r--r--icons/browse-close-tab.svg27
-rw-r--r--icons/browse-dialog-cancel.svg17
-rw-r--r--icons/browse-follow-link-new-tab.svg43
-rw-r--r--icons/browse-follow-link.svg26
-rw-r--r--icons/browse-view-refresh.svg14
-rw-r--r--icons/link.svg12
-rw-r--r--icons/search-wiki.svg46
-rw-r--r--icons/tab-add.svg12
-rw-r--r--load_blacklist_in_server.patch40
-rw-r--r--load_blacklist_in_setup_new_wiki.patch38
-rw-r--r--locale/af/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 543 bytes
-rw-r--r--locale/af/activity.linfo2
-rw-r--r--locale/am/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 990 bytes
-rw-r--r--locale/am/activity.linfo2
-rw-r--r--locale/ar/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 2766 bytes
-rw-r--r--locale/ar/activity.linfo2
-rw-r--r--locale/ay/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 404 bytes
-rw-r--r--locale/ay/activity.linfo2
-rw-r--r--locale/bg/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1627 bytes
-rw-r--r--locale/bg/activity.linfo2
-rw-r--r--locale/bi/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 407 bytes
-rw-r--r--locale/bi/activity.linfo2
-rw-r--r--locale/bn/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 2340 bytes
-rw-r--r--locale/bn/activity.linfo2
-rw-r--r--locale/bn_IN/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 2069 bytes
-rw-r--r--locale/bn_IN/activity.linfo2
-rw-r--r--locale/ca/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1659 bytes
-rw-r--r--locale/ca/activity.linfo2
-rw-r--r--locale/cpp/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 407 bytes
-rw-r--r--locale/cpp/activity.linfo2
-rw-r--r--locale/cs/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1156 bytes
-rw-r--r--locale/cs/activity.linfo2
-rw-r--r--locale/da/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 2065 bytes
-rw-r--r--locale/da/activity.linfo2
-rw-r--r--locale/de/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 2243 bytes
-rw-r--r--locale/de/activity.linfo2
-rw-r--r--locale/dz/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1864 bytes
-rw-r--r--locale/dz/activity.linfo2
-rw-r--r--locale/el/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 2327 bytes
-rw-r--r--locale/el/activity.linfo2
-rw-r--r--locale/en/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 2022 bytes
-rw-r--r--locale/en/activity.linfo2
-rw-r--r--locale/en_US/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 2025 bytes
-rw-r--r--locale/en_US/activity.linfo2
-rw-r--r--locale/es/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1890 bytes
-rw-r--r--locale/es/activity.linfo2
-rw-r--r--locale/fa/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1454 bytes
-rw-r--r--locale/fa/activity.linfo2
-rw-r--r--locale/fa_AF/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1731 bytes
-rw-r--r--locale/fa_AF/activity.linfo2
-rw-r--r--locale/ff/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 404 bytes
-rw-r--r--locale/ff/activity.linfo2
-rw-r--r--locale/fi/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 407 bytes
-rw-r--r--locale/fi/activity.linfo2
-rw-r--r--locale/fil/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1496 bytes
-rw-r--r--locale/fil/activity.linfo2
-rw-r--r--locale/fr/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 2264 bytes
-rw-r--r--locale/fr/activity.linfo2
-rw-r--r--locale/gu/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 404 bytes
-rw-r--r--locale/gu/activity.linfo2
-rw-r--r--locale/ha/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 404 bytes
-rw-r--r--locale/ha/activity.linfo2
-rw-r--r--locale/he/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 401 bytes
-rw-r--r--locale/he/activity.linfo2
-rw-r--r--locale/hi/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 2241 bytes
-rw-r--r--locale/hi/activity.linfo2
-rw-r--r--locale/ht/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1641 bytes
-rw-r--r--locale/ht/activity.linfo2
-rw-r--r--locale/hu/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 2034 bytes
-rw-r--r--locale/hu/activity.linfo2
-rw-r--r--locale/id/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 575 bytes
-rw-r--r--locale/id/activity.linfo2
-rw-r--r--locale/ig/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 404 bytes
-rw-r--r--locale/ig/activity.linfo2
-rw-r--r--locale/is/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1097 bytes
-rw-r--r--locale/is/activity.linfo2
-rw-r--r--locale/it/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1884 bytes
-rw-r--r--locale/it/activity.linfo2
-rw-r--r--locale/ja/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1895 bytes
-rw-r--r--locale/ja/activity.linfo2
-rw-r--r--locale/km/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1950 bytes
-rw-r--r--locale/km/activity.linfo2
-rw-r--r--locale/ko/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1327 bytes
-rw-r--r--locale/ko/activity.linfo2
-rw-r--r--locale/kos/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 481 bytes
-rw-r--r--locale/kos/activity.linfo2
-rw-r--r--locale/mg/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1919 bytes
-rw-r--r--locale/mg/activity.linfo2
-rw-r--r--locale/mi/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 407 bytes
-rw-r--r--locale/mi/activity.linfo2
-rw-r--r--locale/mk/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1279 bytes
-rw-r--r--locale/mk/activity.linfo2
-rw-r--r--locale/ml/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 404 bytes
-rw-r--r--locale/ml/activity.linfo2
-rw-r--r--locale/mn/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 2093 bytes
-rw-r--r--locale/mn/activity.linfo2
-rw-r--r--locale/mr/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1957 bytes
-rw-r--r--locale/mr/activity.linfo2
-rw-r--r--locale/ms/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 407 bytes
-rw-r--r--locale/ms/activity.linfo2
-rw-r--r--locale/mvo/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 407 bytes
-rw-r--r--locale/mvo/activity.linfo2
-rw-r--r--locale/nb/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1304 bytes
-rw-r--r--locale/nb/activity.linfo2
-rw-r--r--locale/ne/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 2373 bytes
-rw-r--r--locale/ne/activity.linfo2
-rw-r--r--locale/nl/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1866 bytes
-rw-r--r--locale/nl/activity.linfo2
-rw-r--r--locale/pa/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 404 bytes
-rw-r--r--locale/pa/activity.linfo2
-rw-r--r--locale/pap/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1757 bytes
-rw-r--r--locale/pap/activity.linfo2
-rw-r--r--locale/pis/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 407 bytes
-rw-r--r--locale/pis/activity.linfo2
-rw-r--r--locale/pl/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1984 bytes
-rw-r--r--locale/pl/activity.linfo2
-rw-r--r--locale/ps/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1701 bytes
-rw-r--r--locale/ps/activity.linfo2
-rw-r--r--locale/pt/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1939 bytes
-rw-r--r--locale/pt/activity.linfo2
-rw-r--r--locale/pt_BR/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1818 bytes
-rw-r--r--locale/pt_BR/activity.linfo2
-rw-r--r--locale/qu/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 404 bytes
-rw-r--r--locale/qu/activity.linfo2
-rw-r--r--locale/ro/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1395 bytes
-rw-r--r--locale/ro/activity.linfo2
-rw-r--r--locale/ru/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 2042 bytes
-rw-r--r--locale/ru/activity.linfo2
-rw-r--r--locale/rw/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1677 bytes
-rw-r--r--locale/rw/activity.linfo2
-rw-r--r--locale/sd/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 407 bytes
-rw-r--r--locale/sd/activity.linfo2
-rw-r--r--locale/si/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 2095 bytes
-rw-r--r--locale/si/activity.linfo2
-rw-r--r--locale/sk/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1473 bytes
-rw-r--r--locale/sk/activity.linfo2
-rw-r--r--locale/sl/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1592 bytes
-rw-r--r--locale/sl/activity.linfo2
-rw-r--r--locale/sq/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1767 bytes
-rw-r--r--locale/sq/activity.linfo2
-rw-r--r--locale/sv/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1786 bytes
-rw-r--r--locale/sv/activity.linfo2
-rw-r--r--locale/sw/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 504 bytes
-rw-r--r--locale/sw/activity.linfo2
-rw-r--r--locale/ta/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 2695 bytes
-rw-r--r--locale/ta/activity.linfo2
-rw-r--r--locale/te/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 2403 bytes
-rw-r--r--locale/te/activity.linfo2
-rw-r--r--locale/th/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1418 bytes
-rw-r--r--locale/th/activity.linfo2
-rw-r--r--locale/tpi/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 407 bytes
-rw-r--r--locale/tpi/activity.linfo2
-rw-r--r--locale/tr/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1595 bytes
-rw-r--r--locale/tr/activity.linfo2
-rw-r--r--locale/tvl/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 404 bytes
-rw-r--r--locale/tvl/activity.linfo2
-rw-r--r--locale/tzo/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 404 bytes
-rw-r--r--locale/tzo/activity.linfo2
-rw-r--r--locale/ug/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 407 bytes
-rw-r--r--locale/ug/activity.linfo2
-rw-r--r--locale/ur/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1713 bytes
-rw-r--r--locale/ur/activity.linfo2
-rw-r--r--locale/vi/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1782 bytes
-rw-r--r--locale/vi/activity.linfo2
-rw-r--r--locale/wa/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 407 bytes
-rw-r--r--locale/wa/activity.linfo2
-rw-r--r--locale/yo/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 404 bytes
-rw-r--r--locale/yo/activity.linfo2
-rw-r--r--locale/zh_CN/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1469 bytes
-rw-r--r--locale/zh_CN/activity.linfo2
-rw-r--r--locale/zh_TW/LC_MESSAGES/org.laptop.WikipediaActivityEN.mobin0 -> 1800 bytes
-rw-r--r--locale/zh_TW/activity.linfo2
-rwxr-xr-xmwlib-rebuild.sh14
-rwxr-xr-xmwlib/EasyTimeline.pl4718
-rw-r--r--mwlib/Makefile20
-rwxr-xr-xmwlib/__init__.py6
-rw-r--r--mwlib/_expander.cc826
-rw-r--r--mwlib/_expander.re206
-rw-r--r--mwlib/_mwscan.cc1699
-rw-r--r--mwlib/_mwscan.re327
-rw-r--r--mwlib/_version.py9
-rw-r--r--mwlib/advtree.py545
-rw-r--r--mwlib/allnodes.py27
-rw-r--r--mwlib/apps.py378
-rwxr-xr-xmwlib/caller.py20
-rwxr-xr-xmwlib/cdb.py262
-rwxr-xr-xmwlib/cdbwiki.py243
-rw-r--r--mwlib/dummydb.py10
-rwxr-xr-xmwlib/expander.py586
-rwxr-xr-xmwlib/expr.py222
-rwxr-xr-xmwlib/htmlwriter.py447
-rwxr-xr-xmwlib/imgmap.py122
-rwxr-xr-xmwlib/lang.py10
-rw-r--r--mwlib/lang.txt256
-rw-r--r--mwlib/licenses.py185
-rwxr-xr-xmwlib/log.py53
-rwxr-xr-xmwlib/magics.py472
-rwxr-xr-xmwlib/metabook.py119
-rw-r--r--mwlib/mwapidb.py376
-rwxr-xr-xmwlib/mwscan.py315
-rwxr-xr-xmwlib/netdb.py529
-rw-r--r--mwlib/overlay.py22
-rwxr-xr-xmwlib/parser.py1424
-rwxr-xr-xmwlib/recorddb.py83
-rwxr-xr-xmwlib/rendermath.py144
-rw-r--r--mwlib/resources/__init__.py0
-rw-r--r--mwlib/resources/outgoing_link.gifbin0 -> 99 bytes
-rw-r--r--mwlib/resources/pedia.css1250
-rw-r--r--mwlib/sanitychecker.py205
-rwxr-xr-xmwlib/scanfile.py29
-rwxr-xr-xmwlib/scanner.py6
-rwxr-xr-xmwlib/texmap.py95
-rwxr-xr-xmwlib/timeline.py52
-rwxr-xr-xmwlib/uparser.py126
-rw-r--r--mwlib/utils.py112
-rwxr-xr-xmwlib/web.py122
-rwxr-xr-xmwlib/wiki.py135
-rwxr-xr-xmwlib/zipwiki.py167
-rw-r--r--po/Browse.pot156
-rw-r--r--po/Web.pot156
-rw-r--r--po/af.po150
-rw-r--r--po/am.po162
-rw-r--r--po/ar.po222
-rw-r--r--po/ay.po149
-rw-r--r--po/bg.po170
-rw-r--r--po/bi.po149
-rw-r--r--po/bn.po180
-rw-r--r--po/bn_IN.po191
-rw-r--r--po/ca.po174
-rw-r--r--po/cpp.po149
-rw-r--r--po/cs.po150
-rw-r--r--po/da.po176
-rw-r--r--po/de.po256
-rw-r--r--po/dz.po173
-rw-r--r--po/el.po203
-rw-r--r--po/en.po168
-rw-r--r--po/en_US.po191
-rw-r--r--po/es.po234
-rw-r--r--po/fa.po178
-rw-r--r--po/fa_AF.po201
-rw-r--r--po/ff.po149
-rw-r--r--po/fi.po149
-rw-r--r--po/fil.po152
-rw-r--r--po/fr.po213
-rw-r--r--po/gu.po149
-rw-r--r--po/ha.po149
-rw-r--r--po/he.po191
-rw-r--r--po/hi.po184
-rw-r--r--po/ht.po181
-rw-r--r--po/hu.po180
-rw-r--r--po/id.po150
-rw-r--r--po/ig.po149
-rw-r--r--po/is.po172
-rw-r--r--po/it.po195
-rw-r--r--po/ja.po194
-rw-r--r--po/km.po169
-rw-r--r--po/ko.po178
-rw-r--r--po/kos.po150
-rw-r--r--po/mg.po162
-rw-r--r--po/mi.po149
-rw-r--r--po/mk.po185
-rw-r--r--po/ml.po149
-rw-r--r--po/mn.po194
-rw-r--r--po/mr.po175
-rw-r--r--po/ms.po149
-rw-r--r--po/mvo.po149
-rw-r--r--po/nb.po169
-rw-r--r--po/ne.po181
-rw-r--r--po/nl.po196
-rw-r--r--po/pa.po149
-rw-r--r--po/pap.po175
-rw-r--r--po/pis.po149
-rw-r--r--po/pl.po186
-rw-r--r--po/ps.po184
-rw-r--r--po/pt.po211
-rw-r--r--po/pt_BR.po187
-rw-r--r--po/qu.po149
-rw-r--r--po/ro.po178
-rw-r--r--po/ru.po190
-rw-r--r--po/rw.po173
-rw-r--r--po/sd.po149
-rw-r--r--po/si.po181
-rw-r--r--po/sk.po160
-rw-r--r--po/sl.po182
-rw-r--r--po/sq.po168
-rw-r--r--po/sv.po179
-rw-r--r--po/sw.po157
-rw-r--r--po/ta.po178
-rw-r--r--po/te.po173
-rw-r--r--po/th.po175
-rw-r--r--po/tpi.po149
-rw-r--r--po/tr.po177
-rw-r--r--po/tvl.po149
-rw-r--r--po/tzo.po149
-rw-r--r--po/ug.po149
-rw-r--r--po/ur.po182
-rw-r--r--po/vi.po181
-rw-r--r--po/wa.po149
-rw-r--r--po/yo.po149
-rw-r--r--po/zh_CN.po185
-rw-r--r--po/zh_TW.po188
-rw-r--r--pylru.py368
-rw-r--r--searchtoolbar.py87
-rw-r--r--seek-bzip2/Makefile40
-rw-r--r--seek-bzip2/astyle.opts8
-rwxr-xr-xseek-bzip2/bzip-tablebin0 -> 17221 bytes
-rw-r--r--seek-bzip2/bzip-table.c94
-rw-r--r--seek-bzip2/bzip-table.obin0 -> 3112 bytes
-rw-r--r--seek-bzip2/micro-bunzip.c657
-rw-r--r--seek-bzip2/micro-bunzip.h77
-rw-r--r--seek-bzip2/micro-bunzip.obin0 -> 14896 bytes
-rw-r--r--seek-bzip2/micro-bunzip.orig.c632
-rwxr-xr-xseek-bzip2/seek-bunzipbin0 -> 17971 bytes
-rw-r--r--seek-bzip2/seek-bunzip.c95
-rw-r--r--seek-bzip2/seek-bunzip.obin0 -> 3696 bytes
-rwxr-xr-xserver.py993
-rwxr-xr-xsetup.py144
-rwxr-xr-xsetup.py-mwlib71
-rwxr-xr-xsetup_new_wiki.py126
-rw-r--r--static/MathJax/MathJax.js30
-rw-r--r--static/MathJax/TeX-AMS_HTML.js56
-rw-r--r--static/MathJax/default.js606
-rw-r--r--static/MathJax/extensions/FontWarnings.js16
-rw-r--r--static/MathJax/extensions/MathMenu.js16
-rw-r--r--static/MathJax/extensions/MathZoom.js16
-rw-r--r--static/MathJax/extensions/TeX/AMSmath.js16
-rw-r--r--static/MathJax/extensions/TeX/AMSsymbols.js16
-rw-r--r--static/MathJax/extensions/TeX/HTML.js16
-rw-r--r--static/MathJax/extensions/TeX/autobold.js16
-rw-r--r--static/MathJax/extensions/TeX/boldsymbol.js16
-rw-r--r--static/MathJax/extensions/TeX/mathchoice.js16
-rw-r--r--static/MathJax/extensions/TeX/newcommand.js16
-rw-r--r--static/MathJax/extensions/TeX/noErrors.js16
-rw-r--r--static/MathJax/extensions/TeX/noUndefined.js16
-rw-r--r--static/MathJax/extensions/TeX/unicode.js16
-rw-r--r--static/MathJax/extensions/TeX/verb.js16
-rw-r--r--static/MathJax/extensions/jsMath2jax.js16
-rw-r--r--static/MathJax/extensions/mml2jax.js16
-rw-r--r--static/MathJax/extensions/tex2jax.js16
-rw-r--r--static/MathJax/extensions/toMathML.js16
-rw-r--r--static/MathJax/extensions/v1.0-warning.js16
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_AMS-Regular.eotbin0 -> 60356 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Caligraphic-Bold.eotbin0 -> 12476 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Caligraphic-Regular.eotbin0 -> 12340 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Fraktur-Bold.eotbin0 -> 26120 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Fraktur-Regular.eotbin0 -> 25512 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Main-Bold.eotbin0 -> 48572 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Main-Italic.eotbin0 -> 28836 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Main-Regular.eotbin0 -> 49684 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Math-BoldItalic.eotbin0 -> 26330 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Math-Italic.eotbin0 -> 26776 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Math-Regular.eotbin0 -> 26712 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_SansSerif-Bold.eotbin0 -> 21936 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_SansSerif-Italic.eotbin0 -> 19428 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_SansSerif-Regular.eotbin0 -> 16660 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Script-Regular.eotbin0 -> 14604 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Size1-Regular.eotbin0 -> 10372 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Size2-Regular.eotbin0 -> 9676 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Size3-Regular.eotbin0 -> 5728 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Size4-Regular.eotbin0 -> 8484 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Typewriter-Regular.eotbin0 -> 24664 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_WinIE6-Regular.eotbin0 -> 29692 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_AMS-Regular.otfbin0 -> 58528 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Caligraphic-Bold.otfbin0 -> 12348 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Caligraphic-Regular.otfbin0 -> 12024 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Fraktur-Bold.otfbin0 -> 26896 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Fraktur-Regular.otfbin0 -> 25872 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Main-Bold.otfbin0 -> 46808 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Main-Italic.otfbin0 -> 28152 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Main-Regular.otfbin0 -> 47652 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Math-BoldItalic.otfbin0 -> 27096 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Math-Italic.otfbin0 -> 26388 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Math-Regular.otfbin0 -> 26332 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_SansSerif-Bold.otfbin0 -> 22160 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_SansSerif-Italic.otfbin0 -> 18576 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_SansSerif-Regular.otfbin0 -> 15924 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Script-Regular.otfbin0 -> 14620 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Size1-Regular.otfbin0 -> 8248 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Size2-Regular.otfbin0 -> 7604 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Size3-Regular.otfbin0 -> 4712 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Size4-Regular.otfbin0 -> 7364 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Typewriter-Regular.otfbin0 -> 24184 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_WinChrome-Regular.otfbin0 -> 4408 bytes
-rw-r--r--static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_WinIE6-Regular.otfbin0 -> 28096 bytes
-rw-r--r--static/MathJax/jax/element/mml/jax.js16
-rw-r--r--static/MathJax/jax/element/mml/optable/Arrows.js16
-rw-r--r--static/MathJax/jax/element/mml/optable/BasicLatin.js16
-rw-r--r--static/MathJax/jax/element/mml/optable/CombDiacritMarks.js16
-rw-r--r--static/MathJax/jax/element/mml/optable/CombDiactForSymbols.js16
-rw-r--r--static/MathJax/jax/element/mml/optable/Dingbats.js16
-rw-r--r--static/MathJax/jax/element/mml/optable/GeneralPunctuation.js16
-rw-r--r--static/MathJax/jax/element/mml/optable/GeometricShapes.js16
-rw-r--r--static/MathJax/jax/element/mml/optable/GreekAndCoptic.js16
-rw-r--r--static/MathJax/jax/element/mml/optable/Latin1Supplement.js16
-rw-r--r--static/MathJax/jax/element/mml/optable/LetterlikeSymbols.js16
-rw-r--r--static/MathJax/jax/element/mml/optable/MathOperators.js16
-rw-r--r--static/MathJax/jax/element/mml/optable/MiscMathSymbolsA.js16
-rw-r--r--static/MathJax/jax/element/mml/optable/MiscMathSymbolsB.js16
-rw-r--r--static/MathJax/jax/element/mml/optable/MiscTechnical.js16
-rw-r--r--static/MathJax/jax/element/mml/optable/SpacingModLetters.js16
-rw-r--r--static/MathJax/jax/element/mml/optable/SuppMathOperators.js16
-rw-r--r--static/MathJax/jax/element/mml/optable/SupplementalArrowsB.js16
-rw-r--r--static/MathJax/jax/input/MathML/config.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/a.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/b.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/c.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/d.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/e.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/f.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/fr.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/g.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/h.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/i.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/j.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/k.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/l.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/m.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/n.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/o.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/opf.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/p.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/q.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/r.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/s.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/scr.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/t.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/u.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/v.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/w.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/x.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/y.js16
-rw-r--r--static/MathJax/jax/input/MathML/entities/z.js16
-rw-r--r--static/MathJax/jax/input/MathML/jax.js16
-rw-r--r--static/MathJax/jax/input/TeX/config.js16
-rw-r--r--static/MathJax/jax/input/TeX/jax.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/autoload/annotation-xml.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/autoload/maction.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/autoload/menclose.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/autoload/mglyph.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/autoload/mmultiscripts.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/autoload/ms.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/autoload/mtable.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/autoload/multiline.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/config.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/AlphaPresentForms.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Arrows.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/BoldFraktur.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/BoxDrawing.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/CombDiacritMarks.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/CombDiactForSymbols.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/ControlPictures.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/CurrencySymbols.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Cyrillic.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/EnclosedAlphanum.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GeneralPunctuation.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GeometricShapes.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GreekAndCoptic.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GreekBold.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GreekSSBold.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/IPAExtensions.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Latin1Supplement.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LatinExtendedA.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LatinExtendedAdditional.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LatinExtendedB.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LetterlikeSymbols.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MathBold.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MathOperators.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MathSSBold.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscMathSymbolsA.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscMathSymbolsB.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscSymbols.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscTechnical.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/NumberForms.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/PhoneticExtensions.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/SpacingModLetters.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/SuperAndSubscripts.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/SuppMathOperators.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/AlphaPresentForms.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/BasicLatin.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/BoxDrawing.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/CombDiactForSymbols.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/ControlPictures.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/CurrencySymbols.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/Cyrillic.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/EnclosedAlphanum.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GeneralPunctuation.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GreekAndCoptic.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GreekBoldItalic.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GreekSSBoldItalic.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/IPAExtensions.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/Latin1Supplement.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LatinExtendedA.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LatinExtendedAdditional.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LatinExtendedB.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LetterlikeSymbols.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathBoldItalic.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathBoldScript.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathOperators.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathSSItalicBold.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/SpacingModLetters.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/AlphaPresentForms.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/BoxDrawing.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/CombDiactForSymbols.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/ControlPictures.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/CurrencySymbols.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/Cyrillic.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/EnclosedAlphanum.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/GeneralPunctuation.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/GreekAndCoptic.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/GreekItalic.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/IPAExtensions.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/Latin1Supplement.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LatinExtendedA.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LatinExtendedAdditional.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LatinExtendedB.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LetterlikeSymbols.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathItalic.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathOperators.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathSSItalic.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathScript.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/SpacingModLetters.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/ij.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/AlphaPresentForms.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Arrows.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BBBold.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BlockElements.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BoldFraktur.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BoxDrawing.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CJK.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CombDiacritMarks.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CombDiactForSymbols.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/ControlPictures.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CurrencySymbols.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Cyrillic.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Dingbats.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/EnclosedAlphanum.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Fraktur.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GeneralPunctuation.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GeometricShapes.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekAndCoptic.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekBold.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekBoldItalic.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekItalic.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekSSBold.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekSSBoldItalic.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Hiragana.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/IPAExtensions.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Latin1Supplement.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedA.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedAdditional.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedB.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedD.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LetterlikeSymbols.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathBold.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathBoldItalic.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathBoldScript.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathItalic.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathOperators.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSS.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSSBold.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSSItalic.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSSItalicBold.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathScript.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathTT.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscMathSymbolsA.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscMathSymbolsB.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscSymbols.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscSymbolsAndArrows.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscTechnical.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/NumberForms.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/PhoneticExtensions.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SpacingModLetters.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Specials.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SuperAndSubscripts.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SuppMathOperators.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SupplementalArrowsA.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SupplementalArrowsB.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/ij.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsD/Bold/All.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsD/Regular/All.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsD/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsSm/Bold/All.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsSm/Regular/All.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsSm/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUp/Bold/All.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUp/Regular/All.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUp/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpD/Bold/All.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpD/Regular/All.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpD/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpSm/Bold/All.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpSm/Regular/All.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpSm/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Bold/All.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Bold/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Bold/PrivateUse.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/BoldItalic/All.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/BoldItalic/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/BoldItalic/PrivateUse.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Italic/All.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Italic/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Italic/PrivateUse.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Regular/All.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Regular/PrivateUse.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFiveSym/Regular/All.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFiveSym/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFourSym/Bold/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFourSym/Regular/All.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFourSym/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Bold/All.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Bold/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Regular/All.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeThreeSym/Bold/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeThreeSym/Regular/All.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeThreeSym/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeTwoSym/Bold/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeTwoSym/Regular/All.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeTwoSym/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Bold/All.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Bold/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Regular/All.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/fontdata-beta.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/STIX/fontdata.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Arrows.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/BBBold.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/BoxDrawing.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/CombDiacritMarks.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Dingbats.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/EnclosedAlphanum.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GeneralPunctuation.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GeometricShapes.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GreekAndCoptic.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Latin1Supplement.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/LatinExtendedA.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/LetterlikeSymbols.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MathOperators.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscMathSymbolsB.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscSymbols.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscTechnical.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/PUA.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/SpacingModLetters.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/SuppMathOperators.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Caligraphic/Bold/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Caligraphic/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/BasicLatin.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/Other.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/PUA.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/BasicLatin.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/Other.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/PUA.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/Bold/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/BoldItalic/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/Italic/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/Arrows.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/CombDiacritMarks.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/CombDiactForSymbols.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/GeneralPunctuation.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/GeometricShapes.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/Latin1Supplement.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/LatinExtendedA.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/LatinExtendedB.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/LetterlikeSymbols.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MathOperators.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MiscMathSymbolsA.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MiscSymbols.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MiscTechnical.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/SpacingModLetters.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/SuppMathOperators.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/SupplementalArrowsA.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/CombDiacritMarks.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/GeneralPunctuation.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/Latin1Supplement.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/LetterlikeSymbols.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/CombDiacritMarks.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/GeometricShapes.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/MiscSymbols.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/SpacingModLetters.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Math/BoldItalic/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Math/Italic/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/BasicLatin.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/CombDiacritMarks.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/Other.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/BasicLatin.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/CombDiacritMarks.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/Other.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/BasicLatin.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/CombDiacritMarks.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/Other.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Script/Regular/BasicLatin.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Script/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Script/Regular/Other.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Size1/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Size2/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Size3/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Size4/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/BasicLatin.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/CombDiacritMarks.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/Other.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/WinChrome/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/WinIE6/Regular/AMS.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/WinIE6/Regular/Bold.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/WinIE6/Regular/Main.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/fonts/TeX/fontdata.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/imageFonts.js16
-rw-r--r--static/MathJax/jax/output/HTML-CSS/jax.js16
-rw-r--r--static/MathJax/jax/output/NativeMML/config.js16
-rw-r--r--static/MathJax/jax/output/NativeMML/jax.js16
-rw-r--r--static/MathJax/local/local.js37
-rw-r--r--static/MathJax/test/index.html179
-rw-r--r--static/MathJax/test/index2.html131
-rw-r--r--static/MathJax/test/index3.html24
-rw-r--r--static/about_en.html17
-rw-r--r--static/about_es.html8
-rw-r--r--static/about_pl.html18
-rwxr-xr-xstatic/audio.pngbin0 -> 312 bytes
-rw-r--r--static/biology.pngbin0 -> 12873 bytes
-rw-r--r--static/bullet.gifbin0 -> 50 bytes
-rw-r--r--static/common.css538
-rwxr-xr-xstatic/discussionitem_icon.gifbin0 -> 949 bytes
-rwxr-xr-xstatic/document.pngbin0 -> 270 bytes
-rw-r--r--static/earth.pngbin0 -> 21002 bytes
-rw-r--r--static/es-gfdl.html421
-rwxr-xr-xstatic/external.pngbin0 -> 165 bytes
-rwxr-xr-xstatic/file_icon.gifbin0 -> 921 bytes
-rw-r--r--static/headbg.jpgbin0 -> 7881 bytes
-rw-r--r--static/humanities.pngbin0 -> 153948 bytes
-rw-r--r--static/index_en.html255
-rw-r--r--static/index_es.html278
-rw-r--r--static/index_fr.html255
-rw-r--r--static/index_gn.html133
-rw-r--r--static/index_pl.html276
-rw-r--r--static/index_qu.html144
-rw-r--r--static/index_rw.html85
-rwxr-xr-xstatic/link_icon.gifbin0 -> 942 bytes
-rwxr-xr-xstatic/lock_icon.gifbin0 -> 918 bytes
-rw-r--r--static/magnify-clip.pngbin0 -> 237 bytes
-rwxr-xr-xstatic/mail_icon.gifbin0 -> 918 bytes
-rw-r--r--static/math.pngbin0 -> 9866 bytes
-rw-r--r--static/monobook.css1821
-rwxr-xr-xstatic/news_icon.pngbin0 -> 297 bytes
-rw-r--r--static/outgoing_link.gifbin0 -> 99 bytes
-rw-r--r--static/pedia.css1250
-rw-r--r--static/phys_science.pngbin0 -> 17125 bytes
-rwxr-xr-xstatic/required.gifbin0 -> 47 bytes
-rw-r--r--static/shared.css242
-rw-r--r--static/socialscience.pngbin0 -> 4779 bytes
-rw-r--r--static/society.pngbin0 -> 3308 bytes
-rw-r--r--static/styles.css61
-rw-r--r--static/technology.pngbin0 -> 21617 bytes
-rwxr-xr-xstatic/user.gifbin0 -> 932 bytes
-rwxr-xr-xstatic/video.pngbin0 -> 215 bytes
-rw-r--r--static/wikipedia.pngbin0 -> 16286 bytes
-rw-r--r--tools2/HOWTO.txt114
-rw-r--r--tools2/blacklist.txt20
-rwxr-xr-xtools2/clean_selection.py83
-rw-r--r--tools2/config.py28
-rw-r--r--tools2/config_en.py28
-rw-r--r--tools2/config_en_simple.py28
-rw-r--r--tools2/config_es.py28
-rw-r--r--tools2/config_fr.py28
-rw-r--r--tools2/config_gn.py28
-rw-r--r--tools2/config_pl.py28
-rw-r--r--tools2/config_qu.py28
-rw-r--r--tools2/config_rw.py28
-rwxr-xr-xtools2/create_index.py210
-rwxr-xr-xtools2/create_low_rank_pages.py44
-rwxr-xr-xtools2/download_images.py140
-rwxr-xr-xtools2/expandtemplates.py134
-rw-r--r--tools2/favorites.txt431
-rwxr-xr-xtools2/make_ranking.py62
-rwxr-xr-xtools2/make_selection.py522
-rwxr-xr-xtools2/pages_parser.py190
-rwxr-xr-xtools2/remove_from_index.py24
-rw-r--r--tools2/stats_parser.py15
-rwxr-xr-xtools2/test_index.py175
-rwxr-xr-xtools2/test_sql_search.py32
-rw-r--r--use_whoosh_index_to_check_links.diff399
856 files changed, 52937 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..a70b48c
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,8 @@
+OLPC adaptation by:
+* Chris Ball <cjb@laptop.org>
+* Wade Brainerd <wadetb@gmail.com>
+* Benjamin M. Schwartz <bmschwar@fas.harvard.edu>
+* Madeleine Price Ball <mad@printf.net>
+
+Wikipedia On iPhone by Patrick Collison <patrick@collison.ie>
+Some code from bzip2 and the FreeBSD implementation of locate has been used; more details are provided in README
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..90a7493
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,71 @@
+ChangeLog
+
+The different language activities, have different versions according
+to when where builded.
+In this file I summarize the changes in the process to have a log easier
+to follow than the git log.
+
+Version 33.5
+
+*Improve the selection of templates when we use the select_all option
+
+*Control the redirects in the article index
+
+ Now we see as valids the links pointing to redirects,
+ before, many links in the pages, pointing to redirected pages
+ appear in green, when the page is included (but through a redirect)
+
+Version 33.4
+
+*Do not include blacklisted pages in the index
+
+Version 33.3
+
+* Look at the images in the language repository if is not in commons
+
+ In the qu wikipedia, there are images uploaded to a qu namespace
+ instead of the commons namespace. In the wikisource there are not difference
+ then the code try to download it from the language space if was not posible
+ download the thumbnail or the full size image.
+
+Version 33.2
+
+* If the downloaded image is not ok, remove the file
+
+ Wikimedia reply with a html file if the image is not found
+ or can't be scaled to the requested size. If we have this file
+ the activity will show a broken image and not try to download it.
+
+* Use the data directory name to define the language in setup_new_wiki.py
+
+ Then now we should use "es" instead of "es_ES" for the data directory name.
+ This change do easier implement other wikis as simple_en or dialects.
+ In the case of need a es_es and another es_lat activities,
+ we will need rename the activity.info.lang name to be the same than
+ the directory used.
+
+* Identify linktype languages for links with type length 2 or 3
+
+ Before only lenght 2 where identified, but there are language codes
+ with length 3 too.
+
+* Use the first letters in the data directory to identify the language
+
+ Before used th first letters in the xml data file name
+ but does not work with simplewiki for example.
+
+* Recognize images in directories if don't have the xx_xx form
+
+ Until now the data directories where ever with the form xx_xx
+ now we can use more simple directories names to enable us
+ to create for example 'fr', 'es_lat', 'en', or 'en_simple'
+ data directories.
+
+* If needed remove template content to avoid a recursion in the template expansion
+
+ The code search in the template content the template title,
+ to check if there are a possible recursion.
+ First try to replace the title by a error string,
+ if is not possible, drop all the template content.
+ This is not the best solution, but mwlib can't manage theses cases.
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..d511905
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/NEWS b/NEWS
new file mode 100755
index 0000000..0ad7d5a
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,49 @@
+10
+
+* Attempt to solve thread closing problems via Thread.setDaemon(True).
+
+9
+
+* Remove inappropriate images.
+* Fix math rendering.
+
+8
+
+* Don't return template pages in search results.
+* Translate "Search results for.." to Spanish.
+* Add a copy of Web's translations, for the browser UI.
+
+7
+
+* Switch to mathml via blahtex for rendering math.
+* Use xpcom to turn off "offline mode" detection
+* Switch to rsvg for SVG processing,
+
+6
+
+* Use xpcom to set a 5M RAM cache limit, avoiding OOM crashes.
+* Fix template blacklisting code.
+* New CSS file.
+
+5
+
+* Fix crashers
+* Use threads to handle synchronizing startup/exit for client<->server
+* Add links to report rendering problems and inappropriate content.
+
+4
+
+* Reorganize directory structure.
+
+3
+
+* Add link-checking -- links not present in the index are in green.
+* Add portal page by Madeleine Price Ball.
+
+2
+
+* Added search toolbar to activity toolbar.
+
+1
+
+* Preview release of activity wrapper for wikiserver.
diff --git a/activity.py b/activity.py
new file mode 100644
index 0000000..43b430a
--- /dev/null
+++ b/activity.py
@@ -0,0 +1,103 @@
+# Copyright (C) 2007, One Laptop Per Child
+# -*- coding: utf-8 -*-
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+from gettext import gettext as _
+
+import os
+import sys
+import server
+import logging
+
+USE_GTK2 = False
+try:
+ from sugar3.graphics.toolbarbox import ToolbarBox, ToolbarButton
+except ImportError:
+ from sugar.graphics.toolbarbox import ToolbarBox, ToolbarButton
+ USE_GTK2 = True
+
+#from sugar.activity import registry
+#activity_info = registry.get_registry().get_activity('org.laptop.WebActivity')
+
+#sys.path.append(activity_info.path)
+if os.path.exists('../Browse.activity'):
+ sys.path.append('../Browse.activity')
+elif os.path.exists('/usr/share/sugar/activities/Browse.activity'):
+ sys.path.append('/usr/share/sugar/activities/Browse.activity')
+else:
+ print 'This activity need a Browser activity installed to run'
+
+import webactivity
+
+from searchtoolbar import SearchToolbar
+
+
+# Activity class, extends WebActivity.
+class WikipediaActivity(webactivity.WebActivity):
+ def __init__(self, handle):
+
+ logging.error("Starting server database: %s port: %s" %
+ (self.confvars['path'], self.confvars['port']))
+
+ os.chdir(os.environ['SUGAR_BUNDLE_PATH'])
+
+ server.run_server(self.confvars)
+
+ handle.uri = 'http://localhost:%s%s' % (self.confvars['port'],
+ self.confvars['home_page'])
+
+ webactivity.WebActivity.__init__(self, handle)
+
+ if USE_GTK2:
+ # Use xpcom to set a RAM cache limit. (Trac #7081.)
+ from xpcom import components
+ from xpcom.components import interfaces
+ cls = components.classes['@mozilla.org/preferences-service;1']
+ pref_service = cls.getService(interfaces.nsIPrefService)
+ branch = pref_service.getBranch("browser.cache.memory.")
+ branch.setIntPref("capacity", "5000")
+
+ # Use xpcom to turn off "offline mode" detection, which disables
+ # access to localhost for no good reason. (Trac #6250.)
+ ios_class = components.classes["@mozilla.org/network/io-service;1"]
+ io_service = ios_class.getService(interfaces.nsIIOService2)
+ io_service.manageOfflineStatus = False
+
+ self.searchtoolbar = SearchToolbar(self)
+ search_toolbar_button = ToolbarButton()
+ search_toolbar_button.set_page(self.searchtoolbar)
+ search_toolbar_button.props.icon_name = 'search-wiki'
+ search_toolbar_button.props.label = _('Search')
+ self.get_toolbar_box().toolbar.insert(search_toolbar_button, 1)
+ search_toolbar_button.show()
+ # Hide add-tabs button
+ if hasattr(self._primary_toolbar, '_add_tab'):
+ self._primary_toolbar._add_tab.hide()
+
+ self.searchtoolbar.show()
+
+ def _get_browser(self):
+ if hasattr(self, '_browser'):
+ # Browse < 109
+ return self._browser
+ else:
+ return self._tabbed_view.props.current_browser
+
+ def _go_home_button_cb(self, button):
+ home_url = 'http://localhost:%s%s' % (self.confvars['port'],
+ self.confvars['home_page'])
+ browser = self._get_browser()
+ browser.load_uri(home_url)
diff --git a/activity/activity-wikipedia-en-simple.png b/activity/activity-wikipedia-en-simple.png
new file mode 100644
index 0000000..c80dc8d
--- /dev/null
+++ b/activity/activity-wikipedia-en-simple.png
Binary files differ
diff --git a/activity/activity-wikipedia-en-simple.svg b/activity/activity-wikipedia-en-simple.svg
new file mode 100644
index 0000000..ece63cb
--- /dev/null
+++ b/activity/activity-wikipedia-en-simple.svg
@@ -0,0 +1,67 @@
+<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
+ <!ENTITY stroke_color "#000">
+ <!ENTITY fill_color "#eee">
+]>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ width="55"
+ height="55"
+ viewBox="0 0 55 55"
+ id="svg3051">
+ <metadata
+ id="metadata3069">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="g3787">
+ <path
+ d="m 27.904,11.023 -0.002,0 c 0,-0.002 -1.71,-2.053 -9.376,-2.504 C 10.86,8.07 6.843,10.121 6.84,10.122 4.942,10.741 3.345,11.857 3.345,13.616 l 0,27.702 c 0,2.025 1.235,3.494 3.495,3.494 0.003,0 4.41,-1.35 10.004,-1.35 5.589,-0.001 11.061,2.253 11.061,2.253"
+ id="path3053"
+ style="fill:&fill_color;;stroke:&stroke_color;;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round" />
+ <path
+ d="m 27.898,11.023 0,0 c 0,-0.002 1.715,-2.053 9.377,-2.504 7.668,-0.449 11.686,1.602 11.688,1.603 1.897,0.619 3.494,1.735 3.494,3.494 l 0,27.702 c 0,2.025 -1.233,3.494 -3.494,3.494 -0.003,0 -4.409,-1.35 -10.004,-1.35 -5.589,-0.001 -11.062,2.253 -11.062,2.253"
+ id="path3055"
+ style="fill:&fill_color;;stroke:&stroke_color;;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round" />
+ </g>
+ <path
+ d="m 38.342545,29.719034 c 0,0.06481 -0.02479,0.123319 -0.07247,0.177052 -0.04962,0.05221 -0.10108,0.07906 -0.16024,0.07906 -0.474902,0.03796 -0.865859,0.164455 -1.167212,0.381036 -0.30324,0.215017 -0.61413,0.627676 -0.936442,1.234763 l -4.920633,9.192045 c -0.03238,0.08535 -0.12204,0.128055 -0.270803,0.128055 -0.116329,0 -0.205985,-0.0427 -0.270804,-0.128055 l -2.759757,-4.784152 -3.173613,4.784152 c -0.06487,0.08535 -0.154475,0.128055 -0.270856,0.128055 -0.141113,0 -0.234543,-0.0427 -0.28034,-0.128055 l -4.834801,-9.192045 c -0.301354,-0.570729 -0.619841,-0.969141 -0.955517,-1.195235 -0.333763,-0.226093 -0.801035,-0.366789 -1.397993,-0.420564 -0.05149,0 -0.10108,-0.02211 -0.144949,-0.06798 -0.04577,-0.04426 -0.06866,-0.09643 -0.06866,-0.154943 0,-0.150165 0.05149,-0.224487 0.154486,-0.224487 0.431033,0 0.881134,0.01581 1.352216,0.04743 0.43675,0.03319 0.84872,0.049 1.233965,0.049 0.392896,0 0.856323,-0.01581 1.390385,-0.049 0.558795,-0.03162 1.054657,-0.04743 1.485701,-0.04743 0.103018,0 0.154475,0.07432 0.154475,0.224487 0,0.148644 -0.03238,0.222923 -0.09537,0.222923 -0.430991,0.02689 -0.770491,0.118585 -1.018449,0.271964 -0.247905,0.154943 -0.371883,0.357276 -0.371883,0.608693 0,0.128055 0.05151,0.287732 0.154475,0.479033 l 3.995614,7.479771 2.267719,-3.550953 -2.113244,-3.672709 c -0.379534,-0.654521 -0.69231,-1.078256 -0.936442,-1.267949 -0.24408,-0.188173 -0.614077,-0.305151 -1.109992,-0.34785 -0.04574,0 -0.08772,-0.02211 -0.12969,-0.06798 -0.04197,-0.04426 -0.06293,-0.09643 -0.06293,-0.154943 0,-0.150165 0.04386,-0.224487 0.135403,-0.224487 0.431043,0 0.825825,0.01581 1.186286,0.04743 0.34715,0.03319 0.717147,0.049 1.110043,0.049 0.385246,0 0.793391,-0.01581 1.224434,-0.049 0.444353,-0.03162 0.881107,-0.04743 1.312151,-0.04743 0.102966,0 0.154476,0.07432 0.154476,0.224487 0,0.148644 -0.0305,0.222923 -0.09537,0.222923 -0.862034,0.04904 -1.293077,0.251374 -1.293077,0.608694 0,0.159677 0.09919,0.407924 0.299414,0.74309 l 1.397982,2.352547 1.390385,-2.151777 c 0.192623,-0.303544 0.289877,-0.559654 0.289877,-0.768372 0,-0.490108 -0.430991,-0.750953 -1.293077,-0.784182 -0.07818,0 -0.116328,-0.07428 -0.116328,-0.222923 0,-0.05373 0.01907,-0.104337 0.05722,-0.151772 0.04004,-0.049 0.07818,-0.07271 0.116328,-0.07271 0.308951,0 0.688485,0.01581 1.138602,0.04743 0.431043,0.03319 0.785792,0.049 1.062308,0.049 0.198386,0 0.492089,-0.01421 0.877335,-0.0411 0.488264,-0.03635 0.898294,-0.05534 1.226372,-0.05534 0.07624,0 0.114389,0.06325 0.114389,0.1913 0,0.170754 -0.07053,0.256109 -0.211696,0.256109 -0.501574,0.0427 -0.905893,0.158114 -1.211071,0.344679 -0.305179,0.186566 -0.686599,0.610257 -1.142428,1.27112 l -1.853811,2.841093 2.509913,4.238703 3.705736,-7.143041 c 0.127751,-0.260844 0.192622,-0.501142 0.192622,-0.71933 0,-0.523338 -0.431043,-0.799994 -1.293129,-0.833224 -0.07818,0 -0.116328,-0.07428 -0.116328,-0.222923 0,-0.150164 0.05722,-0.224486 0.173549,-0.224486 0.314715,0 0.688537,0.01581 1.119528,0.04743 0.398608,0.03319 0.734283,0.049 1.0032,0.049 0.284218,0 0.612244,-0.01581 0.984127,-0.049 0.387184,-0.03162 0.734283,-0.04743 1.043286,-0.04743 0.0896,0 0.135402,0.06325 0.135402,0.1913 z"
+ id="path3061"
+ style="fill:&stroke_color;;stroke:none" />
+ <text
+ x="7.0116453"
+ y="21.294743"
+ transform="scale(0.83040932,1.1042254)"
+ id="text3841-9"
+ xml:space="preserve"
+ style="font-size:13.49201965px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:&stroke_color;;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"><tspan
+ x="7.0116453"
+ y="21.294743"
+ id="tspan3843-6">Simple</tspan></text>
+ <path
+ d="m 50.74074,42.314816 a 10.555555,10.092592 0 1 1 -21.111111,0 10.555555,10.092592 0 1 1 21.111111,0 z"
+ transform="translate(1.1623333,0.20291499)"
+ id="path3071"
+ style="fill:#ffffff;fill-opacity:1;stroke:&stroke_color;;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <text
+ x="33.744976"
+ y="46.162754"
+ id="text3841"
+ xml:space="preserve"
+ style="font-size:10px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:&stroke_color;;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"><tspan
+ x="33.744976"
+ y="46.162754"
+ id="tspan3843">EN</tspan></text>
+</svg>
diff --git a/activity/activity-wikipedia-en.svg b/activity/activity-wikipedia-en.svg
new file mode 100644
index 0000000..2567806
--- /dev/null
+++ b/activity/activity-wikipedia-en.svg
@@ -0,0 +1,90 @@
+<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
+ <!ENTITY stroke_color "#000">
+ <!ENTITY fill_color "#eee">
+]>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ height="55px"
+ viewBox="0 0 55 55"
+ width="55px"
+ id="svg3051"
+ version="1.1"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="activity-wikipedia-es.svg">
+ <metadata
+ id="metadata3069">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs3067" />
+ <path
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ stroke-width="3.5"
+ stroke="&stroke_color;"
+ fill="&fill_color;"
+ d="M 27.904 11.023 L 27.902 11.023 C 27.902 11.021 26.192 8.97 18.526 8.519 C 10.86 8.07 6.843 10.121 6.84 10.122 C 4.942 10.741 3.345 11.857 3.345 13.616 L 3.345 41.318 C 3.345 43.343 4.58 44.812 6.84 44.812 C 6.843 44.812 11.25 43.462 16.844 43.462 C 22.433 43.461 27.905 45.715 27.905 45.715 "
+ id="path3053" />
+ <path
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ stroke-width="3.5"
+ stroke="&stroke_color;"
+ fill="&fill_color;"
+ d="M 27.898 11.023 L 27.898 11.023 C 27.898 11.021 29.613 8.97 37.275 8.519 C 44.943 8.07 48.961 10.121 48.963 10.122 C 50.86 10.741 52.457 11.857 52.457 13.616 L 52.457 41.318 C 52.457 43.343 51.224 44.812 48.963 44.812 C 48.96 44.812 44.554 43.462 38.959 43.462 C 33.37 43.461 27.897 45.715 27.897 45.715 "
+ id="path3055" />
+ <path
+ d="M 27.7747 10.8997 L 28.0233 11.1407 "
+ fill="none"
+ id="path3057" />
+ <path
+ d="m 45.121865,41.417371 c 0,0 -0.031,2.906 -4.666,2.906 -4.632,0 -4.663,-2.906 -4.663,-2.906"
+ id="path3059"
+ inkscape:connector-curvature="0"
+ style="fill:none" />
+ <path
+ d="M 48.3856 14.3653 C 48.3856 14.5145 48.3383 14.6492 48.2473 14.7729 C 48.1526 14.8931 48.0544 14.9549 47.9415 14.9549 C 47.0352 15.0423 46.2891 15.3335 45.714 15.8321 C 45.1353 16.3271 44.542 17.2771 43.9269 18.6747 L 34.5364 39.8361 C 34.4746 40.0326 34.3035 40.1309 34.0196 40.1309 C 33.7976 40.1309 33.6265 40.0326 33.5028 39.8361 L 28.2361 28.8223 L 22.1796 39.8361 C 22.0558 40.0326 21.8848 40.1309 21.6627 40.1309 C 21.3934 40.1309 21.2151 40.0326 21.1277 39.8361 L 11.901 18.6747 C 11.3259 17.3608 10.7181 16.4436 10.0775 15.9231 C 9.44055 15.4026 8.54881 15.0787 7.40958 14.9549 C 7.31131 14.9549 7.21668 14.904 7.13296 14.7984 C 7.04561 14.6965 7.00193 14.5764 7.00193 14.4417 C 7.00193 14.096 7.1002 13.9249 7.29675 13.9249 C 8.11933 13.9249 8.9783 13.9613 9.87731 14.0341 C 10.7108 14.1105 11.497 14.1469 12.2322 14.1469 C 12.982 14.1469 13.8664 14.1105 14.8856 14.0341 C 15.952 13.9613 16.8983 13.9249 17.7209 13.9249 C 17.9175 13.9249 18.0157 14.096 18.0157 14.4417 C 18.0157 14.7839 17.9539 14.9549 17.8337 14.9549 C 17.0112 15.0168 16.3633 15.2279 15.8901 15.581 C 15.417 15.9377 15.1804 16.4035 15.1804 16.9823 C 15.1804 17.2771 15.2787 17.6447 15.4752 18.0851 L 23.1004 35.3046 L 27.4281 27.1298 L 23.3952 18.6747 C 22.6709 17.1679 22.074 16.1924 21.6081 15.7557 C 21.1423 15.3225 20.4362 15.0532 19.4898 14.9549 C 19.4025 14.9549 19.3224 14.904 19.2423 14.7984 C 19.1622 14.6965 19.1222 14.5764 19.1222 14.4417 C 19.1222 14.096 19.2059 13.9249 19.3806 13.9249 C 20.2032 13.9249 20.9566 13.9613 21.6445 14.0341 C 22.307 14.1105 23.0131 14.1469 23.7629 14.1469 C 24.4981 14.1469 25.277 14.1105 26.0996 14.0341 C 26.9476 13.9613 27.7811 13.9249 28.6037 13.9249 C 28.8002 13.9249 28.8985 14.096 28.8985 14.4417 C 28.8985 14.7839 28.8403 14.9549 28.7165 14.9549 C 27.0714 15.0678 26.2488 15.5336 26.2488 16.3562 C 26.2488 16.7238 26.4381 17.2953 26.8202 18.0669 L 29.4881 23.4828 L 32.1415 18.5291 C 32.5091 17.8303 32.6947 17.2407 32.6947 16.7602 C 32.6947 15.6319 31.8722 15.0314 30.227 14.9549 C 30.0778 14.9549 30.005 14.7839 30.005 14.4417 C 30.005 14.318 30.0414 14.2015 30.1142 14.0923 C 30.1906 13.9795 30.2634 13.9249 30.3362 13.9249 C 30.9258 13.9249 31.6501 13.9613 32.5091 14.0341 C 33.3317 14.1105 34.0087 14.1469 34.5364 14.1469 C 34.915 14.1469 35.4755 14.1142 36.2107 14.0523 C 37.1425 13.9686 37.925 13.9249 38.5511 13.9249 C 38.6966 13.9249 38.7694 14.0705 38.7694 14.3653 C 38.7694 14.7584 38.6348 14.9549 38.3654 14.9549 C 37.4082 15.0532 36.6366 15.3189 36.0542 15.7484 C 35.4718 16.1779 34.7439 17.1533 33.874 18.6747 L 30.3362 25.2153 L 35.1261 34.9734 L 42.1981 18.5291 C 42.4419 17.9286 42.5657 17.3754 42.5657 16.8731 C 42.5657 15.6683 41.7431 15.0314 40.0979 14.9549 C 39.9487 14.9549 39.8759 14.7839 39.8759 14.4417 C 39.8759 14.096 39.9851 13.9249 40.2071 13.9249 C 40.8077 13.9249 41.5211 13.9613 42.3436 14.0341 C 43.1043 14.1105 43.7449 14.1469 44.2581 14.1469 C 44.8005 14.1469 45.4265 14.1105 46.1362 14.0341 C 46.8751 13.9613 47.5375 13.9249 48.1272 13.9249 C 48.2982 13.9249 48.3856 14.0705 48.3856 14.3653 Z "
+ fill="&stroke_color;"
+ stroke="none"
+ id="path3061" />
+ <path
+ d="m 40.450865,40.212071 0.013,5.3166"
+ id="path3063"
+ inkscape:connector-curvature="0"
+ style="fill:none" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#ffffff;fill-opacity:1;stroke:&stroke_color;;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3071"
+ sodipodi:cx="40.185184"
+ sodipodi:cy="42.314816"
+ sodipodi:rx="10.555555"
+ sodipodi:ry="10.092592"
+ d="m 50.74074,42.314816 a 10.555555,10.092592 0 1 1 -21.111111,0 10.555555,10.092592 0 1 1 21.111111,0 z"
+ transform="translate(0.27218073,0.55555556)" />
+ <text
+ xml:space="preserve"
+ style="font-size:10px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:&stroke_color;;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
+ x="32.854824"
+ y="46.515392"
+ id="text3841"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3843"
+ x="32.854824"
+ y="46.515392">EN</tspan></text>
+</svg>
diff --git a/activity/activity-wikipedia-es.svg b/activity/activity-wikipedia-es.svg
new file mode 100644
index 0000000..e8e2232
--- /dev/null
+++ b/activity/activity-wikipedia-es.svg
@@ -0,0 +1,90 @@
+<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
+ <!ENTITY stroke_color "#000">
+ <!ENTITY fill_color "#eee">
+]>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ height="55px"
+ viewBox="0 0 55 55"
+ width="55px"
+ id="svg3051"
+ version="1.1"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="activity-wikipedia.svg">
+ <metadata
+ id="metadata3069">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs3067" />
+ <path
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ stroke-width="3.5"
+ stroke="&stroke_color;"
+ fill="&fill_color;"
+ d="M 27.904 11.023 L 27.902 11.023 C 27.902 11.021 26.192 8.97 18.526 8.519 C 10.86 8.07 6.843 10.121 6.84 10.122 C 4.942 10.741 3.345 11.857 3.345 13.616 L 3.345 41.318 C 3.345 43.343 4.58 44.812 6.84 44.812 C 6.843 44.812 11.25 43.462 16.844 43.462 C 22.433 43.461 27.905 45.715 27.905 45.715 "
+ id="path3053" />
+ <path
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ stroke-width="3.5"
+ stroke="&stroke_color;"
+ fill="&fill_color;"
+ d="M 27.898 11.023 L 27.898 11.023 C 27.898 11.021 29.613 8.97 37.275 8.519 C 44.943 8.07 48.961 10.121 48.963 10.122 C 50.86 10.741 52.457 11.857 52.457 13.616 L 52.457 41.318 C 52.457 43.343 51.224 44.812 48.963 44.812 C 48.96 44.812 44.554 43.462 38.959 43.462 C 33.37 43.461 27.897 45.715 27.897 45.715 "
+ id="path3055" />
+ <path
+ d="M 27.7747 10.8997 L 28.0233 11.1407 "
+ fill="none"
+ id="path3057" />
+ <path
+ d="m 32.010444,44.830556 c 0,0 -0.031,2.906 -4.666,2.906 -4.632,0 -4.663,-2.906 -4.663,-2.906"
+ id="path3059"
+ inkscape:connector-curvature="0"
+ style="fill:none" />
+ <path
+ d="M 48.3856 14.3653 C 48.3856 14.5145 48.3383 14.6492 48.2473 14.7729 C 48.1526 14.8931 48.0544 14.9549 47.9415 14.9549 C 47.0352 15.0423 46.2891 15.3335 45.714 15.8321 C 45.1353 16.3271 44.542 17.2771 43.9269 18.6747 L 34.5364 39.8361 C 34.4746 40.0326 34.3035 40.1309 34.0196 40.1309 C 33.7976 40.1309 33.6265 40.0326 33.5028 39.8361 L 28.2361 28.8223 L 22.1796 39.8361 C 22.0558 40.0326 21.8848 40.1309 21.6627 40.1309 C 21.3934 40.1309 21.2151 40.0326 21.1277 39.8361 L 11.901 18.6747 C 11.3259 17.3608 10.7181 16.4436 10.0775 15.9231 C 9.44055 15.4026 8.54881 15.0787 7.40958 14.9549 C 7.31131 14.9549 7.21668 14.904 7.13296 14.7984 C 7.04561 14.6965 7.00193 14.5764 7.00193 14.4417 C 7.00193 14.096 7.1002 13.9249 7.29675 13.9249 C 8.11933 13.9249 8.9783 13.9613 9.87731 14.0341 C 10.7108 14.1105 11.497 14.1469 12.2322 14.1469 C 12.982 14.1469 13.8664 14.1105 14.8856 14.0341 C 15.952 13.9613 16.8983 13.9249 17.7209 13.9249 C 17.9175 13.9249 18.0157 14.096 18.0157 14.4417 C 18.0157 14.7839 17.9539 14.9549 17.8337 14.9549 C 17.0112 15.0168 16.3633 15.2279 15.8901 15.581 C 15.417 15.9377 15.1804 16.4035 15.1804 16.9823 C 15.1804 17.2771 15.2787 17.6447 15.4752 18.0851 L 23.1004 35.3046 L 27.4281 27.1298 L 23.3952 18.6747 C 22.6709 17.1679 22.074 16.1924 21.6081 15.7557 C 21.1423 15.3225 20.4362 15.0532 19.4898 14.9549 C 19.4025 14.9549 19.3224 14.904 19.2423 14.7984 C 19.1622 14.6965 19.1222 14.5764 19.1222 14.4417 C 19.1222 14.096 19.2059 13.9249 19.3806 13.9249 C 20.2032 13.9249 20.9566 13.9613 21.6445 14.0341 C 22.307 14.1105 23.0131 14.1469 23.7629 14.1469 C 24.4981 14.1469 25.277 14.1105 26.0996 14.0341 C 26.9476 13.9613 27.7811 13.9249 28.6037 13.9249 C 28.8002 13.9249 28.8985 14.096 28.8985 14.4417 C 28.8985 14.7839 28.8403 14.9549 28.7165 14.9549 C 27.0714 15.0678 26.2488 15.5336 26.2488 16.3562 C 26.2488 16.7238 26.4381 17.2953 26.8202 18.0669 L 29.4881 23.4828 L 32.1415 18.5291 C 32.5091 17.8303 32.6947 17.2407 32.6947 16.7602 C 32.6947 15.6319 31.8722 15.0314 30.227 14.9549 C 30.0778 14.9549 30.005 14.7839 30.005 14.4417 C 30.005 14.318 30.0414 14.2015 30.1142 14.0923 C 30.1906 13.9795 30.2634 13.9249 30.3362 13.9249 C 30.9258 13.9249 31.6501 13.9613 32.5091 14.0341 C 33.3317 14.1105 34.0087 14.1469 34.5364 14.1469 C 34.915 14.1469 35.4755 14.1142 36.2107 14.0523 C 37.1425 13.9686 37.925 13.9249 38.5511 13.9249 C 38.6966 13.9249 38.7694 14.0705 38.7694 14.3653 C 38.7694 14.7584 38.6348 14.9549 38.3654 14.9549 C 37.4082 15.0532 36.6366 15.3189 36.0542 15.7484 C 35.4718 16.1779 34.7439 17.1533 33.874 18.6747 L 30.3362 25.2153 L 35.1261 34.9734 L 42.1981 18.5291 C 42.4419 17.9286 42.5657 17.3754 42.5657 16.8731 C 42.5657 15.6683 41.7431 15.0314 40.0979 14.9549 C 39.9487 14.9549 39.8759 14.7839 39.8759 14.4417 C 39.8759 14.096 39.9851 13.9249 40.2071 13.9249 C 40.8077 13.9249 41.5211 13.9613 42.3436 14.0341 C 43.1043 14.1105 43.7449 14.1469 44.2581 14.1469 C 44.8005 14.1469 45.4265 14.1105 46.1362 14.0341 C 46.8751 13.9613 47.5375 13.9249 48.1272 13.9249 C 48.2982 13.9249 48.3856 14.0705 48.3856 14.3653 Z "
+ fill="&stroke_color;"
+ stroke="none"
+ id="path3061" />
+ <path
+ d="m 39.504564,40.212072 0.013,5.3166"
+ id="path3063"
+ inkscape:connector-curvature="0"
+ style="fill:none" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#ffffff;fill-opacity:1;stroke:&stroke_color;;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3071"
+ sodipodi:cx="40.185184"
+ sodipodi:cy="42.314816"
+ sodipodi:rx="10.555555"
+ sodipodi:ry="10.092592"
+ d="m 50.74074,42.314816 a 10.555555,10.092592 0 1 1 -21.111111,0 10.555555,10.092592 0 1 1 21.111111,0 z"
+ transform="translate(-0.67412013,0.55555556)" />
+ <text
+ xml:space="preserve"
+ style="font-size:10px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:&stroke_color;;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
+ x="32.399246"
+ y="46.510509"
+ id="text3841"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3843"
+ x="32.399246"
+ y="46.510509">ES</tspan></text>
+</svg>
diff --git a/activity/activity-wikipedia-fr.png b/activity/activity-wikipedia-fr.png
new file mode 100644
index 0000000..8dfa179
--- /dev/null
+++ b/activity/activity-wikipedia-fr.png
Binary files differ
diff --git a/activity/activity-wikipedia-fr.svg b/activity/activity-wikipedia-fr.svg
new file mode 100644
index 0000000..0f75591
--- /dev/null
+++ b/activity/activity-wikipedia-fr.svg
@@ -0,0 +1,90 @@
+<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
+ <!ENTITY stroke_color "#000">
+ <!ENTITY fill_color "#eee">
+]>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ height="55px"
+ viewBox="0 0 55 55"
+ width="55px"
+ id="svg3051"
+ version="1.1"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="activity-wikipedia.svg">
+ <metadata
+ id="metadata3069">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs3067" />
+ <path
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ stroke-width="3.5"
+ stroke="&stroke_color;"
+ fill="&fill_color;"
+ d="M 27.904 11.023 L 27.902 11.023 C 27.902 11.021 26.192 8.97 18.526 8.519 C 10.86 8.07 6.843 10.121 6.84 10.122 C 4.942 10.741 3.345 11.857 3.345 13.616 L 3.345 41.318 C 3.345 43.343 4.58 44.812 6.84 44.812 C 6.843 44.812 11.25 43.462 16.844 43.462 C 22.433 43.461 27.905 45.715 27.905 45.715 "
+ id="path3053" />
+ <path
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ stroke-width="3.5"
+ stroke="&stroke_color;"
+ fill="&fill_color;"
+ d="M 27.898 11.023 L 27.898 11.023 C 27.898 11.021 29.613 8.97 37.275 8.519 C 44.943 8.07 48.961 10.121 48.963 10.122 C 50.86 10.741 52.457 11.857 52.457 13.616 L 52.457 41.318 C 52.457 43.343 51.224 44.812 48.963 44.812 C 48.96 44.812 44.554 43.462 38.959 43.462 C 33.37 43.461 27.897 45.715 27.897 45.715 "
+ id="path3055" />
+ <path
+ d="M 27.7747 10.8997 L 28.0233 11.1407 "
+ fill="none"
+ id="path3057" />
+ <path
+ d="m 32.010444,44.830556 c 0,0 -0.031,2.906 -4.666,2.906 -4.632,0 -4.663,-2.906 -4.663,-2.906"
+ id="path3059"
+ inkscape:connector-curvature="0"
+ style="fill:none" />
+ <path
+ d="M 48.3856 14.3653 C 48.3856 14.5145 48.3383 14.6492 48.2473 14.7729 C 48.1526 14.8931 48.0544 14.9549 47.9415 14.9549 C 47.0352 15.0423 46.2891 15.3335 45.714 15.8321 C 45.1353 16.3271 44.542 17.2771 43.9269 18.6747 L 34.5364 39.8361 C 34.4746 40.0326 34.3035 40.1309 34.0196 40.1309 C 33.7976 40.1309 33.6265 40.0326 33.5028 39.8361 L 28.2361 28.8223 L 22.1796 39.8361 C 22.0558 40.0326 21.8848 40.1309 21.6627 40.1309 C 21.3934 40.1309 21.2151 40.0326 21.1277 39.8361 L 11.901 18.6747 C 11.3259 17.3608 10.7181 16.4436 10.0775 15.9231 C 9.44055 15.4026 8.54881 15.0787 7.40958 14.9549 C 7.31131 14.9549 7.21668 14.904 7.13296 14.7984 C 7.04561 14.6965 7.00193 14.5764 7.00193 14.4417 C 7.00193 14.096 7.1002 13.9249 7.29675 13.9249 C 8.11933 13.9249 8.9783 13.9613 9.87731 14.0341 C 10.7108 14.1105 11.497 14.1469 12.2322 14.1469 C 12.982 14.1469 13.8664 14.1105 14.8856 14.0341 C 15.952 13.9613 16.8983 13.9249 17.7209 13.9249 C 17.9175 13.9249 18.0157 14.096 18.0157 14.4417 C 18.0157 14.7839 17.9539 14.9549 17.8337 14.9549 C 17.0112 15.0168 16.3633 15.2279 15.8901 15.581 C 15.417 15.9377 15.1804 16.4035 15.1804 16.9823 C 15.1804 17.2771 15.2787 17.6447 15.4752 18.0851 L 23.1004 35.3046 L 27.4281 27.1298 L 23.3952 18.6747 C 22.6709 17.1679 22.074 16.1924 21.6081 15.7557 C 21.1423 15.3225 20.4362 15.0532 19.4898 14.9549 C 19.4025 14.9549 19.3224 14.904 19.2423 14.7984 C 19.1622 14.6965 19.1222 14.5764 19.1222 14.4417 C 19.1222 14.096 19.2059 13.9249 19.3806 13.9249 C 20.2032 13.9249 20.9566 13.9613 21.6445 14.0341 C 22.307 14.1105 23.0131 14.1469 23.7629 14.1469 C 24.4981 14.1469 25.277 14.1105 26.0996 14.0341 C 26.9476 13.9613 27.7811 13.9249 28.6037 13.9249 C 28.8002 13.9249 28.8985 14.096 28.8985 14.4417 C 28.8985 14.7839 28.8403 14.9549 28.7165 14.9549 C 27.0714 15.0678 26.2488 15.5336 26.2488 16.3562 C 26.2488 16.7238 26.4381 17.2953 26.8202 18.0669 L 29.4881 23.4828 L 32.1415 18.5291 C 32.5091 17.8303 32.6947 17.2407 32.6947 16.7602 C 32.6947 15.6319 31.8722 15.0314 30.227 14.9549 C 30.0778 14.9549 30.005 14.7839 30.005 14.4417 C 30.005 14.318 30.0414 14.2015 30.1142 14.0923 C 30.1906 13.9795 30.2634 13.9249 30.3362 13.9249 C 30.9258 13.9249 31.6501 13.9613 32.5091 14.0341 C 33.3317 14.1105 34.0087 14.1469 34.5364 14.1469 C 34.915 14.1469 35.4755 14.1142 36.2107 14.0523 C 37.1425 13.9686 37.925 13.9249 38.5511 13.9249 C 38.6966 13.9249 38.7694 14.0705 38.7694 14.3653 C 38.7694 14.7584 38.6348 14.9549 38.3654 14.9549 C 37.4082 15.0532 36.6366 15.3189 36.0542 15.7484 C 35.4718 16.1779 34.7439 17.1533 33.874 18.6747 L 30.3362 25.2153 L 35.1261 34.9734 L 42.1981 18.5291 C 42.4419 17.9286 42.5657 17.3754 42.5657 16.8731 C 42.5657 15.6683 41.7431 15.0314 40.0979 14.9549 C 39.9487 14.9549 39.8759 14.7839 39.8759 14.4417 C 39.8759 14.096 39.9851 13.9249 40.2071 13.9249 C 40.8077 13.9249 41.5211 13.9613 42.3436 14.0341 C 43.1043 14.1105 43.7449 14.1469 44.2581 14.1469 C 44.8005 14.1469 45.4265 14.1105 46.1362 14.0341 C 46.8751 13.9613 47.5375 13.9249 48.1272 13.9249 C 48.2982 13.9249 48.3856 14.0705 48.3856 14.3653 Z "
+ fill="&stroke_color;"
+ stroke="none"
+ id="path3061" />
+ <path
+ d="m 39.504564,40.212072 0.013,5.3166"
+ id="path3063"
+ inkscape:connector-curvature="0"
+ style="fill:none" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#ffffff;fill-opacity:1;stroke:&stroke_color;;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3071"
+ sodipodi:cx="40.185184"
+ sodipodi:cy="42.314816"
+ sodipodi:rx="10.555555"
+ sodipodi:ry="10.092592"
+ d="m 50.74074,42.314816 a 10.555555,10.092592 0 1 1 -21.111111,0 10.555555,10.092592 0 1 1 21.111111,0 z"
+ transform="translate(-0.67412013,0.55555556)" />
+ <text
+ xml:space="preserve"
+ style="font-size:10px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:&stroke_color;;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
+ x="32.399246"
+ y="46.510509"
+ id="text3841"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3843"
+ x="32.399246"
+ y="46.510509">FR</tspan></text>
+</svg>
diff --git a/activity/activity-wikipedia-gn.svg b/activity/activity-wikipedia-gn.svg
new file mode 100644
index 0000000..41c6e05
--- /dev/null
+++ b/activity/activity-wikipedia-gn.svg
@@ -0,0 +1,68 @@
+<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
+ <!ENTITY stroke_color "#000">
+ <!ENTITY fill_color "#eee">
+]>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ width="55"
+ height="55"
+ viewBox="0 0 55 55"
+ id="svg3051">
+ <metadata
+ id="metadata3069">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs3067" />
+ <path
+ d="m 27.904,11.023 -0.002,0 c 0,-0.002 -1.71,-2.053 -9.376,-2.504 C 10.86,8.07 6.843,10.121 6.84,10.122 4.942,10.741 3.345,11.857 3.345,13.616 l 0,27.702 c 0,2.025 1.235,3.494 3.495,3.494 0.003,0 4.41,-1.35 10.004,-1.35 5.589,-0.001 11.061,2.253 11.061,2.253"
+ id="path3053"
+ style="fill:&fill_color;;stroke:&stroke_color;;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round" />
+ <path
+ d="m 27.898,11.023 0,0 c 0,-0.002 1.715,-2.053 9.377,-2.504 7.668,-0.449 11.686,1.602 11.688,1.603 1.897,0.619 3.494,1.735 3.494,3.494 l 0,27.702 c 0,2.025 -1.233,3.494 -3.494,3.494 -0.003,0 -4.409,-1.35 -10.004,-1.35 -5.589,-0.001 -11.062,2.253 -11.062,2.253"
+ id="path3055"
+ style="fill:&fill_color;;stroke:&stroke_color;;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round" />
+ <path
+ d="m 27.7747,10.8997 0.2486,0.241"
+ id="path3057"
+ style="fill:none" />
+ <path
+ d="m 32.010444,44.830556 c 0,0 -0.031,2.906 -4.666,2.906 -4.632,0 -4.663,-2.906 -4.663,-2.906"
+ id="path3059"
+ style="fill:none" />
+ <path
+ d="m 48.3856,14.3653 c 0,0.1492 -0.0473,0.2839 -0.1383,0.4076 -0.0947,0.1202 -0.1929,0.182 -0.3058,0.182 -0.9063,0.0874 -1.6524,0.3786 -2.2275,0.8772 -0.5787,0.495 -1.172,1.445 -1.7871,2.8426 l -9.3905,21.1614 c -0.0618,0.1965 -0.2329,0.2948 -0.5168,0.2948 -0.222,0 -0.3931,-0.0983 -0.5168,-0.2948 L 28.2361,28.8223 22.1796,39.8361 c -0.1238,0.1965 -0.2948,0.2948 -0.5169,0.2948 -0.2693,0 -0.4476,-0.0983 -0.535,-0.2948 L 11.901,18.6747 C 11.3259,17.3608 10.7181,16.4436 10.0775,15.9231 9.44055,15.4026 8.54881,15.0787 7.40958,14.9549 c -0.09827,0 -0.1929,-0.0509 -0.27662,-0.1565 -0.08735,-0.1019 -0.13103,-0.222 -0.13103,-0.3567 0,-0.3457 0.09827,-0.5168 0.29482,-0.5168 0.82258,0 1.68155,0.0364 2.58056,0.1092 0.83349,0.0764 1.61969,0.1128 2.35489,0.1128 0.7498,0 1.6342,-0.0364 2.6534,-0.1128 1.0664,-0.0728 2.0127,-0.1092 2.8353,-0.1092 0.1966,0 0.2948,0.1711 0.2948,0.5168 0,0.3422 -0.0618,0.5132 -0.182,0.5132 -0.8225,0.0619 -1.4704,0.273 -1.9436,0.6261 -0.4731,0.3567 -0.7097,0.8225 -0.7097,1.4013 0,0.2948 0.0983,0.6624 0.2948,1.1028 l 7.6252,17.2195 4.3277,-8.1748 -4.0329,-8.4551 c -0.7243,-1.5068 -1.3212,-2.4823 -1.7871,-2.919 -0.4658,-0.4332 -1.1719,-0.7025 -2.1183,-0.8008 -0.0873,0 -0.1674,-0.0509 -0.2475,-0.1565 -0.0801,-0.1019 -0.1201,-0.222 -0.1201,-0.3567 0,-0.3457 0.0837,-0.5168 0.2584,-0.5168 0.8226,0 1.576,0.0364 2.2639,0.1092 0.6625,0.0764 1.3686,0.1128 2.1184,0.1128 0.7352,0 1.5141,-0.0364 2.3367,-0.1128 0.848,-0.0728 1.6815,-0.1092 2.5041,-0.1092 0.1965,0 0.2948,0.1711 0.2948,0.5168 0,0.3422 -0.0582,0.5132 -0.182,0.5132 -1.6451,0.1129 -2.4677,0.5787 -2.4677,1.4013 0,0.3676 0.1893,0.9391 0.5714,1.7107 l 2.6679,5.4159 2.6534,-4.9537 c 0.3676,-0.6988 0.5532,-1.2884 0.5532,-1.7689 0,-1.1283 -0.8225,-1.7288 -2.4677,-1.8053 -0.1492,0 -0.222,-0.171 -0.222,-0.5132 0,-0.1237 0.0364,-0.2402 0.1092,-0.3494 0.0764,-0.1128 0.1492,-0.1674 0.222,-0.1674 0.5896,0 1.3139,0.0364 2.1729,0.1092 0.8226,0.0764 1.4996,0.1128 2.0273,0.1128 0.3786,0 0.9391,-0.0327 1.6743,-0.0946 0.9318,-0.0837 1.7143,-0.1274 2.3404,-0.1274 0.1455,0 0.2183,0.1456 0.2183,0.4404 0,0.3931 -0.1346,0.5896 -0.404,0.5896 -0.9572,0.0983 -1.7288,0.364 -2.3112,0.7935 -0.5824,0.4295 -1.3103,1.4049 -2.1802,2.9263 l -3.5378,6.5406 4.7899,9.7581 7.072,-16.4443 c 0.2438,-0.6005 0.3676,-1.1537 0.3676,-1.656 0,-1.2048 -0.8226,-1.8417 -2.4678,-1.9182 -0.1492,0 -0.222,-0.171 -0.222,-0.5132 0,-0.3457 0.1092,-0.5168 0.3312,-0.5168 0.6006,0 1.314,0.0364 2.1365,0.1092 0.7607,0.0764 1.4013,0.1128 1.9145,0.1128 0.5424,0 1.1684,-0.0364 1.8781,-0.1128 0.7389,-0.0728 1.4013,-0.1092 1.991,-0.1092 0.171,0 0.2584,0.1456 0.2584,0.4404 z"
+ id="path3061"
+ style="fill:&stroke_color;;stroke:none" />
+ <path
+ d="m 39.504564,40.212072 0.013,5.3166"
+ id="path3063"
+ style="fill:none" />
+ <path
+ d="m 50.74074,42.314816 a 10.555555,10.092592 0 1 1 -21.111111,0 10.555555,10.092592 0 1 1 21.111111,0 z"
+ transform="matrix(1.1504542,0,0,1.2032273,-4.8672048,-10.359877)"
+ id="path3071"
+ style="fill:#ffffff;fill-opacity:1;stroke:&stroke_color;;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <text
+ x="31.698483"
+ y="44.199482"
+ id="text3841"
+ xml:space="preserve"
+ style="font-size:10px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:&stroke_color;;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"><tspan
+ x="31.698483"
+ y="44.199482"
+ id="tspan3843">GN</tspan></text>
+</svg>
diff --git a/activity/activity-wikipedia-pl.png b/activity/activity-wikipedia-pl.png
new file mode 100644
index 0000000..78aa848
--- /dev/null
+++ b/activity/activity-wikipedia-pl.png
Binary files differ
diff --git a/activity/activity-wikipedia-pl.svg b/activity/activity-wikipedia-pl.svg
new file mode 100644
index 0000000..d3cae59
--- /dev/null
+++ b/activity/activity-wikipedia-pl.svg
@@ -0,0 +1,90 @@
+<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
+ <!ENTITY stroke_color "#000">
+ <!ENTITY fill_color "#eee">
+]>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ height="55px"
+ viewBox="0 0 55 55"
+ width="55px"
+ id="svg3051"
+ version="1.1"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="activity-wikipedia.svg">
+ <metadata
+ id="metadata3069">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs3067" />
+ <path
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ stroke-width="3.5"
+ stroke="&stroke_color;"
+ fill="&fill_color;"
+ d="M 27.904 11.023 L 27.902 11.023 C 27.902 11.021 26.192 8.97 18.526 8.519 C 10.86 8.07 6.843 10.121 6.84 10.122 C 4.942 10.741 3.345 11.857 3.345 13.616 L 3.345 41.318 C 3.345 43.343 4.58 44.812 6.84 44.812 C 6.843 44.812 11.25 43.462 16.844 43.462 C 22.433 43.461 27.905 45.715 27.905 45.715 "
+ id="path3053" />
+ <path
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ stroke-width="3.5"
+ stroke="&stroke_color;"
+ fill="&fill_color;"
+ d="M 27.898 11.023 L 27.898 11.023 C 27.898 11.021 29.613 8.97 37.275 8.519 C 44.943 8.07 48.961 10.121 48.963 10.122 C 50.86 10.741 52.457 11.857 52.457 13.616 L 52.457 41.318 C 52.457 43.343 51.224 44.812 48.963 44.812 C 48.96 44.812 44.554 43.462 38.959 43.462 C 33.37 43.461 27.897 45.715 27.897 45.715 "
+ id="path3055" />
+ <path
+ d="M 27.7747 10.8997 L 28.0233 11.1407 "
+ fill="none"
+ id="path3057" />
+ <path
+ d="m 32.010444,44.830556 c 0,0 -0.031,2.906 -4.666,2.906 -4.632,0 -4.663,-2.906 -4.663,-2.906"
+ id="path3059"
+ inkscape:connector-curvature="0"
+ style="fill:none" />
+ <path
+ d="M 48.3856 14.3653 C 48.3856 14.5145 48.3383 14.6492 48.2473 14.7729 C 48.1526 14.8931 48.0544 14.9549 47.9415 14.9549 C 47.0352 15.0423 46.2891 15.3335 45.714 15.8321 C 45.1353 16.3271 44.542 17.2771 43.9269 18.6747 L 34.5364 39.8361 C 34.4746 40.0326 34.3035 40.1309 34.0196 40.1309 C 33.7976 40.1309 33.6265 40.0326 33.5028 39.8361 L 28.2361 28.8223 L 22.1796 39.8361 C 22.0558 40.0326 21.8848 40.1309 21.6627 40.1309 C 21.3934 40.1309 21.2151 40.0326 21.1277 39.8361 L 11.901 18.6747 C 11.3259 17.3608 10.7181 16.4436 10.0775 15.9231 C 9.44055 15.4026 8.54881 15.0787 7.40958 14.9549 C 7.31131 14.9549 7.21668 14.904 7.13296 14.7984 C 7.04561 14.6965 7.00193 14.5764 7.00193 14.4417 C 7.00193 14.096 7.1002 13.9249 7.29675 13.9249 C 8.11933 13.9249 8.9783 13.9613 9.87731 14.0341 C 10.7108 14.1105 11.497 14.1469 12.2322 14.1469 C 12.982 14.1469 13.8664 14.1105 14.8856 14.0341 C 15.952 13.9613 16.8983 13.9249 17.7209 13.9249 C 17.9175 13.9249 18.0157 14.096 18.0157 14.4417 C 18.0157 14.7839 17.9539 14.9549 17.8337 14.9549 C 17.0112 15.0168 16.3633 15.2279 15.8901 15.581 C 15.417 15.9377 15.1804 16.4035 15.1804 16.9823 C 15.1804 17.2771 15.2787 17.6447 15.4752 18.0851 L 23.1004 35.3046 L 27.4281 27.1298 L 23.3952 18.6747 C 22.6709 17.1679 22.074 16.1924 21.6081 15.7557 C 21.1423 15.3225 20.4362 15.0532 19.4898 14.9549 C 19.4025 14.9549 19.3224 14.904 19.2423 14.7984 C 19.1622 14.6965 19.1222 14.5764 19.1222 14.4417 C 19.1222 14.096 19.2059 13.9249 19.3806 13.9249 C 20.2032 13.9249 20.9566 13.9613 21.6445 14.0341 C 22.307 14.1105 23.0131 14.1469 23.7629 14.1469 C 24.4981 14.1469 25.277 14.1105 26.0996 14.0341 C 26.9476 13.9613 27.7811 13.9249 28.6037 13.9249 C 28.8002 13.9249 28.8985 14.096 28.8985 14.4417 C 28.8985 14.7839 28.8403 14.9549 28.7165 14.9549 C 27.0714 15.0678 26.2488 15.5336 26.2488 16.3562 C 26.2488 16.7238 26.4381 17.2953 26.8202 18.0669 L 29.4881 23.4828 L 32.1415 18.5291 C 32.5091 17.8303 32.6947 17.2407 32.6947 16.7602 C 32.6947 15.6319 31.8722 15.0314 30.227 14.9549 C 30.0778 14.9549 30.005 14.7839 30.005 14.4417 C 30.005 14.318 30.0414 14.2015 30.1142 14.0923 C 30.1906 13.9795 30.2634 13.9249 30.3362 13.9249 C 30.9258 13.9249 31.6501 13.9613 32.5091 14.0341 C 33.3317 14.1105 34.0087 14.1469 34.5364 14.1469 C 34.915 14.1469 35.4755 14.1142 36.2107 14.0523 C 37.1425 13.9686 37.925 13.9249 38.5511 13.9249 C 38.6966 13.9249 38.7694 14.0705 38.7694 14.3653 C 38.7694 14.7584 38.6348 14.9549 38.3654 14.9549 C 37.4082 15.0532 36.6366 15.3189 36.0542 15.7484 C 35.4718 16.1779 34.7439 17.1533 33.874 18.6747 L 30.3362 25.2153 L 35.1261 34.9734 L 42.1981 18.5291 C 42.4419 17.9286 42.5657 17.3754 42.5657 16.8731 C 42.5657 15.6683 41.7431 15.0314 40.0979 14.9549 C 39.9487 14.9549 39.8759 14.7839 39.8759 14.4417 C 39.8759 14.096 39.9851 13.9249 40.2071 13.9249 C 40.8077 13.9249 41.5211 13.9613 42.3436 14.0341 C 43.1043 14.1105 43.7449 14.1469 44.2581 14.1469 C 44.8005 14.1469 45.4265 14.1105 46.1362 14.0341 C 46.8751 13.9613 47.5375 13.9249 48.1272 13.9249 C 48.2982 13.9249 48.3856 14.0705 48.3856 14.3653 Z "
+ fill="&stroke_color;"
+ stroke="none"
+ id="path3061" />
+ <path
+ d="m 39.504564,40.212072 0.013,5.3166"
+ id="path3063"
+ inkscape:connector-curvature="0"
+ style="fill:none" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#ffffff;fill-opacity:1;stroke:&stroke_color;;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3071"
+ sodipodi:cx="40.185184"
+ sodipodi:cy="42.314816"
+ sodipodi:rx="10.555555"
+ sodipodi:ry="10.092592"
+ d="m 50.74074,42.314816 a 10.555555,10.092592 0 1 1 -21.111111,0 10.555555,10.092592 0 1 1 21.111111,0 z"
+ transform="translate(-0.67412013,0.55555556)" />
+ <text
+ xml:space="preserve"
+ style="font-size:10px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:&stroke_color;;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
+ x="32.399246"
+ y="46.510509"
+ id="text3841"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3843"
+ x="32.399246"
+ y="46.510509">PL</tspan></text>
+</svg>
diff --git a/activity/activity-wikipedia-qu.svg b/activity/activity-wikipedia-qu.svg
new file mode 100644
index 0000000..e18cd56
--- /dev/null
+++ b/activity/activity-wikipedia-qu.svg
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ height="55px"
+ viewBox="0 0 55 55"
+ width="55px"
+ id="svg3051"
+ version="1.1"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="activity-wikipedia-qu.svg">
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1366"
+ inkscape:window-height="710"
+ id="namedview3069"
+ showgrid="false"
+ inkscape:zoom="5.1272727"
+ inkscape:cx="-0.39007092"
+ inkscape:cy="27.5"
+ inkscape:window-x="0"
+ inkscape:window-y="26"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg3051" />
+ <metadata
+ id="metadata3069">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs3067" />
+ <path
+ d="M 27.904 11.023 L 27.902 11.023 C 27.902 11.021 26.192 8.97 18.526 8.519 C 10.86 8.07 6.843 10.121 6.84 10.122 C 4.942 10.741 3.345 11.857 3.345 13.616 L 3.345 41.318 C 3.345 43.343 4.58 44.812 6.84 44.812 C 6.843 44.812 11.25 43.462 16.844 43.462 C 22.433 43.461 27.905 45.715 27.905 45.715 "
+ id="path3053"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ stroke-width="3.5"
+ stroke="#000"
+ fill="#eee" />
+ <path
+ d="M 27.898 11.023 L 27.898 11.023 C 27.898 11.021 29.613 8.97 37.275 8.519 C 44.943 8.07 48.961 10.121 48.963 10.122 C 50.86 10.741 52.457 11.857 52.457 13.616 L 52.457 41.318 C 52.457 43.343 51.224 44.812 48.963 44.812 C 48.96 44.812 44.554 43.462 38.959 43.462 C 33.37 43.461 27.897 45.715 27.897 45.715 "
+ id="path3055"
+ stroke-linejoin="round"
+ stroke-linecap="round"
+ stroke-width="3.5"
+ stroke="#000"
+ fill="#eee" />
+ <path
+ d="M 27.7747 10.8997 L 28.0233 11.1407 "
+ id="path3057"
+ fill="none" />
+ <path
+ d="m 32.010444,44.830556 c 0,0 -0.031,2.906 -4.666,2.906 -4.632,0 -4.663,-2.906 -4.663,-2.906"
+ id="path3059"
+ inkscape:connector-curvature="0"
+ style="fill:none" />
+ <path
+ d="M 48.3856 14.3653 C 48.3856 14.5145 48.3383 14.6492 48.2473 14.7729 C 48.1526 14.8931 48.0544 14.9549 47.9415 14.9549 C 47.0352 15.0423 46.2891 15.3335 45.714 15.8321 C 45.1353 16.3271 44.542 17.2771 43.9269 18.6747 L 34.5364 39.8361 C 34.4746 40.0326 34.3035 40.1309 34.0196 40.1309 C 33.7976 40.1309 33.6265 40.0326 33.5028 39.8361 L 28.2361 28.8223 L 22.1796 39.8361 C 22.0558 40.0326 21.8848 40.1309 21.6627 40.1309 C 21.3934 40.1309 21.2151 40.0326 21.1277 39.8361 L 11.901 18.6747 C 11.3259 17.3608 10.7181 16.4436 10.0775 15.9231 C 9.44055 15.4026 8.54881 15.0787 7.40958 14.9549 C 7.31131 14.9549 7.21668 14.904 7.13296 14.7984 C 7.04561 14.6965 7.00193 14.5764 7.00193 14.4417 C 7.00193 14.096 7.1002 13.9249 7.29675 13.9249 C 8.11933 13.9249 8.9783 13.9613 9.87731 14.0341 C 10.7108 14.1105 11.497 14.1469 12.2322 14.1469 C 12.982 14.1469 13.8664 14.1105 14.8856 14.0341 C 15.952 13.9613 16.8983 13.9249 17.7209 13.9249 C 17.9175 13.9249 18.0157 14.096 18.0157 14.4417 C 18.0157 14.7839 17.9539 14.9549 17.8337 14.9549 C 17.0112 15.0168 16.3633 15.2279 15.8901 15.581 C 15.417 15.9377 15.1804 16.4035 15.1804 16.9823 C 15.1804 17.2771 15.2787 17.6447 15.4752 18.0851 L 23.1004 35.3046 L 27.4281 27.1298 L 23.3952 18.6747 C 22.6709 17.1679 22.074 16.1924 21.6081 15.7557 C 21.1423 15.3225 20.4362 15.0532 19.4898 14.9549 C 19.4025 14.9549 19.3224 14.904 19.2423 14.7984 C 19.1622 14.6965 19.1222 14.5764 19.1222 14.4417 C 19.1222 14.096 19.2059 13.9249 19.3806 13.9249 C 20.2032 13.9249 20.9566 13.9613 21.6445 14.0341 C 22.307 14.1105 23.0131 14.1469 23.7629 14.1469 C 24.4981 14.1469 25.277 14.1105 26.0996 14.0341 C 26.9476 13.9613 27.7811 13.9249 28.6037 13.9249 C 28.8002 13.9249 28.8985 14.096 28.8985 14.4417 C 28.8985 14.7839 28.8403 14.9549 28.7165 14.9549 C 27.0714 15.0678 26.2488 15.5336 26.2488 16.3562 C 26.2488 16.7238 26.4381 17.2953 26.8202 18.0669 L 29.4881 23.4828 L 32.1415 18.5291 C 32.5091 17.8303 32.6947 17.2407 32.6947 16.7602 C 32.6947 15.6319 31.8722 15.0314 30.227 14.9549 C 30.0778 14.9549 30.005 14.7839 30.005 14.4417 C 30.005 14.318 30.0414 14.2015 30.1142 14.0923 C 30.1906 13.9795 30.2634 13.9249 30.3362 13.9249 C 30.9258 13.9249 31.6501 13.9613 32.5091 14.0341 C 33.3317 14.1105 34.0087 14.1469 34.5364 14.1469 C 34.915 14.1469 35.4755 14.1142 36.2107 14.0523 C 37.1425 13.9686 37.925 13.9249 38.5511 13.9249 C 38.6966 13.9249 38.7694 14.0705 38.7694 14.3653 C 38.7694 14.7584 38.6348 14.9549 38.3654 14.9549 C 37.4082 15.0532 36.6366 15.3189 36.0542 15.7484 C 35.4718 16.1779 34.7439 17.1533 33.874 18.6747 L 30.3362 25.2153 L 35.1261 34.9734 L 42.1981 18.5291 C 42.4419 17.9286 42.5657 17.3754 42.5657 16.8731 C 42.5657 15.6683 41.7431 15.0314 40.0979 14.9549 C 39.9487 14.9549 39.8759 14.7839 39.8759 14.4417 C 39.8759 14.096 39.9851 13.9249 40.2071 13.9249 C 40.8077 13.9249 41.5211 13.9613 42.3436 14.0341 C 43.1043 14.1105 43.7449 14.1469 44.2581 14.1469 C 44.8005 14.1469 45.4265 14.1105 46.1362 14.0341 C 46.8751 13.9613 47.5375 13.9249 48.1272 13.9249 C 48.2982 13.9249 48.3856 14.0705 48.3856 14.3653 Z "
+ id="path3061"
+ stroke="none"
+ fill="#000" />
+ <path
+ d="m 39.504564,40.212072 0.013,5.3166"
+ id="path3063"
+ inkscape:connector-curvature="0"
+ style="fill:none" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3071"
+ sodipodi:cx="40.185184"
+ sodipodi:cy="42.314816"
+ sodipodi:rx="10.555555"
+ sodipodi:ry="10.092592"
+ d="m 50.74074,42.314816 a 10.555555,10.092592 0 1 1 -21.111111,0 10.555555,10.092592 0 1 1 21.111111,0 z"
+ transform="translate(-0.67412013,0.55555556)" />
+ <text
+ xml:space="preserve"
+ style="font-size:10px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
+ x="31.41292"
+ y="46.510509"
+ id="text3841"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3843"
+ x="31.41292"
+ y="46.510509">QU</tspan></text>
+</svg>
diff --git a/activity/activity-wikipedia-rw.png b/activity/activity-wikipedia-rw.png
new file mode 100644
index 0000000..eaa56f1
--- /dev/null
+++ b/activity/activity-wikipedia-rw.png
Binary files differ
diff --git a/activity/activity-wikipedia-rw.svg b/activity/activity-wikipedia-rw.svg
new file mode 100644
index 0000000..68190b0
--- /dev/null
+++ b/activity/activity-wikipedia-rw.svg
@@ -0,0 +1,68 @@
+<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
+ <!ENTITY stroke_color "#000">
+ <!ENTITY fill_color "#eee">
+]>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ width="55"
+ height="55"
+ viewBox="0 0 55 55"
+ id="svg3051">
+ <metadata
+ id="metadata3069">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs3067" />
+ <path
+ d="m 27.904,11.023 -0.002,0 c 0,-0.002 -1.71,-2.053 -9.376,-2.504 C 10.86,8.07 6.843,10.121 6.84,10.122 4.942,10.741 3.345,11.857 3.345,13.616 l 0,27.702 c 0,2.025 1.235,3.494 3.495,3.494 0.003,0 4.41,-1.35 10.004,-1.35 5.589,-0.001 11.061,2.253 11.061,2.253"
+ id="path3053"
+ style="fill:&fill_color;;stroke:&stroke_color;;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round" />
+ <path
+ d="m 27.898,11.023 0,0 c 0,-0.002 1.715,-2.053 9.377,-2.504 7.668,-0.449 11.686,1.602 11.688,1.603 1.897,0.619 3.494,1.735 3.494,3.494 l 0,27.702 c 0,2.025 -1.233,3.494 -3.494,3.494 -0.003,0 -4.409,-1.35 -10.004,-1.35 -5.589,-0.001 -11.062,2.253 -11.062,2.253"
+ id="path3055"
+ style="fill:&fill_color;;stroke:&stroke_color;;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round" />
+ <path
+ d="m 27.7747,10.8997 0.2486,0.241"
+ id="path3057"
+ style="fill:none" />
+ <path
+ d="m 32.010444,44.830556 c 0,0 -0.031,2.906 -4.666,2.906 -4.632,0 -4.663,-2.906 -4.663,-2.906"
+ id="path3059"
+ style="fill:none" />
+ <path
+ d="m 48.3856,14.3653 c 0,0.1492 -0.0473,0.2839 -0.1383,0.4076 -0.0947,0.1202 -0.1929,0.182 -0.3058,0.182 -0.9063,0.0874 -1.6524,0.3786 -2.2275,0.8772 -0.5787,0.495 -1.172,1.445 -1.7871,2.8426 l -9.3905,21.1614 c -0.0618,0.1965 -0.2329,0.2948 -0.5168,0.2948 -0.222,0 -0.3931,-0.0983 -0.5168,-0.2948 L 28.2361,28.8223 22.1796,39.8361 c -0.1238,0.1965 -0.2948,0.2948 -0.5169,0.2948 -0.2693,0 -0.4476,-0.0983 -0.535,-0.2948 L 11.901,18.6747 C 11.3259,17.3608 10.7181,16.4436 10.0775,15.9231 9.44055,15.4026 8.54881,15.0787 7.40958,14.9549 c -0.09827,0 -0.1929,-0.0509 -0.27662,-0.1565 -0.08735,-0.1019 -0.13103,-0.222 -0.13103,-0.3567 0,-0.3457 0.09827,-0.5168 0.29482,-0.5168 0.82258,0 1.68155,0.0364 2.58056,0.1092 0.83349,0.0764 1.61969,0.1128 2.35489,0.1128 0.7498,0 1.6342,-0.0364 2.6534,-0.1128 1.0664,-0.0728 2.0127,-0.1092 2.8353,-0.1092 0.1966,0 0.2948,0.1711 0.2948,0.5168 0,0.3422 -0.0618,0.5132 -0.182,0.5132 -0.8225,0.0619 -1.4704,0.273 -1.9436,0.6261 -0.4731,0.3567 -0.7097,0.8225 -0.7097,1.4013 0,0.2948 0.0983,0.6624 0.2948,1.1028 l 7.6252,17.2195 4.3277,-8.1748 -4.0329,-8.4551 c -0.7243,-1.5068 -1.3212,-2.4823 -1.7871,-2.919 -0.4658,-0.4332 -1.1719,-0.7025 -2.1183,-0.8008 -0.0873,0 -0.1674,-0.0509 -0.2475,-0.1565 -0.0801,-0.1019 -0.1201,-0.222 -0.1201,-0.3567 0,-0.3457 0.0837,-0.5168 0.2584,-0.5168 0.8226,0 1.576,0.0364 2.2639,0.1092 0.6625,0.0764 1.3686,0.1128 2.1184,0.1128 0.7352,0 1.5141,-0.0364 2.3367,-0.1128 0.848,-0.0728 1.6815,-0.1092 2.5041,-0.1092 0.1965,0 0.2948,0.1711 0.2948,0.5168 0,0.3422 -0.0582,0.5132 -0.182,0.5132 -1.6451,0.1129 -2.4677,0.5787 -2.4677,1.4013 0,0.3676 0.1893,0.9391 0.5714,1.7107 l 2.6679,5.4159 2.6534,-4.9537 c 0.3676,-0.6988 0.5532,-1.2884 0.5532,-1.7689 0,-1.1283 -0.8225,-1.7288 -2.4677,-1.8053 -0.1492,0 -0.222,-0.171 -0.222,-0.5132 0,-0.1237 0.0364,-0.2402 0.1092,-0.3494 0.0764,-0.1128 0.1492,-0.1674 0.222,-0.1674 0.5896,0 1.3139,0.0364 2.1729,0.1092 0.8226,0.0764 1.4996,0.1128 2.0273,0.1128 0.3786,0 0.9391,-0.0327 1.6743,-0.0946 0.9318,-0.0837 1.7143,-0.1274 2.3404,-0.1274 0.1455,0 0.2183,0.1456 0.2183,0.4404 0,0.3931 -0.1346,0.5896 -0.404,0.5896 -0.9572,0.0983 -1.7288,0.364 -2.3112,0.7935 -0.5824,0.4295 -1.3103,1.4049 -2.1802,2.9263 l -3.5378,6.5406 4.7899,9.7581 7.072,-16.4443 c 0.2438,-0.6005 0.3676,-1.1537 0.3676,-1.656 0,-1.2048 -0.8226,-1.8417 -2.4678,-1.9182 -0.1492,0 -0.222,-0.171 -0.222,-0.5132 0,-0.3457 0.1092,-0.5168 0.3312,-0.5168 0.6006,0 1.314,0.0364 2.1365,0.1092 0.7607,0.0764 1.4013,0.1128 1.9145,0.1128 0.5424,0 1.1684,-0.0364 1.8781,-0.1128 0.7389,-0.0728 1.4013,-0.1092 1.991,-0.1092 0.171,0 0.2584,0.1456 0.2584,0.4404 z"
+ id="path3061"
+ style="fill:&stroke_color;;stroke:none" />
+ <path
+ d="m 39.504564,40.212072 0.013,5.3166"
+ id="path3063"
+ style="fill:none" />
+ <path
+ d="m 50.74074,42.314816 a 10.555555,10.092592 0 1 1 -21.111111,0 10.555555,10.092592 0 1 1 21.111111,0 z"
+ transform="matrix(1.1504542,0,0,1.2032273,-4.8672048,-10.359877)"
+ id="path3071"
+ style="fill:#ffffff;fill-opacity:1;stroke:&stroke_color;;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <text
+ x="31.698483"
+ y="44.199482"
+ id="text3841"
+ xml:space="preserve"
+ style="font-size:10px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:&stroke_color;;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"><tspan
+ x="31.698483"
+ y="44.199482"
+ id="tspan3843">RW</tspan></text>
+</svg>
diff --git a/activity/activity-wikipedia.svg b/activity/activity-wikipedia.svg
new file mode 100644
index 0000000..94a48c2
--- /dev/null
+++ b/activity/activity-wikipedia.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
+ <!ENTITY stroke_color "#000">
+ <!ENTITY fill_color "#eee">
+]><svg height="55px" viewBox="0 0 55 55" width="55px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="3.5" stroke="&stroke_color;" fill="&fill_color;" d="M 27.904 11.023 L 27.902 11.023 C 27.902 11.021 26.192 8.97 18.526 8.519 C 10.86 8.07 6.843 10.121 6.84 10.122 C 4.942 10.741 3.345 11.857 3.345 13.616 L 3.345 41.318 C 3.345 43.343 4.58 44.812 6.84 44.812 C 6.843 44.812 11.25 43.462 16.844 43.462 C 22.433 43.461 27.905 45.715 27.905 45.715 " />
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="3.5" stroke="&stroke_color;" fill="&fill_color;" d="M 27.898 11.023 L 27.898 11.023 C 27.898 11.021 29.613 8.97 37.275 8.519 C 44.943 8.07 48.961 10.121 48.963 10.122 C 50.86 10.741 52.457 11.857 52.457 13.616 L 52.457 41.318 C 52.457 43.343 51.224 44.812 48.963 44.812 C 48.96 44.812 44.554 43.462 38.959 43.462 C 33.37 43.461 27.897 45.715 27.897 45.715 " />
+ <path d="M 27.7747 10.8997 L 28.0233 11.1407 " fill="none" />
+ <path d="M 32.566 44.275 C 32.566 44.275 32.535 47.181 27.9 47.181 C 23.268 47.181 23.237 44.275 23.237 44.275 " fill="none" />
+ <path d="M 48.3856 14.3653 C 48.3856 14.5145 48.3383 14.6492 48.2473 14.7729 C 48.1526 14.8931 48.0544 14.9549 47.9415 14.9549 C 47.0352 15.0423 46.2891 15.3335 45.714 15.8321 C 45.1353 16.3271 44.542 17.2771 43.9269 18.6747 L 34.5364 39.8361 C 34.4746 40.0326 34.3035 40.1309 34.0196 40.1309 C 33.7976 40.1309 33.6265 40.0326 33.5028 39.8361 L 28.2361 28.8223 L 22.1796 39.8361 C 22.0558 40.0326 21.8848 40.1309 21.6627 40.1309 C 21.3934 40.1309 21.2151 40.0326 21.1277 39.8361 L 11.901 18.6747 C 11.3259 17.3608 10.7181 16.4436 10.0775 15.9231 C 9.44055 15.4026 8.54881 15.0787 7.40958 14.9549 C 7.31131 14.9549 7.21668 14.904 7.13296 14.7984 C 7.04561 14.6965 7.00193 14.5764 7.00193 14.4417 C 7.00193 14.096 7.1002 13.9249 7.29675 13.9249 C 8.11933 13.9249 8.9783 13.9613 9.87731 14.0341 C 10.7108 14.1105 11.497 14.1469 12.2322 14.1469 C 12.982 14.1469 13.8664 14.1105 14.8856 14.0341 C 15.952 13.9613 16.8983 13.9249 17.7209 13.9249 C 17.9175 13.9249 18.0157 14.096 18.0157 14.4417 C 18.0157 14.7839 17.9539 14.9549 17.8337 14.9549 C 17.0112 15.0168 16.3633 15.2279 15.8901 15.581 C 15.417 15.9377 15.1804 16.4035 15.1804 16.9823 C 15.1804 17.2771 15.2787 17.6447 15.4752 18.0851 L 23.1004 35.3046 L 27.4281 27.1298 L 23.3952 18.6747 C 22.6709 17.1679 22.074 16.1924 21.6081 15.7557 C 21.1423 15.3225 20.4362 15.0532 19.4898 14.9549 C 19.4025 14.9549 19.3224 14.904 19.2423 14.7984 C 19.1622 14.6965 19.1222 14.5764 19.1222 14.4417 C 19.1222 14.096 19.2059 13.9249 19.3806 13.9249 C 20.2032 13.9249 20.9566 13.9613 21.6445 14.0341 C 22.307 14.1105 23.0131 14.1469 23.7629 14.1469 C 24.4981 14.1469 25.277 14.1105 26.0996 14.0341 C 26.9476 13.9613 27.7811 13.9249 28.6037 13.9249 C 28.8002 13.9249 28.8985 14.096 28.8985 14.4417 C 28.8985 14.7839 28.8403 14.9549 28.7165 14.9549 C 27.0714 15.0678 26.2488 15.5336 26.2488 16.3562 C 26.2488 16.7238 26.4381 17.2953 26.8202 18.0669 L 29.4881 23.4828 L 32.1415 18.5291 C 32.5091 17.8303 32.6947 17.2407 32.6947 16.7602 C 32.6947 15.6319 31.8722 15.0314 30.227 14.9549 C 30.0778 14.9549 30.005 14.7839 30.005 14.4417 C 30.005 14.318 30.0414 14.2015 30.1142 14.0923 C 30.1906 13.9795 30.2634 13.9249 30.3362 13.9249 C 30.9258 13.9249 31.6501 13.9613 32.5091 14.0341 C 33.3317 14.1105 34.0087 14.1469 34.5364 14.1469 C 34.915 14.1469 35.4755 14.1142 36.2107 14.0523 C 37.1425 13.9686 37.925 13.9249 38.5511 13.9249 C 38.6966 13.9249 38.7694 14.0705 38.7694 14.3653 C 38.7694 14.7584 38.6348 14.9549 38.3654 14.9549 C 37.4082 15.0532 36.6366 15.3189 36.0542 15.7484 C 35.4718 16.1779 34.7439 17.1533 33.874 18.6747 L 30.3362 25.2153 L 35.1261 34.9734 L 42.1981 18.5291 C 42.4419 17.9286 42.5657 17.3754 42.5657 16.8731 C 42.5657 15.6683 41.7431 15.0314 40.0979 14.9549 C 39.9487 14.9549 39.8759 14.7839 39.8759 14.4417 C 39.8759 14.096 39.9851 13.9249 40.2071 13.9249 C 40.8077 13.9249 41.5211 13.9613 42.3436 14.0341 C 43.1043 14.1105 43.7449 14.1469 44.2581 14.1469 C 44.8005 14.1469 45.4265 14.1105 46.1362 14.0341 C 46.8751 13.9613 47.5375 13.9249 48.1272 13.9249 C 48.2982 13.9249 48.3856 14.0705 48.3856 14.3653 Z " fill="&stroke_color;" stroke="none" />
+ <path d="M 27.8925 40.4059 L 27.9055 45.7225 " fill="none" />
+</svg> \ No newline at end of file
diff --git a/activity/activity.info b/activity/activity.info
new file mode 100644
index 0000000..5a40342
--- /dev/null
+++ b/activity/activity.info
@@ -0,0 +1,6 @@
+[Activity]
+name = WikipediaEN
+activity_version = 35
+bundle_id = org.laptop.WikipediaActivityEN
+icon = activity-wikipedia-en
+exec = sugar-activity activity_en.WikipediaActivityEN
diff --git a/activity/activity.info.base b/activity/activity.info.base
new file mode 100644
index 0000000..e58d4a5
--- /dev/null
+++ b/activity/activity.info.base
@@ -0,0 +1,6 @@
+[Activity]
+name = WikipediaBase
+activity_version = 33.1
+bundle_id = org.laptop.WikipediaBaseActivity
+icon = activity-wikipedia
+exec = sugar-activity activity_es.WikipediaActivityES
diff --git a/activity/activity.info.en b/activity/activity.info.en
new file mode 100644
index 0000000..5a40342
--- /dev/null
+++ b/activity/activity.info.en
@@ -0,0 +1,6 @@
+[Activity]
+name = WikipediaEN
+activity_version = 35
+bundle_id = org.laptop.WikipediaActivityEN
+icon = activity-wikipedia-en
+exec = sugar-activity activity_en.WikipediaActivityEN
diff --git a/activity/activity.info.en_simple b/activity/activity.info.en_simple
new file mode 100644
index 0000000..b870a59
--- /dev/null
+++ b/activity/activity.info.en_simple
@@ -0,0 +1,6 @@
+[Activity]
+name = WikipediaSimpleEN
+activity_version = 33.5
+bundle_id = org.laptop.WikipediaActivitySimpleEN
+icon = activity-wikipedia-en-simple
+exec = sugar-activity activity_en_simple.WikipediaActivitySimpleEN
diff --git a/activity/activity.info.es_lat b/activity/activity.info.es_lat
new file mode 100644
index 0000000..1e42457
--- /dev/null
+++ b/activity/activity.info.es_lat
@@ -0,0 +1,6 @@
+[Activity]
+name = Wikipedia
+activity_version = 35
+bundle_id = org.laptop.WikipediaActivity
+icon = activity-wikipedia-es
+exec = sugar-activity activity_es.WikipediaActivityES
diff --git a/activity/activity.info.fr b/activity/activity.info.fr
new file mode 100644
index 0000000..56e1b92
--- /dev/null
+++ b/activity/activity.info.fr
@@ -0,0 +1,6 @@
+[Activity]
+name = WikipediaFR
+activity_version = 33.4
+bundle_id = org.laptop.WikipediaActivityFR
+icon = activity-wikipedia-fr
+exec = sugar-activity activity_fr.WikipediaActivityFR
diff --git a/activity/activity.info.gn b/activity/activity.info.gn
new file mode 100644
index 0000000..62f90d1
--- /dev/null
+++ b/activity/activity.info.gn
@@ -0,0 +1,6 @@
+[Activity]
+name = WikipediaGN
+activity_version = 33.4
+bundle_id = org.laptop.WikipediaGNActivity
+icon = activity-wikipedia-gn
+exec = sugar-activity activity_gn.WikipediaActivityGN
diff --git a/activity/activity.info.pl b/activity/activity.info.pl
new file mode 100644
index 0000000..f80293f
--- /dev/null
+++ b/activity/activity.info.pl
@@ -0,0 +1,6 @@
+[Activity]
+name = WikipediaPL
+activity_version = 33.3
+bundle_id = org.laptop.WikipediaPLActivity
+icon = activity-wikipedia-pl
+exec = sugar-activity activity_pl.WikipediaActivityPL
diff --git a/activity/activity.info.qu b/activity/activity.info.qu
new file mode 100644
index 0000000..b563b1c
--- /dev/null
+++ b/activity/activity.info.qu
@@ -0,0 +1,6 @@
+[Activity]
+name = WikipediaQU
+activity_version = 33.3
+bundle_id = org.laptop.WikipediaActivityQU
+icon = activity-wikipedia-qu
+exec = sugar-activity activity_qu.WikipediaActivityQU
diff --git a/activity/activity.info.rw b/activity/activity.info.rw
new file mode 100644
index 0000000..8152d4e
--- /dev/null
+++ b/activity/activity.info.rw
@@ -0,0 +1,6 @@
+[Activity]
+name = WikipediaRW
+activity_version = 33.3
+bundle_id = org.laptop.WikipediaActivityRW
+icon = activity-wikipedia-rw
+exec = sugar-activity activity_rw.WikipediaActivityRW
diff --git a/activity_en.py b/activity_en.py
new file mode 100644
index 0000000..e941523
--- /dev/null
+++ b/activity_en.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+
+
+def configure():
+ confvars = {}
+ confvars['comandline'] = False
+ confvars['path'] = 'en/enwiki-20111201-pages-articles.xml'
+ confvars['port'] = 8001
+ confvars['home_page'] = '/static/index_en.html'
+ confvars['templateprefix'] = 'Template:'
+ confvars['wpheader'] = 'From Wikipedia, The Free Encyclopedia'
+ confvars['wpfooter'] = 'Content available under the ' + \
+ '<a href="/static/es-gfdl.html">GNU Free Documentation License</a>.' + \
+ ' <br/> Wikipedia is a registered trademark of the non-profit ' + \
+ 'Wikimedia Foundation, Inc.<br/><a href="/static/about_en.html">' + \
+ 'About Wikipedia</a>'
+ confvars['resultstitle'] = "Search results for '%s'."
+ return confvars
+
+
+if __name__ == '__main__':
+ import server
+ import sys
+ conf = configure()
+ conf['path'] = sys.argv[1]
+ conf['port'] = int(sys.argv[2])
+ conf['comandline'] = True
+
+ if len(sys.argv) > 3:
+ conf['editdir'] = sys.argv[3]
+ if len(sys.argv) > 4:
+ conf['giturl'] = sys.argv[4]
+
+ server.run_server(conf)
+
+else:
+ import activity
+
+ class WikipediaActivityEN(activity.WikipediaActivity):
+
+ def __init__(self, handle):
+ self.confvars = configure()
+ activity.WikipediaActivity.__init__(self, handle)
diff --git a/activity_en_simple.py b/activity_en_simple.py
new file mode 100644
index 0000000..d7ae5f7
--- /dev/null
+++ b/activity_en_simple.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+
+
+def configure():
+ confvars = {}
+ confvars['comandline'] = False
+ confvars['path'] = 'en_simple/simplewiki-20120112-pages-articles.xml'
+ confvars['port'] = 8011
+ confvars['home_page'] = '/static/index_en.html'
+ confvars['templateprefix'] = 'Template:'
+ confvars['wpheader'] = 'From Wikipedia, The Free Encyclopedia'
+ confvars['wpfooter'] = 'Content available under the ' + \
+ '<a href="/static/es-gfdl.html">GNU Free Documentation License</a>.' + \
+ ' <br/> Wikipedia is a registered trademark of the non-profit ' + \
+ 'Wikimedia Foundation, Inc.<br/><a href="/static/about_en.html">' + \
+ 'About Wikipedia</a>'
+ confvars['resultstitle'] = "Search results for '%s'."
+ return confvars
+
+
+if __name__ == '__main__':
+ import server
+ import sys
+ conf = configure()
+ conf['path'] = sys.argv[1]
+ conf['port'] = int(sys.argv[2])
+ conf['comandline'] = True
+
+ if len(sys.argv) > 3:
+ conf['editdir'] = sys.argv[3]
+ if len(sys.argv) > 4:
+ conf['giturl'] = sys.argv[4]
+
+ server.run_server(conf)
+
+else:
+ import activity
+
+ class WikipediaActivitySimpleEN(activity.WikipediaActivity):
+
+ def __init__(self, handle):
+ self.confvars = configure()
+ activity.WikipediaActivity.__init__(self, handle)
diff --git a/activity_es.py b/activity_es.py
new file mode 100644
index 0000000..7528bb6
--- /dev/null
+++ b/activity_es.py
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+
+
+def configure():
+ confvars = {}
+ confvars['comandline'] = False
+ confvars['path'] = 'es_lat/eswiki-20111112-pages-articles.xml'
+ confvars['port'] = 8000
+ confvars['home_page'] = '/static/index_es.html'
+ confvars['templateprefix'] = 'Plantilla:'
+ confvars['wpheader'] = 'De Wikipedia, la enciclopedia libre'
+ confvars['wpfooter'] = 'Contenido disponible bajo los ' + \
+ 'términos de la <a href="/static/es-gfdl.html">Licencia de ' + \
+ 'documentación libre de GNU</a>. <br/> Wikipedia es una marca ' + \
+ 'registrada de la organización sin ánimo de lucro Wikimedia ' + \
+ 'Foundation, Inc.<br/><a href="/static/about_es.html">Acerca de ' + \
+ 'Wikipedia</a>'
+ confvars['resultstitle'] = "Resultados de la búsqueda sobre '%s'."
+ return confvars
+
+
+if __name__ == '__main__':
+ import server
+ import sys
+ conf = configure()
+ conf['path'] = sys.argv[1]
+ conf['port'] = int(sys.argv[2])
+ conf['comandline'] = True
+
+ if len(sys.argv) > 3:
+ conf['editdir'] = sys.argv[3]
+ if len(sys.argv) > 4:
+ conf['giturl'] = sys.argv[4]
+
+ server.run_server(conf)
+
+else:
+ import activity
+
+ class WikipediaActivityES(activity.WikipediaActivity):
+
+ def __init__(self, handle):
+ self.confvars = configure()
+ activity.WikipediaActivity.__init__(self, handle)
diff --git a/activity_fr.py b/activity_fr.py
new file mode 100644
index 0000000..620660b
--- /dev/null
+++ b/activity_fr.py
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+
+
+def configure():
+ confvars = {}
+ confvars['comandline'] = False
+ confvars['path'] = 'fr/frwiki-20111231-pages-articles.xml'
+ confvars['port'] = 8005
+ confvars['home_page'] = '/static/index_fr.html'
+ confvars['templateprefix'] = u'Modèle:'
+ confvars['wpheader'] = 'Un article de Wikipédia, l\'encyclopédie libre'
+ confvars['wpfooter'] = 'Contenu disponible sous '+ \
+ 'Conditions de l\'<a licence href="/static/es-gfdl.html"> '+ \
+ 'GNU Free Documentation </a>. Wikipedia est une marque déposée <br/> '+ \
+ 'organisme enregistré à but non lucratif Wikimedia '+ \
+ 'Foundation, Inc <br/> href="/static/about_fr.html"> <a propos '+ \
+ 'Wikipedia </a>'
+ confvars['resultstitle'] = "Résultats de recherche pour '%s'."
+ return confvars
+
+
+if __name__ == '__main__':
+ import server
+ import sys
+ conf = configure()
+ conf['path'] = sys.argv[1]
+ conf['port'] = int(sys.argv[2])
+ conf['comandline'] = True
+
+ if len(sys.argv) > 3:
+ conf['editdir'] = sys.argv[3]
+ if len(sys.argv) > 4:
+ conf['giturl'] = sys.argv[4]
+
+ server.run_server(conf)
+
+else:
+ import activity
+
+ class WikipediaActivityFR(activity.WikipediaActivity):
+
+ def __init__(self, handle):
+ self.confvars = configure()
+ activity.WikipediaActivity.__init__(self, handle)
diff --git a/activity_gn.py b/activity_gn.py
new file mode 100644
index 0000000..acf2789
--- /dev/null
+++ b/activity_gn.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+
+
+def configure():
+ confvars = {}
+ confvars['comandline'] = False
+ confvars['path'] = 'gn/gnwiki-20120220-pages-articles.xml'
+ confvars['port'] = 8008
+ confvars['home_page'] = '/static/index_gn.html'
+ confvars['templateprefix'] = u'Tembiecharã:'
+ confvars['wpheader'] = 'From Wikipedia, The Free Encyclopedia'
+ confvars['wpfooter'] = 'Content available under the ' + \
+ '<a href="/static/es-gfdl.html">GNU Free Documentation License</a>.' + \
+ ' <br/> Wikipedia is a registered trademark of the non-profit ' + \
+ 'Wikimedia Foundation, Inc.<br/><a href="/static/about_en.html">' + \
+ 'About Wikipedia</a>'
+ confvars['resultstitle'] = "Search results for '%s'."
+ return confvars
+
+
+if __name__ == '__main__':
+ import server
+ import sys
+ conf = configure()
+ conf['path'] = sys.argv[1]
+ conf['port'] = int(sys.argv[2])
+ conf['comandline'] = True
+
+ if len(sys.argv) > 3:
+ conf['editdir'] = sys.argv[3]
+ if len(sys.argv) > 4:
+ conf['giturl'] = sys.argv[4]
+
+ server.run_server(conf)
+
+else:
+ import activity
+
+ class WikipediaActivityGN(activity.WikipediaActivity):
+
+ def __init__(self, handle):
+ self.confvars = configure()
+ activity.WikipediaActivity.__init__(self, handle)
diff --git a/activity_pl.py b/activity_pl.py
new file mode 100644
index 0000000..3046cd3
--- /dev/null
+++ b/activity_pl.py
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+
+
+def configure():
+ confvars = {}
+ confvars['comandline'] = False
+ confvars['path'] = 'pl/plwiki-20111227-pages-articles.xml'
+ confvars['port'] = 8003
+ confvars['home_page'] = '/static/index_pl.html'
+ confvars['templateprefix'] = 'Szablon:'
+ confvars['wpheader'] = 'Z Wikipedii, Wolnej Encyklopedii'
+
+ confvars['wpfooter'] = 'Materiały dostępne na licencji ' + \
+ '<a href="/static/es-gfdl.html">GNU Licencja Wolnej Dokumentacji</a>' + \
+ '<br/>Wikipedia to zarejestrowany znak towarowy organizacji non-profit' + \
+ 'Wikimedia Foundation, Inc.<br/><a href="/static/about_pl.html">' + \
+ 'O Wikipedii</a>'
+ confvars['resultstitle'] = "Rezultat wyszukiwania dla '%s."
+ return confvars
+
+
+if __name__ == '__main__':
+ import server
+ import sys
+ conf = configure()
+ conf['path'] = sys.argv[1]
+ conf['port'] = int(sys.argv[2])
+ conf['comandline'] = True
+
+ if len(sys.argv) > 3:
+ conf['editdir'] = sys.argv[3]
+ if len(sys.argv) > 4:
+ conf['giturl'] = sys.argv[4]
+
+ server.run_server(conf)
+
+else:
+ import activity
+
+ class WikipediaActivityPL(activity.WikipediaActivity):
+
+ def __init__(self, handle):
+ self.confvars = configure()
+ activity.WikipediaActivity.__init__(self, handle)
diff --git a/activity_qu.py b/activity_qu.py
new file mode 100644
index 0000000..96e7d71
--- /dev/null
+++ b/activity_qu.py
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+
+
+def configure():
+ confvars = {}
+ confvars['comandline'] = False
+ confvars['path'] = 'qu/quwiki-20111228-pages-articles.xml'
+ confvars['port'] = 8002
+ confvars['home_page'] = '/static/index_qu.html'
+ confvars['templateprefix'] = 'Plantilla:'
+ confvars['wpheader'] = 'De Wikipedia, la enciclopedia libre'
+ confvars['wpfooter'] = 'Contenido disponible bajo los ' + \
+ 'términos de la <a href="/static/es-gfdl.html">Licencia de ' + \
+ 'documentación libre de GNU</a>. <br/> Wikipedia es una marca ' + \
+ 'registrada de la organización sin ánimo de lucro Wikimedia ' + \
+ 'Foundation, Inc.<br/><a href="/static/about_es.html">Acerca de ' + \
+ 'Wikipedia</a>'
+ confvars['resultstitle'] = "Resultados de la búsqueda sobre '%s'."
+ return confvars
+
+
+if __name__ == '__main__':
+ import server
+ import sys
+ conf = configure()
+ conf['path'] = sys.argv[1]
+ conf['port'] = int(sys.argv[2])
+ conf['comandline'] = True
+
+ if len(sys.argv) > 3:
+ conf['editdir'] = sys.argv[3]
+ if len(sys.argv) > 4:
+ conf['giturl'] = sys.argv[4]
+
+ server.run_server(conf)
+
+else:
+ import activity
+
+ class WikipediaActivityQU(activity.WikipediaActivity):
+
+ def __init__(self, handle):
+ self.confvars = configure()
+ activity.WikipediaActivity.__init__(self, handle)
diff --git a/activity_rw.py b/activity_rw.py
new file mode 100644
index 0000000..1d13be3
--- /dev/null
+++ b/activity_rw.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+
+
+def configure():
+ confvars = {}
+ confvars['comandline'] = False
+ confvars['path'] = 'rw/rwwiki-20120127-pages-articles.xml'
+ confvars['port'] = 8007
+ confvars['home_page'] = '/static/index_rw.html'
+ confvars['templateprefix'] = 'Template:'
+ confvars['wpheader'] = 'From Wikipedia, The Free Encyclopedia'
+ confvars['wpfooter'] = 'Content available under the ' + \
+ '<a href="/static/es-gfdl.html">GNU Free Documentation License</a>.' + \
+ ' <br/> Wikipedia is a registered trademark of the non-profit ' + \
+ 'Wikimedia Foundation, Inc.<br/><a href="/static/about_en.html">' + \
+ 'About Wikipedia</a>'
+ confvars['resultstitle'] = "Search results for '%s'."
+ return confvars
+
+
+if __name__ == '__main__':
+ import server
+ import sys
+ conf = configure()
+ conf['path'] = sys.argv[1]
+ conf['port'] = int(sys.argv[2])
+ conf['comandline'] = True
+
+ if len(sys.argv) > 3:
+ conf['editdir'] = sys.argv[3]
+ if len(sys.argv) > 4:
+ conf['giturl'] = sys.argv[4]
+
+ server.run_server(conf)
+
+else:
+ import activity
+
+ class WikipediaActivityRW(activity.WikipediaActivity):
+
+ def __init__(self, handle):
+ self.confvars = configure()
+ activity.WikipediaActivity.__init__(self, handle)
diff --git a/bin/armv7l/bzip-table b/bin/armv7l/bzip-table
new file mode 100755
index 0000000..de0f0d2
--- /dev/null
+++ b/bin/armv7l/bzip-table
Binary files differ
diff --git a/bin/armv7l/seek-bunzip b/bin/armv7l/seek-bunzip
new file mode 100755
index 0000000..602ae68
--- /dev/null
+++ b/bin/armv7l/seek-bunzip
Binary files differ
diff --git a/bin/linux32/bzip-table b/bin/linux32/bzip-table
new file mode 100755
index 0000000..93da1bf
--- /dev/null
+++ b/bin/linux32/bzip-table
Binary files differ
diff --git a/bin/linux32/seek-bunzip b/bin/linux32/seek-bunzip
new file mode 100755
index 0000000..50f35f0
--- /dev/null
+++ b/bin/linux32/seek-bunzip
Binary files differ
diff --git a/bin/linux64/bzip-table b/bin/linux64/bzip-table
new file mode 100755
index 0000000..73874e7
--- /dev/null
+++ b/bin/linux64/bzip-table
Binary files differ
diff --git a/bin/linux64/seek-bunzip b/bin/linux64/seek-bunzip
new file mode 100755
index 0000000..81e324c
--- /dev/null
+++ b/bin/linux64/seek-bunzip
Binary files differ
diff --git a/binarylibs/armv7l_27/_expander.so b/binarylibs/armv7l_27/_expander.so
new file mode 100755
index 0000000..2ce640e
--- /dev/null
+++ b/binarylibs/armv7l_27/_expander.so
Binary files differ
diff --git a/binarylibs/armv7l_27/_mwscan.so b/binarylibs/armv7l_27/_mwscan.so
new file mode 100755
index 0000000..346f432
--- /dev/null
+++ b/binarylibs/armv7l_27/_mwscan.so
Binary files differ
diff --git a/binarylibs/armv7l_27/_wp.so b/binarylibs/armv7l_27/_wp.so
new file mode 100755
index 0000000..c6875ec
--- /dev/null
+++ b/binarylibs/armv7l_27/_wp.so
Binary files differ
diff --git a/binarylibs/linux32_26/_expander.so b/binarylibs/linux32_26/_expander.so
new file mode 100755
index 0000000..e234593
--- /dev/null
+++ b/binarylibs/linux32_26/_expander.so
Binary files differ
diff --git a/binarylibs/linux32_26/_mwscan.so b/binarylibs/linux32_26/_mwscan.so
new file mode 100755
index 0000000..2bb26a8
--- /dev/null
+++ b/binarylibs/linux32_26/_mwscan.so
Binary files differ
diff --git a/binarylibs/linux32_26/_wp.so b/binarylibs/linux32_26/_wp.so
new file mode 100755
index 0000000..0fd3b22
--- /dev/null
+++ b/binarylibs/linux32_26/_wp.so
Binary files differ
diff --git a/binarylibs/linux32_27/_expander.so b/binarylibs/linux32_27/_expander.so
new file mode 100755
index 0000000..0b98cd6
--- /dev/null
+++ b/binarylibs/linux32_27/_expander.so
Binary files differ
diff --git a/binarylibs/linux32_27/_mwscan.so b/binarylibs/linux32_27/_mwscan.so
new file mode 100755
index 0000000..71b6af3
--- /dev/null
+++ b/binarylibs/linux32_27/_mwscan.so
Binary files differ
diff --git a/binarylibs/linux32_27/_wp.so b/binarylibs/linux32_27/_wp.so
new file mode 100755
index 0000000..b5b536e
--- /dev/null
+++ b/binarylibs/linux32_27/_wp.so
Binary files differ
diff --git a/binarylibs/linux64_27/_expander.so b/binarylibs/linux64_27/_expander.so
new file mode 100755
index 0000000..038f35a
--- /dev/null
+++ b/binarylibs/linux64_27/_expander.so
Binary files differ
diff --git a/binarylibs/linux64_27/_mwscan.so b/binarylibs/linux64_27/_mwscan.so
new file mode 100755
index 0000000..d498c93
--- /dev/null
+++ b/binarylibs/linux64_27/_mwscan.so
Binary files differ
diff --git a/binarylibs/linux64_27/_wp.so b/binarylibs/linux64_27/_wp.so
new file mode 100755
index 0000000..09c47e6
--- /dev/null
+++ b/binarylibs/linux64_27/_wp.so
Binary files differ
diff --git a/cert8.db b/cert8.db
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/cert8.db
@@ -0,0 +1 @@
+
diff --git a/data_repository.cfg b/data_repository.cfg
new file mode 100644
index 0000000..45a4a47
--- /dev/null
+++ b/data_repository.cfg
@@ -0,0 +1,6 @@
+[repository]
+url = http://dev.laptop.org/~gonzalo/wikiserver/
+
+[last_versions]
+en = en_US/en_US-1.zip
+es = es_PE/es_PE-1.zip
diff --git a/dataretriever.py b/dataretriever.py
new file mode 100644
index 0000000..1f84dc6
--- /dev/null
+++ b/dataretriever.py
@@ -0,0 +1,187 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# create index
+
+from subprocess import Popen, PIPE, STDOUT
+import re
+import os
+import logging
+
+import sqlite3
+
+
+def normalize_title(title):
+ return title.strip().replace(' ', '_').capitalize()
+
+
+class DataRetriever():
+
+ def __init__(self, system_id, data_files_base):
+ self.system_id = system_id
+ self._bzip_file_name = '%s.processed.bz2' % data_files_base
+ self._bzip_table_file_name = '%s.processed.bz2t' % data_files_base
+ self.template_re = re.compile('({{.*?}})')
+ base_path = os.path.dirname(data_files_base)
+ self._db_path = os.path.join(base_path, "search.db")
+ # TODO: I need control cache size
+ self.templates_cache = {}
+
+ def check_existence(self, article_title):
+ article_title = normalize_title(article_title)
+ num_block, posi = self._get_article_position(article_title)
+ return num_block > -1 and posi > -1
+
+ def _get_article_position(self, article_title):
+ article_title = normalize_title(article_title)
+ # look at the title in the index database
+ conn = sqlite3.connect(self._db_path)
+ if article_title.find('"'):
+ article_title = article_title.replace('"', '')
+
+ sql = 'SELECT * from articles where title ="%s"' % article_title
+ results = conn.execute(sql)
+ try:
+ row = results.next()
+ num_block = row[1]
+ position = row[2]
+ redirect_to = row[3]
+ logging.error('Search article %s returns %s',
+ article_title, row)
+ except:
+ num_block = -1
+ position = -1
+ conn.close()
+
+ if num_block == 0 and position == 0:
+ # if block and position = 0 serach with the redirect_to value
+ num_block2, position2 = \
+ self._get_article_position(redirect_to)
+ if num_block2 == 0 and position2 == 0:
+ logging.error('Prevent recursion')
+ return -1, -1
+ else:
+ return num_block2, position2
+ return num_block, position
+
+ def check_existence_list(self, article_title_list):
+ if not article_title_list:
+ return []
+
+ conn = sqlite3.connect(self._db_path)
+ search_list = '('
+ for article_title in article_title_list:
+ search_list = search_list + \
+ '"' + normalize_title(article_title) + '",'
+ search_list = search_list[:-1] + ')'
+ #logging.error(search_list)
+ sql = 'SELECT * from articles where title in %s' % search_list
+ #logging.error(sql)
+ results = conn.execute(sql)
+ row = results.next()
+ articles = []
+ try:
+ while row:
+ articles.append(row[0])
+ row = results.next()
+ except:
+ pass
+ conn.close()
+ return articles
+
+ def search(self, article_title):
+ conn = sqlite3.connect(self._db_path)
+ search_word = '%' + article_title + '%'
+ sql = "SELECT * from articles where title like'%s'" % search_word
+ results = conn.execute(sql)
+ row = results.next()
+ articles = []
+ try:
+ while row:
+ articles.append(row[0])
+ row = results.next()
+ except:
+ pass
+ conn.close()
+ return articles
+
+ def _get_block_start(self, num_block):
+ bzip_table_file = open(self._bzip_table_file_name, mode='r')
+ n = num_block
+ table_line = ''
+ while n > 0:
+ table_line = bzip_table_file.readline()
+ n -= 1
+ if table_line == '':
+ return -1
+ parts = table_line.split()
+ block_start = int(parts[0])
+ bzip_table_file.close()
+ return block_start
+
+ def get_expanded_article(self, article_title):
+ """
+ This method does not do real template expansion
+ is only used to test all the needed templates and redirects are
+ available.
+ """
+ text_article = self.get_text_article(article_title)
+ expanded_article = ''
+ parts = self.template_re.split(text_article)
+ for part in parts:
+ if part.startswith('{{'):
+ part = part[2:-2]
+ #print "TEMPLATE: %s" % part
+ if part.find('|') > -1:
+ template_name = part[:part.find('|')]
+ else:
+ template_name = part
+ # TODO: Plantilla should be a parameter
+ template_name = normalize_title('Plantilla:%s' % template_name)
+ if template_name in self.templates_cache:
+ expanded_article += self.templates_cache[template_name]
+ else:
+ templates_content = self.get_text_article(template_name)
+ expanded_article += templates_content
+ self.templates_cache[template_name] = templates_content
+ else:
+ expanded_article += part
+ return expanded_article
+
+ def get_text_article(self, article_title):
+ #print "Looking for article %s" % article_title
+ num_block, position = self._get_article_position(article_title)
+ #print "Found at block %d position %d" % (num_block, position)
+ return self._get_block_text(num_block, position)
+
+ def _get_block_text(self, num_block, position):
+ output = ''
+ block_start = self._get_block_start(num_block)
+ #print "Block %d starts at %d" % (num_block, block_start)
+ if block_start == -1:
+ return ""
+
+ # extract the block
+ bzip_file = open(self._bzip_file_name, mode='r')
+ cmd = ['./bin/%s/seek-bunzip' % self.system_id, str(block_start)]
+ p = Popen(cmd, stdin=bzip_file, stdout=PIPE, stderr=STDOUT,
+ close_fds=True)
+
+ while position > 0:
+ line = p.stdout.readline()
+ position -= len(line)
+
+ finish = False
+ while not finish:
+ line = p.stdout.readline()
+ if line == '':
+ # end of block?
+ output += self._get_block_text(num_block + 1, 0)
+ break
+ if len(line) == 2:
+ if ord(line[0]) == 3:
+ finish = True
+ break
+ output += line
+ p.stdout.close()
+ #logging.error(output)
+ return output
diff --git a/en/enwiki-20111201-pages-articles.xml.processed.bz2 b/en/enwiki-20111201-pages-articles.xml.processed.bz2
new file mode 100644
index 0000000..eb304e5
--- /dev/null
+++ b/en/enwiki-20111201-pages-articles.xml.processed.bz2
Binary files differ
diff --git a/en/enwiki-20111201-pages-articles.xml.processed.bz2t b/en/enwiki-20111201-pages-articles.xml.processed.bz2t
new file mode 100644
index 0000000..ac56dbf
--- /dev/null
+++ b/en/enwiki-20111201-pages-articles.xml.processed.bz2t
@@ -0,0 +1,512 @@
+32 900052
+1977937 900138
+3937288 900970
+5832327 899422
+7786646 900028
+9712313 900261
+11687029 900461
+13596246 900286
+15558193 901249
+17568615 900773
+19582168 900200
+21576781 902610
+23546943 901760
+24320971 901736
+24453391 901210
+25631053 900518
+27595597 903838
+29629642 901736
+31597179 900781
+33629430 901516
+35624588 901150
+37656632 900447
+39586087 901317
+41544794 900138
+43655950 901376
+45683182 901142
+47678218 901651
+49735945 900918
+51716890 901605
+53717297 901809
+55631337 898735
+57443039 895991
+58948384 898305
+60872979 899450
+62595483 899470
+64148192 897845
+65857793 897405
+67597469 896608
+69270776 900289
+71258134 903201
+73187137 899527
+75070394 900220
+77044979 900483
+78991476 901190
+80999998 902178
+82988163 904058
+84813261 902192
+86678638 900099
+88330429 903402
+89139374 901086
+91074603 903335
+92934149 900223
+94901813 900929
+96939256 902069
+99000450 900765
+101040880 900173
+103073172 901741
+105065611 901680
+105351811 901023
+107393263 900551
+109224964 901480
+110895567 900013
+112831958 900060
+114634017 900609
+116324203 897766
+117284859 898343
+118884289 901645
+120709206 901125
+122534034 900742
+124479047 901442
+126449921 900033
+127922348 902327
+129345486 903283
+130545579 904434
+131661789 903015
+133208870 901925
+135187752 901913
+137194685 902066
+139120933 900756
+141118617 901812
+143163873 899770
+143603658 899419
+143775931 900402
+145259621 898966
+147253018 898193
+149086298 901940
+150932244 901591
+152737478 900634
+154703268 902964
+156690961 900570
+158717040 901665
+160731120 899859
+162732695 900941
+164725463 899067
+166559731 900565
+168447350 900170
+170354386 900828
+172332098 896851
+173696349 922602
+175703589 902385
+177562681 899870
+179366960 899221
+181137716 901064
+183003738 900511
+185008936 901205
+187037325 901176
+189035214 900701
+191044537 901268
+193060971 901682
+194753136 903360
+196586432 896177
+197382362 899795
+199118965 900307
+201015493 900944
+202972328 901189
+205024442 901653
+207119653 902026
+209257818 900937
+211287309 901512
+213280870 901692
+215165365 901013
+217207772 901401
+219285180 900084
+219962938 899422
+220135036 899750
+220646086 899448
+220816370 899521
+221361563 899828
+223355437 904214
+225055031 900031
+227004852 901160
+228882080 901338
+230793552 899639
+232799322 898382
+234565198 901036
+236585596 900533
+238554504 900358
+240425483 901699
+242383986 899937
+244388230 899923
+246322248 900864
+248356552 900535
+250320103 899063
+252386982 900965
+253594584 901583
+255498893 900238
+257452357 902822
+259381261 901580
+261291693 900219
+263207058 899880
+265003153 900848
+266893520 901211
+268857515 897208
+270720356 899977
+272592036 900340
+274524969 901075
+276507287 900565
+278377462 900102
+280221121 899381
+282107473 902525
+284026118 900772
+285949830 899984
+287906628 902033
+289920704 900921
+291965074 901959
+293934777 902014
+295956932 901707
+297768646 901485
+299682094 901075
+301615450 901565
+303668948 901632
+305643582 902053
+307550494 902133
+309622765 901524
+311645325 901748
+313602100 902053
+315658021 901227
+317648813 901923
+319628058 900389
+321484937 904225
+323130833 901892
+325041492 902946
+326981855 901288
+329043925 901836
+329767152 901417
+331341096 901234
+333453499 900984
+335332739 901032
+337407646 900818
+339466268 902755
+341477369 901511
+343346905 901728
+344875589 902566
+346280624 902778
+348059816 902214
+349677455 901723
+351297379 901507
+351897423 901447
+352844330 901144
+354909842 901551
+356952060 903466
+358817258 900458
+360721811 901812
+362722146 899055
+364766303 901153
+366729611 899220
+368504568 899641
+370239953 899591
+372049585 901297
+374013914 902937
+375949302 900812
+377995560 900694
+379994997 899920
+381841041 900378
+383854490 901399
+385862038 901493
+387918133 898968
+389472594 901449
+390130329 901706
+390263294 901716
+390411576 901694
+390548509 901541
+390834312 901743
+390993732 901703
+391213138 901715
+391336446 901714
+391441421 901706
+391546723 901713
+391651748 901700
+391792973 901696
+391981877 901519
+392399515 901383
+392967013 901735
+393091519 901736
+393204613 901236
+394461787 900666
+396465679 900918
+398549531 902342
+400482527 903710
+402464041 901085
+404456604 906128
+406323660 902032
+408133382 902008
+410141754 901498
+411539713 901689
+413211073 901311
+414914845 901354
+416898139 900329
+418907939 900560
+420867890 900609
+422866608 900353
+424489369 901809
+426526334 901136
+428558102 901396
+430655367 901064
+432709440 901476
+434747010 901058
+436842678 900993
+438864592 901215
+440728795 900481
+442630933 900684
+444395561 900746
+446391781 895797
+447746375 893468
+448953984 900178
+450909364 899513
+452743535 898121
+454610694 901422
+456564320 900658
+458559204 901854
+460575130 899621
+462034384 899459
+462203911 899531
+462564602 901491
+464623914 901787
+466615157 900655
+468761747 900935
+470828382 900323
+472909726 900136
+474876449 901011
+476757993 902085
+478651469 901743
+480407436 900266
+481611352 901507
+483420463 898060
+485148096 902919
+487014506 900252
+488950892 902570
+490691300 902290
+492533316 899041
+494359559 902058
+496243694 900665
+498301334 900300
+500350782 901468
+502345812 906241
+504086354 903114
+506021510 919050
+507895463 898994
+509581047 897226
+511247514 901526
+512608344 900505
+514576326 901032
+516546588 901923
+518481436 901279
+520424897 901824
+522358091 901303
+524304426 901102
+526208665 901665
+528134912 900834
+530156802 899550
+532303286 899979
+534397544 900951
+536477018 900794
+538616137 900924
+540723304 899053
+542727767 901453
+544894492 900843
+546999753 899629
+549103207 901399
+551141625 901397
+553045564 901004
+555034864 901668
+557057798 900860
+558971154 900978
+560987299 900626
+562969477 897634
+564336875 901747
+564480969 901731
+564596892 901662
+564803590 901707
+564926915 901733
+565059224 901732
+565185175 901754
+565320746 901729
+565438698 901617
+565754246 901611
+565961115 901607
+566455149 900437
+568445302 901188
+570520352 901194
+572546531 901745
+572668451 901943
+573956387 901233
+575787910 901005
+577666865 901432
+579627235 900724
+581605058 900991
+583661356 900820
+585789163 900099
+587776406 900810
+589864139 901707
+591948846 900954
+594018432 900069
+595999088 901424
+597883117 899297
+599691170 899637
+601675181 901073
+603624680 901179
+605719441 900362
+607598041 901213
+609623850 900520
+611642272 901607
+613658004 899258
+615603079 901635
+617617366 902274
+619609726 902153
+621729077 901328
+623228727 900304
+625232707 900767
+627248077 901541
+629276191 901332
+631311015 901620
+633394134 901345
+635513832 902077
+637442799 901794
+639469638 901314
+641552866 901617
+643669298 901092
+645711951 901780
+647668229 901918
+649691157 901573
+651636596 902498
+653687431 899774
+655687430 901641
+657724949 902111
+659681377 901760
+661599101 901523
+663546290 901686
+665534440 902221
+666774719 901716
+666916970 901446
+668095274 902781
+670099932 901948
+672062339 901626
+674100136 901989
+676185641 901173
+677688143 901717
+677824564 901855
+678039309 901803
+678263757 901741
+678373234 901003
+679715156 901728
+681664450 901467
+683610807 901327
+685715947 901216
+687752383 901978
+689791676 901173
+691726052 899775
+693705148 902283
+695713156 902010
+697578624 902442
+699458213 902068
+701490223 901275
+703535359 899966
+705537101 900752
+707534182 902306
+709437829 901984
+711294449 901361
+713208639 907046
+714769341 902931
+716773131 903693
+718638910 901782
+720682296 902077
+722506822 901763
+724428389 900091
+726413052 900410
+728310215 900675
+730265221 901101
+732286552 901096
+734239729 902962
+736115141 900690
+738000297 901284
+739937623 901482
+741753325 900551
+743656277 902508
+745577141 901491
+747533574 900344
+749434917 905482
+751149465 901685
+753067360 901490
+755011237 901394
+756972769 901238
+758975075 899990
+760961554 900957
+762853833 899432
+763022834 899420
+763194863 900328
+764786171 900592
+766813001 902529
+768781271 906297
+769827865 902298
+771069466 901242
+773180205 901184
+775211146 900857
+777199254 901984
+779156498 901524
+781145462 901806
+783142146 901184
+785208020 900067
+787182157 900507
+788959059 900647
+791036745 901142
+793197396 899646
+795276337 901072
+797287155 900598
+799091447 901832
+800514484 901282
+802534794 900627
+804565401 901386
+806592679 900812
+808570233 901377
+810178124 899450
+810347056 899425
+810519270 901106
+812449541 902093
+814379269 901265
+816304372 901201
+818268770 901686
+820273688 900397
+822109964 902062
+823971542 900882
+825834650 904466
+827793079 901356
+829884641 899391
+831955307 901496
+833959750 901842
+835970809 902084
+837753928 903196
+839763994 901201
+841809673 901779
+843759199 901127
+845680942 902802
+847709131 900304
+849763221 901047
+851634892 905299
+853520415 901542
+855568917 901260
+857683626 901390
+859655370 900723
+861670109 900567
+863680486 901503
+865724632 901469
+867727832 901372
+869803344 900673
+871796215 903593
+873810990 896253
+875643580 899123
+877497924 898853
+879355584 898696
+881225401 898588
+883157638 898273
+885085254 221244
diff --git a/en/search.db b/en/search.db
new file mode 100644
index 0000000..e4721b7
--- /dev/null
+++ b/en/search.db
Binary files differ
diff --git a/icons/add-link.svg b/icons/add-link.svg
new file mode 100644
index 0000000..4f1693a
--- /dev/null
+++ b/icons/add-link.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
+ <!ENTITY stroke_color "#010101">
+ <!ENTITY fill_color "#FFFFFF">
+]><svg enable-background="new 0 0 55 55" height="55px" version="1.1" viewBox="0 0 55 55" width="55px" x="0px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" y="0px"><g display="block" id="share-link">
+ <polygon display="inline" fill="&fill_color;" points="27.5,7.266 34.074,20.588 48.774,22.723 38.138,33.092 40.647,47.734 27.5,40.82 14.353,47.734 16.862,33.092 6.226,22.723 20.926,20.588 " stroke="&stroke_color;" stroke-width="3.5"/>
+</g></svg>
+
diff --git a/icons/browse-close-tab.svg b/icons/browse-close-tab.svg
new file mode 100644
index 0000000..782ad24
--- /dev/null
+++ b/icons/browse-close-tab.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY fill_color "#FFFFFF">
+ <!ENTITY stroke_color "#010101">
+]>
+<svg
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ width="22.16"
+ height="22.16"
+ viewBox="0 0 22.16 22.16"
+ id="browse-close-tab"
+ xml:space="preserve">
+ <g
+ transform="matrix(1.3,0,0,1.3,-3.2682282,-3.3351543)"
+ id="browse-dialog-cancel"
+ style="stroke:&fill_color;;stroke-width:2.69230771;stroke-miterlimit:4;stroke-dasharray:none">
+ <path
+ d="M 14.798121,7.2131543 6.9900671,15.021208"
+ id="path2986"
+ style="fill:none;stroke:&fill_color;;stroke-width:2.69230771;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="M 6.9900671,7.2131543 14.798121,15.021208"
+ id="path3756"
+ style="fill:none;stroke:&fill_color;;stroke-width:2.69230771;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+</svg>
diff --git a/icons/browse-dialog-cancel.svg b/icons/browse-dialog-cancel.svg
new file mode 100644
index 0000000..76e2703
--- /dev/null
+++ b/icons/browse-dialog-cancel.svg
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY fill_color "#FFFFFF">
+ <!ENTITY stroke_color "#010101">
+]>
+<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="22.16" height="22.16" viewBox="0 0 22.16 22.16" id="browse-dialog-cancel" xml:space="preserve">
+ <g transform="matrix(1.3,0,0,1.3,-3.2682282,-3.3351543)" id="browse-dialog-cancel" style="stroke-width:2.69230771;stroke-miterlimit:4;stroke-dasharray:none">
+ <path
+ d="M 14.798121,7.2131543 6.9900671,15.021208"
+ id="path2986"
+ style="fill:none;stroke:&stroke_color;;stroke-width:2.69230771;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="M 6.9900671,7.2131543 14.798121,15.021208"
+ id="path3756"
+ style="fill:none;stroke:&stroke_color;;stroke-width:2.69230771;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+</svg>
diff --git a/icons/browse-follow-link-new-tab.svg b/icons/browse-follow-link-new-tab.svg
new file mode 100644
index 0000000..5173b65
--- /dev/null
+++ b/icons/browse-follow-link-new-tab.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY fill_color "#FFFFFF">
+ <!ENTITY stroke_color "#010101">
+]>
+<svg
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ width="55.125"
+ height="55"
+ viewBox="0 0 55.125 55"
+ id="browse-follow-link-new-tab"
+ xml:space="preserve">
+<g
+ transform="matrix(0.72828114,0,0,0.72828114,7.3907532,18.617266)"
+ id="tab-add"
+ style="display:block">
+ <g
+ transform="scale(0.8,0.8)"
+ id="g5">
+ <g
+ transform="translate(6.5,6.5)"
+ id="g7">
+ <path
+ d="m 0,50 55,0 0,-15 -5,0 0,-25 Q 50,5 45,5 L 10,5 Q 5,5 5,10 L 5,35 0,35 z M 30.768,38.767 c -0.002,1.774 -1.438,3.216 -3.214,3.214 -0.889,10e-4 -1.693,-0.359 -2.275,-0.941 -0.582,-0.581 -0.94,-1.385 -0.94,-2.27 l 0,-8.146 h -8.146 c -0.886,-10e-4 -1.689,-0.359 -2.271,-0.94 -0.582,-0.583 -0.942,-1.388 -0.942,-2.276 0,-1.773 1.439,-3.213 3.217,-3.211 h 8.143 v -8.143 c -0.003,-1.776 1.438,-3.217 3.212,-3.217 1.774,0 3.218,1.438 3.215,3.215 l 0.001,8.145 8.146,0.001 c 1.775,-0.005 3.212,1.438 3.213,3.213 0.002,1.775 -1.441,3.214 -3.215,3.215 h -8.143 v 8.141 z"
+ id="path9"
+ style="fill:&fill_color;" />
+ </g>
+ </g>
+</g>
+<g
+ transform="translate(0,0.55369128)"
+ id="g3868"><line
+ style="fill:none;stroke:&fill_color;;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round"
+ x1="36.448467"
+ x2="19.418867"
+ y1="11.934766"
+ y2="11.934766"
+ id="line15" /><polyline
+ transform="matrix(1.4,0,0,1.4,-2.8453325,2.1725664)"
+ style="fill:none;stroke:&fill_color;;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round"
+ points=" 21.983,1.843 28.067,6.973 21.983,12.104 "
+ id="polyline17" /></g></svg>
diff --git a/icons/browse-follow-link.svg b/icons/browse-follow-link.svg
new file mode 100644
index 0000000..fe79ecd
--- /dev/null
+++ b/icons/browse-follow-link.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY fill_color "#FFFFFF">
+ <!ENTITY stroke_color "#010101">
+]>
+<svg
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ width="55.125"
+ height="55"
+ viewBox="0 0 55.125 55"
+ id="browse-follow-link"
+ xml:space="preserve">
+<g
+ transform="translate(-0.37116731,15.564534)"
+ id="g3868"><line
+ style="fill:none;stroke:&fill_color;;stroke-width:5.25;stroke-linecap:round;stroke-linejoin:round"
+ x1="40.705868"
+ x2="15.161467"
+ y1="11.934416"
+ y2="11.934416"
+ id="line15" /><polyline
+ transform="matrix(2.1,0,0,2.1,-18.234832,-2.7088836)"
+ style="fill:none;stroke:&fill_color;;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round"
+ points=" 21.983,1.843 28.067,6.973 21.983,12.104 "
+ id="polyline17" /></g></svg>
diff --git a/icons/browse-view-refresh.svg b/icons/browse-view-refresh.svg
new file mode 100644
index 0000000..0682978
--- /dev/null
+++ b/icons/browse-view-refresh.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY fill_color "#FFFFFF">
+ <!ENTITY stroke_color "#010101">
+]>
+<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="22.16" height="22.16" viewBox="0 0 22.16 22.16" id="browse-view-refresh" xml:space="preserve">
+ <path
+ d="m 9.769744,17.559712 c -3.044496,-0.6084 -5.33832,-3.295344 -5.33832,-6.51768 0,-3.67224 2.97648,-6.649344 6.646848,-6.649344 3.672864,0 6.649344,2.977104 6.649344,6.649344 0,3.166176 -2.215824,5.816928 -5.18232,6.48648" id="path3220" style="fill:none;stroke:&stroke_color;;stroke-width:2.18400002;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <polyline
+ points=" 22.936,31.578 25.5,37.994 18.746,39.439 "
+ id="polyline3222"
+ style="fill:none;stroke:&stroke_color;;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.624,0,0,0.624,-6.142256,-6.148544)" />
+</svg>
diff --git a/icons/link.svg b/icons/link.svg
new file mode 100644
index 0000000..ee31fbe
--- /dev/null
+++ b/icons/link.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+ <!ENTITY stroke_color "#ff0000">
+ <!ENTITY fill_color "#0000ff">
+]>
+
+<svg version="1.1" id="Icon" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="120" height="110"
+ overflow="visible" xml:space="preserve" viewBox="0 0 120 110" enable-background="new 0 0 120 110">
+ <rect x="0" y="0" width="120" height="110" fill="&fill_color;" stroke="&stroke_color;" stroke-width="4px" />
+</svg>
diff --git a/icons/search-wiki.svg b/icons/search-wiki.svg
new file mode 100644
index 0000000..5562b50
--- /dev/null
+++ b/icons/search-wiki.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+<!ENTITY fill_color "#FFFFFF">
+<!ENTITY stroke_color "#010101">
+]>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="55"
+ height="55"
+ id="svg3061"
+ version="1.1"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="search.svg">
+ <defs
+ id="defs3075" />
+ <g
+ transform="matrix(0.83784436,0,0,0.83784436,-44.323001,11.841727)"
+ id="g3063">
+ <path
+ style="fill:none;stroke:&fill_color;;stroke-width:3.5"
+ d="m 78.613844,7.5069354 c 0,7.5689996 6.131,13.7039996 13.702,13.7039996 7.562,0 13.693996,-6.135 13.693996,-13.7039996 0,-7.56399942 -6.131996,-13.6979988 -13.693996,-13.6979988 -7.571,0 -13.702,6.13399938 -13.702,13.6979988 z"
+ id="path3065"
+ inkscape:connector-curvature="0" />
+ <line
+ style="fill:none;stroke:&fill_color;;stroke-width:3.5"
+ y2="29.005939"
+ y1="17.222942"
+ x2="113.78584"
+ x1="102.00484"
+ id="line3067" />
+ </g>
+ <path
+ style="fill:&fill_color;;stroke:&fill_color;;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4"
+ d="M 27.075248,48.738777 C 20.23619,39.706706 9.309587,48.39518 3.7939838,48.393869 l 0,-6 C 9.309587,42.39518 20.23619,33.706706 27.075248,42.738777 z"
+ id="path3069" />
+ <path
+ d="m 26.84061,48.738777 c 6.839058,-9.032071 17.765661,-0.343597 23.281264,-0.344908 l 0,-6 c -5.515603,0.0013 -16.442206,-8.687163 -23.281264,0.344908 z"
+ style="fill:&fill_color;;stroke:&fill_color;;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4"
+ id="path3071" />
+</svg>
diff --git a/icons/tab-add.svg b/icons/tab-add.svg
new file mode 100644
index 0000000..d307a68
--- /dev/null
+++ b/icons/tab-add.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'[
+ <!ENTITY stroke_color "#010101">
+ <!ENTITY fill_color "#FFFFFF">
+]><svg enable-background="new 0 0 55.125 55" height="55px" version="1.1" viewBox="0 0 55.125 55" width="55.125px" x="0px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" y="0px">
+<g display="block" id="tab-add">
+ <g transform="scale(.80)">
+ <g transform="translate(6.5, 6.5)">
+ <path d="M0,50 l55,0 l0,-15 l-5,0 l0,-25 q0,-5 -5,-5 l-35,0 q-5,0 -5,5 l0,25 l-5,0z M30.768,38.767c-0.002,1.774-1.438,3.216-3.214,3.214c-0.889,0.001-1.693-0.359-2.275-0.941c-0.582-0.581-0.94-1.385-0.94-2.27 l0-8.146h-8.146c-0.886-0.001-1.689-0.359-2.271-0.94c-0.582-0.583-0.942-1.388-0.942-2.276c0-1.773,1.439-3.213,3.217-3.211h8.143 v-8.143c-0.003-1.776,1.438-3.217,3.212-3.217c1.774,0,3.218,1.438,3.215,3.215l0.001,8.145l8.146,0.001 c1.775-0.005,3.212,1.438,3.213,3.213c0.002,1.775-1.441,3.214-3.215,3.215h-8.143V38.767z" fill="&fill_color;"/>
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/load_blacklist_in_server.patch b/load_blacklist_in_server.patch
new file mode 100644
index 0000000..bae1272
--- /dev/null
+++ b/load_blacklist_in_server.patch
@@ -0,0 +1,40 @@
+diff --git a/server.py b/server.py
+index 074acc5..943d59f 100755
+--- a/server.py
++++ b/server.py
+@@ -522,6 +522,7 @@ class WikiRequestHandler(SimpleHTTPRequestHandler):
+ self.lang = conf['lang']
+ self.templateprefix = conf['templateprefix']
+ self.templateblacklist = set(conf['templateblacklist'])
++ self.articles_blacklist = conf['articles_blacklist']
+ self.wpheader = conf['wpheader']
+ self.wpfooter = conf['wpfooter']
+ self.resultstitle = conf['resultstitle']
+@@ -823,7 +824,8 @@ class WikiRequestHandler(SimpleHTTPRequestHandler):
+ results = searcher.search(query, limit=None)
+ articles = []
+ for n in range(results.scored_length()):
+- articles.append(results[n]['title'])
++ if results[n]['title'] not in self.articles_blacklist:
++ articles.append(results[n]['title'])
+ return articles
+
+ def send_image(self, path):
+@@ -930,6 +932,17 @@ def run_server(confvars):
+ confvars['lang'] = confvars['path'][0:2]
+ confvars['flang'] = os.path.basename(confvars['path'])[0:5]
+
++ articles_blacklist = []
++ articles_blacklistpath = os.path.join(os.path.dirname(confvars['path']),
++ 'blacklist_%s.txt' % confvars['lang'])
++ if os.path.exists(articles_blacklistpath):
++ with codecs.open(articles_blacklistpath, 'r', encoding='utf-8') as f:
++ for line in f.readlines():
++ articles_blacklist.append(line.rstrip().decode('utf8'))
++ print "Read %d blacklisted articles" % len(articles_blacklist)
++
++ confvars['articles_blacklist'] = articles_blacklist
++
+ wikidb = WPWikiDB(confvars['path'], confvars['lang'],
+ confvars['templateprefix'], confvars['templateblacklist'])
+
diff --git a/load_blacklist_in_setup_new_wiki.patch b/load_blacklist_in_setup_new_wiki.patch
new file mode 100644
index 0000000..8ebd197
--- /dev/null
+++ b/load_blacklist_in_setup_new_wiki.patch
@@ -0,0 +1,38 @@
+diff --git a/setup_new_wiki.py b/setup_new_wiki.py
+index 0a5e829..df039fa 100755
+--- a/setup_new_wiki.py
++++ b/setup_new_wiki.py
+@@ -30,9 +30,10 @@ IGNORE_FILES = ['.gitignore', 'MANIFEST', '*.pyc', '*~', '*.bak', 'pseudo.po']
+
+ class WikiXOPackager(bundlebuilder.XOPackager):
+
+- def __init__(self, builder, data_file):
++ def __init__(self, builder, data_file, lang):
+ bundlebuilder.XOPackager.__init__(self, builder)
+ self.data_file = data_file
++ self.lang = lang
+
+ def package(self):
+ bundle_zip = zipfile.ZipFile(self.package_path, 'w',
+@@ -72,6 +73,14 @@ class WikiXOPackager(bundlebuilder.XOPackager):
+ os.path.join(self.config.bundle_root_dir,
+ images_path, f))
+
++ # add the articles blacklist
++ articles_blacklist_path = os.path.join(data_path,
++ 'blacklist_%s.txt' % self.lang)
++ if os.path.exists(articles_blacklist_path):
++ bundle_zip.write(articles_blacklist_path,
++ os.path.join(self.config.bundle_root_dir,
++ articles_blacklist_path))
++
+ bundle_zip.close()
+
+ def list_files(self, base_dir, filter_directories=False):
+@@ -125,5 +134,5 @@ if __name__ == '__main__':
+ shutil.copyfile(f, 'activity/activity.info')
+
+ config = bundlebuilder.Config()
+- packager = WikiXOPackager(bundlebuilder.Builder(config), data_file)
++ packager = WikiXOPackager(bundlebuilder.Builder(config), data_file, lang)
+ packager.package()
diff --git a/locale/af/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/af/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..311ce8c
--- /dev/null
+++ b/locale/af/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/af/activity.linfo b/locale/af/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/af/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/am/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/am/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..d48667d
--- /dev/null
+++ b/locale/am/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/am/activity.linfo b/locale/am/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/am/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/ar/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/ar/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..05d8538
--- /dev/null
+++ b/locale/ar/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/ar/activity.linfo b/locale/ar/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/ar/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/ay/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/ay/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..d280b6c
--- /dev/null
+++ b/locale/ay/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/ay/activity.linfo b/locale/ay/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/ay/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/bg/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/bg/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..790e66b
--- /dev/null
+++ b/locale/bg/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/bg/activity.linfo b/locale/bg/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/bg/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/bi/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/bi/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..0e8e908
--- /dev/null
+++ b/locale/bi/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/bi/activity.linfo b/locale/bi/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/bi/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/bn/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/bn/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..f3c9aa0
--- /dev/null
+++ b/locale/bn/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/bn/activity.linfo b/locale/bn/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/bn/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/bn_IN/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/bn_IN/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..6991472
--- /dev/null
+++ b/locale/bn_IN/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/bn_IN/activity.linfo b/locale/bn_IN/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/bn_IN/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/ca/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/ca/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..9096bae
--- /dev/null
+++ b/locale/ca/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/ca/activity.linfo b/locale/ca/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/ca/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/cpp/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/cpp/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..0e8e908
--- /dev/null
+++ b/locale/cpp/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/cpp/activity.linfo b/locale/cpp/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/cpp/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/cs/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/cs/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..f6a9f19
--- /dev/null
+++ b/locale/cs/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/cs/activity.linfo b/locale/cs/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/cs/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/da/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/da/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..35afa93
--- /dev/null
+++ b/locale/da/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/da/activity.linfo b/locale/da/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/da/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/de/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/de/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..3622918
--- /dev/null
+++ b/locale/de/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/de/activity.linfo b/locale/de/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/de/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/dz/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/dz/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..334102a
--- /dev/null
+++ b/locale/dz/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/dz/activity.linfo b/locale/dz/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/dz/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/el/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/el/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..4455ad4
--- /dev/null
+++ b/locale/el/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/el/activity.linfo b/locale/el/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/el/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/en/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/en/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..4a9ef8c
--- /dev/null
+++ b/locale/en/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/en/activity.linfo b/locale/en/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/en/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/en_US/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/en_US/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..2c5c3e5
--- /dev/null
+++ b/locale/en_US/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/en_US/activity.linfo b/locale/en_US/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/en_US/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/es/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/es/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..316ad00
--- /dev/null
+++ b/locale/es/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/es/activity.linfo b/locale/es/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/es/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/fa/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/fa/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..5c4d2df
--- /dev/null
+++ b/locale/fa/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/fa/activity.linfo b/locale/fa/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/fa/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/fa_AF/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/fa_AF/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..2a05448
--- /dev/null
+++ b/locale/fa_AF/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/fa_AF/activity.linfo b/locale/fa_AF/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/fa_AF/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/ff/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/ff/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..d280b6c
--- /dev/null
+++ b/locale/ff/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/ff/activity.linfo b/locale/ff/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/ff/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/fi/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/fi/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..0e8e908
--- /dev/null
+++ b/locale/fi/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/fi/activity.linfo b/locale/fi/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/fi/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/fil/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/fil/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..7fdc0c9
--- /dev/null
+++ b/locale/fil/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/fil/activity.linfo b/locale/fil/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/fil/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/fr/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/fr/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..7bb82bf
--- /dev/null
+++ b/locale/fr/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/fr/activity.linfo b/locale/fr/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/fr/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/gu/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/gu/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..d280b6c
--- /dev/null
+++ b/locale/gu/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/gu/activity.linfo b/locale/gu/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/gu/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/ha/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/ha/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..d280b6c
--- /dev/null
+++ b/locale/ha/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/ha/activity.linfo b/locale/ha/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/ha/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/he/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/he/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..851793c
--- /dev/null
+++ b/locale/he/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/he/activity.linfo b/locale/he/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/he/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/hi/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/hi/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..78a79c1
--- /dev/null
+++ b/locale/hi/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/hi/activity.linfo b/locale/hi/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/hi/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/ht/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/ht/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..ed6da69
--- /dev/null
+++ b/locale/ht/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/ht/activity.linfo b/locale/ht/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/ht/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/hu/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/hu/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..eeedebe
--- /dev/null
+++ b/locale/hu/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/hu/activity.linfo b/locale/hu/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/hu/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/id/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/id/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..0172447
--- /dev/null
+++ b/locale/id/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/id/activity.linfo b/locale/id/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/id/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/ig/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/ig/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..d280b6c
--- /dev/null
+++ b/locale/ig/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/ig/activity.linfo b/locale/ig/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/ig/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/is/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/is/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..98cfa08
--- /dev/null
+++ b/locale/is/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/is/activity.linfo b/locale/is/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/is/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/it/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/it/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..08220ed
--- /dev/null
+++ b/locale/it/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/it/activity.linfo b/locale/it/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/it/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/ja/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/ja/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..73865f9
--- /dev/null
+++ b/locale/ja/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/ja/activity.linfo b/locale/ja/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/ja/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/km/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/km/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..5e77371
--- /dev/null
+++ b/locale/km/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/km/activity.linfo b/locale/km/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/km/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/ko/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/ko/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..ebc1f25
--- /dev/null
+++ b/locale/ko/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/ko/activity.linfo b/locale/ko/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/ko/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/kos/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/kos/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..1426cdd
--- /dev/null
+++ b/locale/kos/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/kos/activity.linfo b/locale/kos/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/kos/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/mg/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/mg/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..e4aec7b
--- /dev/null
+++ b/locale/mg/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/mg/activity.linfo b/locale/mg/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/mg/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/mi/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/mi/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..0e8e908
--- /dev/null
+++ b/locale/mi/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/mi/activity.linfo b/locale/mi/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/mi/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/mk/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/mk/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..e87138b
--- /dev/null
+++ b/locale/mk/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/mk/activity.linfo b/locale/mk/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/mk/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/ml/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/ml/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..d280b6c
--- /dev/null
+++ b/locale/ml/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/ml/activity.linfo b/locale/ml/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/ml/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/mn/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/mn/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..6dc468d
--- /dev/null
+++ b/locale/mn/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/mn/activity.linfo b/locale/mn/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/mn/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/mr/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/mr/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..608515c
--- /dev/null
+++ b/locale/mr/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/mr/activity.linfo b/locale/mr/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/mr/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/ms/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/ms/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..0e8e908
--- /dev/null
+++ b/locale/ms/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/ms/activity.linfo b/locale/ms/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/ms/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/mvo/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/mvo/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..0e8e908
--- /dev/null
+++ b/locale/mvo/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/mvo/activity.linfo b/locale/mvo/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/mvo/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/nb/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/nb/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..2965944
--- /dev/null
+++ b/locale/nb/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/nb/activity.linfo b/locale/nb/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/nb/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/ne/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/ne/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..db2c322
--- /dev/null
+++ b/locale/ne/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/ne/activity.linfo b/locale/ne/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/ne/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/nl/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/nl/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..b017581
--- /dev/null
+++ b/locale/nl/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/nl/activity.linfo b/locale/nl/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/nl/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/pa/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/pa/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..d280b6c
--- /dev/null
+++ b/locale/pa/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/pa/activity.linfo b/locale/pa/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/pa/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/pap/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/pap/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..a617330
--- /dev/null
+++ b/locale/pap/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/pap/activity.linfo b/locale/pap/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/pap/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/pis/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/pis/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..0e8e908
--- /dev/null
+++ b/locale/pis/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/pis/activity.linfo b/locale/pis/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/pis/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/pl/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/pl/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..8b9f7b4
--- /dev/null
+++ b/locale/pl/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/pl/activity.linfo b/locale/pl/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/pl/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/ps/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/ps/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..99ecc27
--- /dev/null
+++ b/locale/ps/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/ps/activity.linfo b/locale/ps/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/ps/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/pt/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/pt/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..7a7af99
--- /dev/null
+++ b/locale/pt/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/pt/activity.linfo b/locale/pt/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/pt/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/pt_BR/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/pt_BR/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..87f4a94
--- /dev/null
+++ b/locale/pt_BR/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/pt_BR/activity.linfo b/locale/pt_BR/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/pt_BR/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/qu/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/qu/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..d280b6c
--- /dev/null
+++ b/locale/qu/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/qu/activity.linfo b/locale/qu/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/qu/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/ro/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/ro/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..2c91301
--- /dev/null
+++ b/locale/ro/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/ro/activity.linfo b/locale/ro/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/ro/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/ru/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/ru/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..b45be97
--- /dev/null
+++ b/locale/ru/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/ru/activity.linfo b/locale/ru/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/ru/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/rw/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/rw/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..d4b3a99
--- /dev/null
+++ b/locale/rw/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/rw/activity.linfo b/locale/rw/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/rw/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/sd/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/sd/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..0e8e908
--- /dev/null
+++ b/locale/sd/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/sd/activity.linfo b/locale/sd/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/sd/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/si/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/si/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..5b7b5be
--- /dev/null
+++ b/locale/si/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/si/activity.linfo b/locale/si/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/si/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/sk/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/sk/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..9e8ed50
--- /dev/null
+++ b/locale/sk/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/sk/activity.linfo b/locale/sk/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/sk/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/sl/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/sl/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..bdb2d9f
--- /dev/null
+++ b/locale/sl/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/sl/activity.linfo b/locale/sl/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/sl/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/sq/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/sq/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..4e0e4f7
--- /dev/null
+++ b/locale/sq/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/sq/activity.linfo b/locale/sq/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/sq/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/sv/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/sv/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..1494566
--- /dev/null
+++ b/locale/sv/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/sv/activity.linfo b/locale/sv/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/sv/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/sw/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/sw/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..f88d04a
--- /dev/null
+++ b/locale/sw/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/sw/activity.linfo b/locale/sw/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/sw/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/ta/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/ta/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..9195148
--- /dev/null
+++ b/locale/ta/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/ta/activity.linfo b/locale/ta/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/ta/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/te/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/te/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..7ae54d4
--- /dev/null
+++ b/locale/te/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/te/activity.linfo b/locale/te/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/te/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/th/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/th/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..2793d97
--- /dev/null
+++ b/locale/th/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/th/activity.linfo b/locale/th/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/th/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/tpi/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/tpi/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..0e8e908
--- /dev/null
+++ b/locale/tpi/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/tpi/activity.linfo b/locale/tpi/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/tpi/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/tr/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/tr/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..77240f4
--- /dev/null
+++ b/locale/tr/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/tr/activity.linfo b/locale/tr/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/tr/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/tvl/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/tvl/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..444cce4
--- /dev/null
+++ b/locale/tvl/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/tvl/activity.linfo b/locale/tvl/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/tvl/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/tzo/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/tzo/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..444cce4
--- /dev/null
+++ b/locale/tzo/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/tzo/activity.linfo b/locale/tzo/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/tzo/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/ug/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/ug/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..0e8e908
--- /dev/null
+++ b/locale/ug/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/ug/activity.linfo b/locale/ug/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/ug/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/ur/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/ur/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..210fda6
--- /dev/null
+++ b/locale/ur/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/ur/activity.linfo b/locale/ur/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/ur/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/vi/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/vi/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..4382654
--- /dev/null
+++ b/locale/vi/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/vi/activity.linfo b/locale/vi/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/vi/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/wa/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/wa/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..0e8e908
--- /dev/null
+++ b/locale/wa/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/wa/activity.linfo b/locale/wa/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/wa/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/yo/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/yo/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..d280b6c
--- /dev/null
+++ b/locale/yo/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/yo/activity.linfo b/locale/yo/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/yo/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/zh_CN/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/zh_CN/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..cdeb2d0
--- /dev/null
+++ b/locale/zh_CN/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/zh_CN/activity.linfo b/locale/zh_CN/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/zh_CN/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/locale/zh_TW/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo b/locale/zh_TW/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
new file mode 100644
index 0000000..2ac8502
--- /dev/null
+++ b/locale/zh_TW/LC_MESSAGES/org.laptop.WikipediaActivityEN.mo
Binary files differ
diff --git a/locale/zh_TW/activity.linfo b/locale/zh_TW/activity.linfo
new file mode 100644
index 0000000..d03b32f
--- /dev/null
+++ b/locale/zh_TW/activity.linfo
@@ -0,0 +1,2 @@
+[Activity]
+name = WikipediaEN
diff --git a/mwlib-rebuild.sh b/mwlib-rebuild.sh
new file mode 100755
index 0000000..7696e65
--- /dev/null
+++ b/mwlib-rebuild.sh
@@ -0,0 +1,14 @@
+#!/bin/bash -x
+
+set -e
+
+platform=`python -c 'import sys, platform; \
+ print "%s%s_%s%s" % (platform.system().lower(),
+ platform.architecture()[0][0:2],
+ sys.version_info.major,
+ sys.version_info.minor)' `
+
+
+python setup.py-mwlib build_ext --inplace build
+mkdir -p binarylibs/$platform/
+find build -type f -name '_*.so' | xargs -iFILE cp FILE binarylibs/$platform/ \ No newline at end of file
diff --git a/mwlib/EasyTimeline.pl b/mwlib/EasyTimeline.pl
new file mode 100755
index 0000000..6486224
--- /dev/null
+++ b/mwlib/EasyTimeline.pl
@@ -0,0 +1,4718 @@
+#!/usr/bin/env perl
+
+# Copyright (C) 2004 Erik Zachte , email xxx\@chello.nl (nospam: xxx=epzachte)
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 2
+# as published by the Free Software Foundation.
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU General Public License for more details, at
+# http://www.fsf.org/licenses/gpl.html
+
+# history:
+# 1.5 May 27 2004 :
+# - when a chart contains only one bar this bar was always centered in the image
+# now AlignBars works well in this case aslo ("justify" treated as "center")
+# - interwiki links reinstalled e.g. [[de:Gorbachev]]
+# - error msgs corrected
+# - minimum image size fixed
+# - line numbering adapted <timeline>spaces<br> does not count as line one in Wikipedia
+# - line breaks in wiki links parsed correctly [[Vladimir~Ilyich~Lenin]]
+# - partial url shown as hint for external link (in GIF/PNG)
+# - BarData: no attribute 'text:..' supplied -> default to space = show no text on axis
+# - PlotData: new attribute 'anchor:..'
+# - revert html encoding of '<' & '>' by MediaWiki
+
+# 1.6 May 28 2004 :
+# - SVG decode special chars in SVG input fixed
+# - BarData: new attributes 'barset:..' and 'barcount:..' # autoincrement bar id
+# - PlotData: new attribute 'barset:..'
+# - LineData: new attribute 'layer:..', draw lines to back or front of bars and texts
+
+# 1.7
+# - EscapeShellArg (Tim Starling)
+
+# 1.8 June .. 2004 :
+# - optional autosizing of image (implied when auto incrementing bar count (also new))
+# - presentation left-right order of bars reversed on TimeAxis = orientation:vertical
+# - TimeAxis option 'order:[normal|reverse]' added
+# - BarData: option barcount replaced by auto incrementing bar count and 'break' and 'skip' attributes
+# - DrawLines -> LineData (command renamed, but also restructured like PlotData, TextData)
+# - new drawing options for LineData, now also lines parallel to time axis, or between arbitrary points
+# - Preset command added (specify default settings with 'Preset =', two sets to start with)
+# - 'text' attribute parsing bugs (# or : in text gave problems, spaces got lost)
+# - PlotArea new attributes 'top' and 'right' make it possible to define plot area margins only
+# so resizing image does not imply adjusting PlotArea 'width' and 'height'
+# - PlotData option 'shift': only changing x or y value is now possible, e.g. shift=(,10)
+# - command ScaleMajor: subs for time axis can now be specified verbatim in option 'text'
+# - extra validation checks, defaults, etc
+# - function PlotScale now provides workaround for Ploticus bug: auto incrementing dates failed
+
+# 1.9 June 2004
+# - stub display order fixed on non time axis
+
+# 1.10 July 2004
+# - tempory debug code (removed)
+
+# 1.11 August 2004
+# - dot in folder name in input path was misunderstood as start of file extension
+# - utf-8 chars within 160-255 range are translated to extended ascii
+# however internal font used by Ploticus has strange mapping so some are replaced
+# by undercore or unaccented version of character
+# this is a make do solution until full unicode support with external fonts will be added
+
+ $version = "1.9" ;
+
+ use Time::Local ;
+ use Getopt::Std ;
+ use Cwd ;
+
+ $| = 1; # flush screen output
+
+ print "EasyTimeline version $version\n" .
+ "Copyright (C) 2004 Erik Zachte\n" .
+ "Email xxx\@chello.nl (nospam: xxx=epzachte)\n\n" .
+ "This program is free software; you can redistribute it\n" .
+ "and/or modify it under the terms of the \n" .
+ "GNU General Public License version 2 as published by\n" .
+ "the Free Software Foundation\n" .
+ "------------------------------------------------------\n" ;
+
+ &SetImageFormat ;
+ &ParseArguments ;
+ &InitFiles ;
+
+ open "FILE_IN", "<", $file_in ;
+ @lines = <FILE_IN> ;
+ close "FILE_IN" ;
+
+ &InitVars ;
+ &ParseScript ;
+
+ if ($CntErrors == 0)
+ { &WritePlotFile ; }
+
+ if ($CntErrors == 1)
+ { &Abort ("1 error found") ; }
+ elsif ($CntErrors > 1)
+ { &Abort ("$CntErrors errors found") ; }
+ else
+ {
+ if (defined @Info)
+ {
+ print "\nINFO\n" ;
+ print @Info ;
+ print "\n" ;
+ }
+ if (defined @Warnings)
+ {
+ print "\nWARNING(S)\n" ;
+ print @Warnings ;
+ print "\n" ;
+ }
+
+ if (! (-e $file_bitmap))
+ {
+ print "\nImage $file_bitmap not created.\n" ;
+ if ((! (-e "pl.exe")) && (! (-e "pl")))
+ { print "\nPloticus not found in local folder. Is it on your system path?\n" ; }
+ }
+ elsif (! (-e $file_vector))
+ {
+ print "\nImage $file_vector not created.\n" ;
+ }
+ else
+ { print "\nREADY\nNo errors found.\n" ; }
+ }
+
+ exit ;
+
+sub ParseArguments
+{
+ my $options ;
+ getopt ("iTAPe", \%options) ;
+
+ &Abort ("Specify input file as: -i filename") if (! defined (@options {"i"})) ;
+
+ $file_in = @options {"i"} ;
+ $listinput = @options {"l"} ; # list all input lines (not recommended)
+ $linkmap = @options {"m"} ; # make clickmap for inclusion in html
+ $makehtml = @options {"h"} ; # make test html file with gif/png + svg output
+ $bypass = @options {"b"} ; # do not use in Wikipedia:bypass some checks
+ $showmap = @options {"d"} ; # debug: shows clickable areas in gif/png
+ # The following parameters are used by MediaWiki
+ # to pass config settings from LocalSettings.php to
+ # the perl script
+ $tmpdir = @options {"T"} ; # For MediaWiki: temp directory to use
+ $plcommand = @options {"P"} ; # For MediaWiki: full path of ploticus command
+ $articlepath=@options {"A"} ; # For MediaWiki: Path of an article, relative to this servers root
+
+ if (! defined @options {"A"} )
+ { $articlepath="http://en.wikipedia.org/wiki/\$1"; }
+
+ if (! -e $file_in)
+ { &Abort ("Input file '" . $file_in . "' not found.") ; }
+}
+
+sub InitVars
+{
+ $true = 1 ;
+ $false = 0 ;
+ $CntErrors = 0 ;
+ $LinkColor = "brightblue" ;
+ $MapPNG = $false ; # switched when link or hint found
+ $MapSVG = $false ; # switched when link found
+ $WarnTextOutsideArea = 0 ;
+ $WarnOnRightAlignedText = 0 ;
+
+ $hPerc = &EncodeInput ("\%") ;
+ $hAmp = &EncodeInput ("\&") ;
+ $hAt = &EncodeInput ("\@") ;
+ $hDollar = &EncodeInput ("\$") ;
+ $hBrO = &EncodeInput ("\(") ;
+ $hBrC = &EncodeInput ("\)") ;
+ $hSemi = &EncodeInput ("\;") ;
+ $hIs = &EncodeInput ("\=") ;
+ $hLt = &EncodeInput ("\<") ;
+ $hGt = &EncodeInput ("\>") ;
+}
+
+sub InitFiles
+{
+ print "\nInput: Script file $file_in\n" ;
+
+ $file = $file_in ;
+# 1.10 dot ignore dots in folder names ->
+ $file =~ s/\.[^\\\/\.]*$// ; # remove extension
+ $file_name = $file ;
+ $file_bitmap = $file . "." . $fmt ;
+ $file_vector = $file . ".svg" ;
+ $file_png = $file . ".png" ;
+ $file_htmlmap = $file . ".map" ;
+ $file_html = $file . ".html" ;
+ $file_errors = $file . ".err" ;
+# $file_pl_info = $file . ".inf" ;
+# $file_pl_err = $file . ".err" ;
+ print "Output: Image files $file_bitmap & $file_vector\n" ;
+
+ if ($linkmap)
+ { print " Map file $file_htmlmap (add to html for clickable map)\n" ; }
+ if ($makehtml)
+ { print " HTML test file $file_html\n" ; }
+
+ # remove previous output
+ if (-e $file_bitmap) { unlink $file_bitmap ; }
+ if (-e $file_vector) { unlink $file_vector ; }
+ if (-e $file_png) { unlink $file_png ; }
+ if (-e $file_htmlmap) { unlink $file_htmlmap ; }
+ if (-e $file_html) { unlink $file_html ; }
+ if (-e $file_errors) { unlink $file_errors ; }
+}
+
+sub SetImageFormat
+{
+ $env = "" ;
+# $dir = cwd() ; # is there a better way to detect OS?
+# if ($dir =~ /\//) { $env = "Linux" ; $fmt = "png" ; $pathseparator = "/";}
+# if ($dir =~ /\\/) { $env = "Windows" ; $fmt = "gif" ; $pathseparator = "\\";}
+# cwd always to returns '/'s ? ->
+ $OS = $^O ;
+ if ($OS =~ /darwin/i)
+ { $env = "Linux"; $fmt = "png" ; $pathseparator = "/";}
+ elsif ($OS =~ /win/i)
+ { $env = "Windows" ; $fmt = "gif" ; $pathseparator = "\\";}
+ else
+ { $env = "Linux" ; $fmt = "png" ; $pathseparator = "/";}
+
+ if ($env ne "")
+ { print "\nOS $env detected -> create image in $fmt format.\n" ; }
+ else
+ {
+ print "\nOS not detected. Assuming Windows -> create image in $fmt format.\n" ;
+ $env = "Windows" ;
+ }
+}
+sub ParseScript
+{
+ my $command ; # local version, $Command = global
+ $LineNo = 0 ;
+ $InputParsed = $false ;
+ $CommandNext = "" ;
+ $DateFormat = "x.y" ;
+
+ $firstcmd = $true ;
+ &GetCommand ;
+
+ &StoreColor ("white", &EncodeInput ("gray(0.999)"), "") ;
+ &StoreColor ("barcoldefault", &EncodeInput ("rgb(0,0.6,0)"), "") ;
+
+ while (! $InputParsed)
+ {
+ if ($Command =~ /^\s*$/)
+ { &GetCommand ; next ; }
+
+ if (! ($Command =~ /$hIs/))
+ { &Error ("Invalid statement. No '=' found.") ;
+ &GetCommand ; next ; }
+
+ if ($Command =~ /$hIs.*$hIs/)
+ { &Error ("Invalid statement. Multiple '=' found.") ;
+ &GetCommand ; next ; }
+
+ my ($name, $value) = split ($hIs, $Command) ;
+ $name =~ s/^\s*(.*?)\s*$/$1/ ;
+
+ if ($name =~ /PlotDividers/i)
+ { &Error ("Command 'PlotDividers' has been renamed to 'LineData', please adjust.") ;
+ &GetCommand ; next ; }
+ if ($name =~ /DrawLines/i)
+ { &Error ("Command 'DrawLines' has been renamed to 'LineData', please adjust.\n" .
+ " Reason for change is consistency: LineData now follows the same syntax rules as PlotData and TextData.") ;
+ &GetCommand ; next ; }
+
+ if ((! ($name =~ /^(?:Define)\s/)) &&
+ (! ($name =~ /^(?:AlignBars|BarData|
+ BackgroundColors|Colors|DateFormat|LineData|
+ ScaleMajor|ScaleMinor|
+ LegendLeft|LegendTop|
+ ImageSize|PlotArea|Legend|
+ Period|PlotData|Preset|
+ TextData|TimeAxis)$/xi)))
+ { &ParseUnknownCommand ;
+ &GetCommand ; next ; }
+
+ $value =~ s/^\s*(.*?)\s*// ;
+ if (! ($name =~ /^(?:BarData|Colors|LineData|PlotData|TextData)$/i))
+ {
+ if ((! (defined ($value))) || ($value eq ""))
+ {
+ if ($name =~ /Preset/i)
+ {
+ &Error ("$name definition incomplete. No value specified\n" .
+ " At the moment only one preset exists: 'TimeVertical_OneBar_UnitYear'.\n" .
+ " See also meta.wikipedia.org/wiki/EasyTimeline/Presets") ;
+ }
+ else
+ { &Error ("$name definition incomplete. No attributes specified") ; }
+ &GetCommand ; next ; }
+ }
+
+ if ($name =~ /^(?:BackgroundColors|Colors|Period|ScaleMajor|ScaleMinor|TimeAxis)$/i)
+ {
+ my @attributes = split (" ", $value) ;
+ foreach $attribute (@attributes)
+ {
+ my ($attrname, $attrvalue) = split ("\:", $attribute) ;
+ if (! ($name."-".$attrname =~ /^(?:Colors-Value|Colors-Legend|
+ Period-From|Period-Till|
+ ScaleMajor-Color|ScaleMajor-Unit|ScaleMajor-Increment|ScaleMajor-Start|
+ ScaleMinor-Color|ScaleMinor-Unit|ScaleMinor-Increment|ScaleMinor-Start|
+ BackgroundColors-Canvas|BackgroundColors-Bars|
+ TimeAxis-Orientation|TimeAxis-Format)$/xi))
+ { &Error ("$name definition invalid. Unknown attribute '$attrname'.") ;
+ &GetCommand ; next ; }
+
+ if ((! defined ($attrvalue)) || ($attrvalue eq ""))
+ { &Error ("$name definition incomplete. No value specified for attribute '$attrname'.") ;
+ &GetCommand ; next ; }
+ }
+ }
+
+ if ($Command =~ /^AlignBars/i) { &ParseAlignBars ; }
+ elsif ($Command =~ /^BackgroundColors/i) { &ParseBackgroundColors ; }
+ elsif ($Command =~ /^BarData/i) { &ParseBarData ; }
+ elsif ($Command =~ /^Colors/i) { &ParseColors ; }
+ elsif ($Command =~ /^DateFormat/i) { &ParseDateFormat ; }
+ elsif ($Command =~ /^Define/i) { &ParseDefine ; }
+ elsif ($Command =~ /^ImageSize/i) { &ParseImageSize ; }
+ elsif ($Command =~ /^Legend/i) { &ParseLegend ; }
+ elsif ($Command =~ /^LineData/i) { &ParseLineData ; }
+ elsif ($Command =~ /^Period/i) { &ParsePeriod ; }
+ elsif ($Command =~ /^PlotArea/i) { &ParsePlotArea ; }
+ elsif ($Command =~ /^PlotData/i) { &ParsePlotData ; }
+ elsif ($Command =~ /^Preset/i) { &ParsePreset ; }
+ elsif ($Command =~ /^Scale/i) { &ParseScale ; }
+ elsif ($Command =~ /^TextData/i) { &ParseTextData ; }
+ elsif ($Command =~ /^TimeAxis/i) { &ParseTimeAxis ; }
+
+ &GetCommand ;
+ $firstcmd = $false ;
+ }
+
+ if ($CntErrors == 0)
+ { &DetectMissingCommands ; }
+
+ if ($CntErrors == 0)
+ { &ValidateAndNormalizeDimensions ; }
+}
+
+
+sub GetLine
+{
+ if ($#lines < 0)
+ { $InputParsed = $true ; return ("") ; }
+
+ # running in Wikipedia context and first line empty ?
+ # skip first line without incrementing line count
+ # this is part behind <timeline> and will not be thought of as line 1
+ if (defined @options {"A"})
+ {
+ if (($#lines >= 0) && (@lines [0] =~ /^\s*$/))
+ { $Line = shift (@lines) ; }
+ }
+
+ $Line = "" ;
+ while (($#lines >= 0) && ($Line =~ /^\s*$/))
+ {
+ $LineNo ++ ;
+ $Line = shift (@lines) ;
+ chomp ($Line) ;
+
+ if ($listinput)
+ { print "$LineNo: " . &DecodeInput ($Line) . "\n" ; }
+
+ # preserve '#' within double quotes
+ $Line =~ s/(\"[^\"]*\")/$a=$1,$a=~s^\#^\%\?\+^g,$a/ge ;
+
+ $Line =~ s/#>.*?<#//g ;
+ if ($Line =~ /#>/)
+ {
+ $commentstart = $LineNo ;
+ $Line =~ s/#>.*?$// ;
+ }
+ elsif ($Line =~ /<#/)
+ {
+ undef $commentstart ;
+ $Line =~ s/^.*?<#//x ;
+ }
+ elsif (defined ($commentstart))
+ { $Line = "" ; next ; }
+
+ # remove single line comments (keep html char tags, like &#32;)
+ $Line =~ s/\&\#/\&\$\%/g ;
+ $Line =~ s/\#.*$// ;
+ $Line =~ s/\&\$\%/\&\#/g ;
+ $Line =~ s/\%\?\+/\#/g ;
+ $Line =~ s/\s*$//g ;
+ $Line =~ s/\t/ /g ;
+ }
+
+ if ($Line !~ /^\s*$/)
+ {
+ $Line = &EncodeInput ($Line) ;
+
+ if (! ($Line =~ /^\s*Define/i))
+ { $Line =~ s/($hDollar[a-zA-Z0-9]+)/&GetDefine($Line,$1)/ge ; }
+ }
+
+ if (($#lines < 0) && (defined ($commentstart)))
+ { &Error2 ("No matching end of comment found for comment block starting at line $commentstart.\n" .
+ "Text between \#> and <\# (multiple lines) or following \# (single line) will be treated as comment.") ; }
+ return ($Line) ;
+}
+
+sub GetCommand
+{
+ undef (%Attributes) ;
+ $Command = "" ;
+
+ if ($CommandNext ne "")
+ {
+ $Command = $CommandNext ;
+ $CommandNext = "" ;
+ }
+ else
+ { $Command = &GetLine ; }
+
+ if ($Command =~ /^\s/)
+ {
+ &Error ("New command expected instead of data line (= line starting with spaces). Data line(s) ignored.\n") ;
+ $Command = &GetLine ;
+ while (($#lines >= 0) && ($Command =~ /^\s/))
+ { $Command = &GetLine ; }
+ }
+
+ if ($Command =~ /^[^\s]/)
+ {
+ $line = $Command ;
+ $line =~ s/^.*$hIs\s*// ;
+ &CollectAttributes ($line) ;
+ }
+}
+
+sub GetData
+{
+ undef (%Attributes) ;
+ $Command = "" ;
+ $NoData = $false ;
+ my $line = &GetLine ;
+
+ if ($line =~ /^[^\s]/)
+ {
+ $CommandNext = $line ;
+ $NoData = $true ;
+ return ("") ;
+ }
+
+ if ($line =~ /^\s*$/)
+ {
+ $NoData = $true ;
+ return ("") ;
+ }
+
+ $line =~ s/^\s*//g ;
+ &CollectAttributes ($line) ;
+}
+
+sub CollectAttributes
+{
+ my $line = shift ;
+
+ $line =~ s/(\slink\:[^\s\:]*)\:/$1'colon'/i ; # replace colon (:), would conflict with syntax
+ $line =~ s/(\stext\:[^\s\:]*)\:/$1'colon'/i ; # replace colon (:), would conflict with syntax
+ $line =~ s/(https?)\:/$1'colon'/i ; # replace colon (:), would conflict with syntax
+
+ my $text ;
+ ($line, $text) = &ExtractText ($line) ;
+ $text =~ s/'colon'/:/ ;
+
+ $line =~ s/( $hBrO .+? $hBrC )/&RemoveSpaces($1)/gxe ;
+ $line =~ s/\s*\:\s*/:/g ;
+ $line =~ s/([a-zA-Z0-9\_]+)\:/lc($1) . ":"/gxe ;
+ @Fields = split (" ", $line) ;
+
+ $name = "" ;
+ foreach $field (@Fields)
+ {
+ if ($field =~ /\:/)
+ {
+ ($name, $value) = split (":", $field) ;
+ $name =~ s/^\s*(.*)\s*$/lc($1)/gxe ;
+ $value =~ s/^\s*(.*)\s*$/$1/gxe ;
+ if (($name ne "bar") && ($name ne "text") && ($name ne "link") && ($name ne "legend")) # && ($name ne "hint")
+ { $value = lc ($value) ; }
+
+ if ($name eq "link") # restore colon
+ { $value =~ s/'colon'/:/ ; }
+
+ if ($value eq "")
+ {
+ if ($name =~ /Text/i)
+ { $value = " " ; }
+ else
+ { &Error ("No value specified for attribute '$name'. Attribute ignored.") ; }
+ }
+ else
+ { @Attributes {$name} = $value ; }
+ }
+ else
+ {
+ if (defined (@Attributes {"single"}))
+ { &Error ("Invalid attribute '$field' ignored.\nSpecify attributes as 'name:value' pair(s).") ; }
+ else
+ {
+ $field =~ s/^\s*(.*)\s*$/$1/gxe ;
+ @Attributes {"single"} = $field ;
+ }
+ }
+ }
+ if (($name ne "") && (@Attributes {"single"} ne ""))
+ {
+ &Error ("Invalid attribute '" . @Attributes {"single"} . "' ignored.\nSpecify attributes as 'name:value' pairs.") ;
+ delete (@Attributes {"single"}) ;
+ }
+
+ if ((defined ($text)) && ($text ne ""))
+ { @Attributes {"text"} = &ParseText ($text) ; }
+}
+
+sub GetDefine
+{
+ my $command = shift ;
+ my $const = shift ;
+ $const = lc ($const) ;
+ my $value = @Consts {lc ($const)} ;
+ if (! defined ($value))
+ {
+ &Error ("Unknown constant. 'Define $const = ... ' expected.") ;
+ return ($const);
+ }
+ return ($value) ;
+}
+
+sub ParseAlignBars
+{
+ &CheckPreset ("AlignBars") ;
+
+ $align = @Attributes {"single"} ;
+ if (! ($align =~ /^(?:justify|early|late)$/i))
+ { &Error ("AlignBars value '$align' invalid. Specify 'justify', 'early' or 'late'.") ; return ; }
+
+ $AlignBars = lc ($align) ;
+}
+
+sub ParseBackgroundColors
+{
+ if (! &ValidAttributes ("BackgroundColors"))
+ { &GetData ; next ;}
+
+ &CheckPreset ("BackGroundColors") ;
+
+ foreach $attribute (keys %Attributes)
+ {
+ my $attrvalue = @Attributes {$attribute} ;
+
+ if ($attribute =~ /Canvas/i)
+ {
+ if (! &ColorPredefined ($attrvalue))
+ {
+ if (! defined (@Colors {lc ($attrvalue)}))
+ { &Error ("BackgroundColors definition invalid. Attribute '$attribute': unknown color '$attrvalue'.\n" .
+ " Specify command 'Color' before this command.") ; return ; }
+ }
+ if (defined (@Colors {lc ($attrvalue)}))
+ { @Attributes {"canvas"} = @Colors { lc ($attrvalue) } ; }
+ else
+ { @Attributes {"canvas"} = lc ($attrvalue) ; }
+ }
+ elsif ($attribute =~ /Bars/i)
+ {
+ if (! defined (@Colors {lc ($attrvalue)}))
+ { &Error ("BackgroundColors definition invalid. Attribute '$attribute' unknown color '$attrvalue'.\n" .
+ " Specify command 'Color' before this command.") ; return ; }
+
+ @Attributes {"bars"} = lc ($attrvalue) ;
+ }
+ }
+
+ %BackgroundColors = %Attributes ;
+}
+
+sub ParseBarData
+{
+ &GetData ;
+ if ($NoData)
+ { &Error ("Data expected for command 'BarData', but line is not indented.\n") ; return ; }
+
+ my ($bar, $text, $link, $hint, $barset) ; # , $barcount) ;
+
+ BarData:
+ while ((! $InputParsed) && (! $NoData))
+ {
+ if (! &ValidAttributes ("BarData"))
+ { &GetData ; next ;}
+
+ $bar = "" ; $link = "" ; $hint = "" ; $barset = "" ; # $barcount = "" ;
+
+ my $data2 = $data ;
+ ($data2, $text) = &ExtractText ($data2) ;
+ @Attributes = split (" ", $data2) ;
+
+ foreach $attribute (keys %Attributes)
+ {
+ my $attrvalue = @Attributes {$attribute} ;
+
+ if ($attribute =~ /^Bar$/i)
+ {
+ $bar = $attrvalue ;
+ }
+ elsif ($attribute =~ /^BarSet$/i)
+ {
+ $barset = $attrvalue ;
+ }
+ # elsif ($attribute =~ /^BarCount$/i)
+ # {
+ # $barcount = $attrvalue ;
+ # if (($barcount !~ /^\d?\d?\d$/) || ($barcount < 2) || ($barcount > 200))
+ # { &Error ("BarData attribute 'barcount' invalid. Specify a number between 2 and 200\n") ;
+ # &GetData ; next BarData ; }
+ # }
+ elsif ($attribute =~ /^Text$/i)
+ {
+ $text = $attrvalue ;
+ $text =~ s/\\n/~/gs ;
+ if ($text =~ /\~/)
+ { &Warning ("BarData attribute 'text' contains ~ (tilde).\n" .
+ "Tilde will not be translated into newline character (only in PlotData)") ; }
+ if ($text =~ /\^/)
+ { &Warning ("BarData attribute 'text' contains ^ (caret).\n" .
+ "Caret will not be translated into tab character (only in PlotData)") ; }
+ }
+ elsif ($attribute =~ /^Link$/i)
+ {
+ $link = &ParseText ($attrvalue) ;
+
+ if ($link =~ /\[.*\]/)
+ { &Error ("BarData attribute 'link' contains implicit (wiki style) link.\n" .
+ "Use implicit link style with attribute 'text' only.\n") ;
+ &GetData ; next BarData ; }
+
+ $link = &EncodeURL (&NormalizeURL ($link)) ;
+
+ $MapPNG = $true ;
+ }
+ }
+
+ if (($bar eq "") && ($barset eq ""))
+ { &Error ("BarData attribute missing. Specify either 'bar' of 'barset'.\n") ;
+ &GetData ; next BarData ; }
+
+ if (($bar ne "") && ($barset ne ""))
+ { &Error ("BarData attributes 'bar' and 'barset' are mutually exclusive.\nSpecify one of these per data line\n") ;
+ &GetData ; next BarData ; }
+
+ # if (($barset ne "") && ($barcount eq ""))
+ # { &Error ("BarData attribute 'barset' specified without attribute 'barcount'.\n") ;
+ # &GetData ; next BarData ; }
+
+ # if (($barset eq "") && ($barcount ne ""))
+ # { &Error ("BarData attribute 'barcount' specified without attribute 'barset'.\n") ;
+ # &GetData ; next BarData ; }
+
+ if (($barset ne "") && ($link ne ""))
+ { &Error ("BarData attribute 'link' not valid in combination with attribute 'barset'.\n") ;
+ &GetData ; next BarData ; }
+
+ if ($link ne "")
+ {
+ if ($text =~ /\[.*\]/)
+ {
+ &Warning ("BarData contains implicit link(s) in attribute 'text' and explicit attribute 'link'.\n" .
+ "Implicit link(s) ignored.") ;
+ $text =~ s/\[+ (?:[^\|]* \|)? ([^\]]*) \]+/$1/gx ;
+ }
+
+ if ($hint eq "")
+ { $hint = &ExternalLinkToHint ($link) ; }
+ }
+
+ if (($bar ne "") && ($bar !~ /[a-zA-Z0-9\_]+/))
+ { &Error ("BarData attribute bar:'$bar' invalid.\nUse only characters 'a'-'z', 'A'-'Z', '0'-'9', '_'\n") ;
+ &GetData ; next BarData ; }
+
+ if ($bar ne "")
+ {
+ if (@Axis {"time"} eq "x")
+ { push @Bars, $bar ; }
+ else
+ { unshift @Bars, $bar ; }
+
+ if ($text ne "")
+ { @BarLegend {lc ($bar)} = $text ; }
+ else
+ { @BarLegend {lc ($bar)} = " " ; }
+
+ if ($link ne "")
+ { @BarLink {lc ($bar)} = $link ; }
+ }
+ else
+ {
+# for ($b = 1 ; $b <= $barcount ; $b++)
+# {
+# $bar = $barset . "#" . $b ;
+
+ $bar = $barset . "#1" ;
+ if (@Axis {"time"} eq "x")
+ { push @Bars, $bar ; }
+ else
+ { unshift @Bars, $bar ; }
+
+ if ($text ne "")
+ { @BarLegend {lc ($bar)} = $text . " - " . $b ; }
+ else
+ { @BarLegend {lc ($bar)} = " " ; }
+# }
+ }
+
+
+ &GetData ;
+ }
+}
+
+sub ParseColors
+{
+
+ &GetData ;
+ if ($NoData)
+ { &Error ("Data expected for command 'Colors', but line is not indented.\n") ; return ; }
+
+ Colors:
+ while ((! $InputParsed) && (! $NoData))
+ {
+ if (! &ValidAttributes ("Colors"))
+ { &GetData ; next ;}
+
+ &CheckPreset ("Colors") ;
+
+ my $addtolegend = $false ;
+ my $legendvalue = "" ;
+ my $colorvalue = "" ;
+
+ foreach $attribute (keys %Attributes)
+ {
+ my $attrvalue = @Attributes {$attribute} ;
+
+ if ($attribute =~ /Id/i)
+ {
+ $colorname = $attrvalue ;
+ }
+ elsif ($attribute =~ /Legend/i)
+ {
+ $addtolegend = $true ;
+ $legendvalue = $attrvalue ;
+ if ($legendvalue =~ /^[yY]$/)
+ { push @LegendData, $colorname ; }
+ elsif (! ($attrvalue =~ /^[nN]$/))
+ {
+ $legendvalue = &ParseText ($legendvalue) ;
+ push @LegendData, $legendvalue ;
+ }
+ }
+ elsif ($attribute =~ /Value/i)
+ {
+ $colorvalue = $attrvalue ;
+ if ($colorvalue =~ /^white$/i)
+ { $colorvalue = "gray" . $hBrO . "0.999" . $hBrC ; }
+ }
+ }
+
+ if (&ColorPredefined ($colorvalue))
+ {
+ &StoreColor ($colorname, $colorvalue, $legendvalue) ;
+ &GetData ; next Colors ;
+ }
+
+ if ($colorvalue =~ /^[a-z]+$/i)
+ {
+ if (! ($colorvalue =~ /^(?:gray|rgb|hsb)/i))
+ { &Error ("Color value invalid: unknown constant '$colorvalue'.") ;
+ &GetData ; next Colors ; }
+ }
+
+ if (! ($colorvalue =~ /^(?:gray|rgb|hsb) $hBrO .+? $hBrC/xi))
+ { &Error ("Color value invalid. Specify constant or 'gray/rgb/hsb(numeric values)' ") ;
+ &GetData ; next Colors ; }
+
+ if ($colorvalue =~ /^gray/i)
+ {
+ if ($colorvalue =~ /gray $hBrO (?:0|1|0\.\d+) $hBrC/xi)
+ { &StoreColor ($colorname, $colorvalue, $legendvalue) ; }
+ else
+ { &Error ("Color value invalid. Specify 'gray(x) where 0 <= x <= 1' ") ; }
+
+ &GetData ; next Colors ;
+ }
+
+ if ($colorvalue =~ /^rgb/i)
+ {
+ my $colormode = substr ($colorvalue,0,3) ;
+ if ($colorvalue =~ /rgb $hBrO
+ (?:0|1|0\.\d+) \,
+ (?:0|1|0\.\d+) \,
+ (?:0|1|0\.\d+)
+ $hBrC/xi)
+ { &StoreColor ($colorname, $colorvalue, $legendvalue) ; }
+ else
+ { &Error ("Color value invalid. Specify 'rgb(r,g,b) where 0 <= r,g,b <= 1' ") ; }
+
+ &GetData ; next Colors ;
+ }
+
+ if ($colorvalue =~ /^hsb/i)
+ {
+ my $colormode = substr ($colorvalue,0,3) ;
+ if ($colorvalue =~ /hsb $hBrO
+ (?:0|1|0\.\d+) \,
+ (?:0|1|0\.\d+) \,
+ (?:0|1|0\.\d+)
+ $hBrC/xi)
+ { &StoreColor ($colorname, $colorvalue, $legendvalue) ; }
+ else
+ { &Error ("Color value invalid. Specify 'hsb(h,s,b) where 0 <= h,s,b <= 1' ") ; }
+
+ &GetData ; next Colors ;
+ }
+
+ &Error ("Color value invalid.") ;
+ &GetData ;
+ }
+}
+
+sub StoreColor
+{
+ my $colorname = shift ;
+ my $colorvalue = shift ;
+ my $legendvalue = shift ;
+ if (defined (@Colors {lc ($colorname)}))
+ { &Warning ("Color '$colorname' redefined.") ; }
+ @Colors {lc ($colorname)} = lc ($colorvalue) ;
+ if ((defined ($legendvalue)) && ($legendvalue ne ""))
+ { @ColorLabels {lc ($colorname)} = $legendvalue ; }
+}
+
+sub ParseDateFormat
+{
+ &CheckPreset ("DateFormat") ;
+
+ my $datevalue = lc (@Attributes {"single"}) ;
+ $datevalue =~ s/\s//g ;
+ $datevalue = lc ($datevalue) ;
+ if (($datevalue ne "dd/mm/yyyy") && ($datevalue ne "mm/dd/yyyy") && ($datevalue ne "yyyy") && ($datevalue ne "x.y"))
+ { &Error ("Invalid DateFormat. Specify as 'dd/mm/yyyy', 'mm/dd/yyyy', 'yyyy' or 'x.y'\n" .
+ " (use first two only for years >= 1800)\n") ; return ; }
+
+ $DateFormat = $datevalue ;
+}
+
+sub ParseDefine
+{
+ my $command = $Command ;
+ my $command2 = $command ;
+ $command2 =~ s/^Define\s*//i ;
+
+ my ($name, $value) = split ($hIs, $command2) ;
+ $name =~ s/^\s*(.*?)\s*$/$1/g ;
+ $value =~ s/^\s*(.*?)\s*$/$1/g ;
+
+ if (! ($name =~ /^$hDollar/))
+ { &Error ("Define '$name' invalid. Name does not start with '\$'.") ; return ; }
+ if (! ($name =~ /^$hDollar[a-zA-Z0-9\_]+$/))
+ { &Error ("Define '$name' invalid. Valid characters are 'a'-'z', 'A'-'Z', '0'-'9', '_'.") ; return ; }
+
+ $value =~ s/($hDollar[a-zA-Z0-9]+)/&GetDefine($command,$1)/ge ;
+ @Consts {lc ($name)} = $value ;
+}
+
+sub ParseLineData
+{
+ &GetData ;
+ if ($NoData)
+ { &Error ("Data expected for command 'LineData', but line is not indented.\n") ; return ; }
+
+ if ((! (defined ($DateFormat))) || (! (defined (@Period {"from"}))))
+ {
+ if (! (defined ($DateFormat)))
+ { &Error ("LineData invalid. No (valid) command 'DateFormat' specified in previous lines.") ; }
+ else
+ { &Error ("LineData invalid. No (valid) command 'Period' specified in previous lines.") ; }
+
+ while ((! $InputParsed) && (! $NoData))
+ { &GetData ; }
+ return ;
+ }
+
+ my ($at, $from, $till, $atpos, $frompos, $tillpos, $color, $layer, $width, $points, $explanation) ;
+
+ $layer = "front" ;
+ $width = 2.0 ;
+
+ my $data2 = $data ;
+
+ LineData:
+ while ((! $InputParsed) && (! $NoData))
+ {
+ $at = "" ; $from = "" ; $till = "" ; $atpos = "" ; $frompos = "" ; $tillpos = "" ; $points = "" ;
+
+ &CheckPreset ("LineData") ;
+
+ if (! &ValidAttributes ("LineData"))
+ { &GetData ; next ;}
+
+ if (defined (@LineDefs {"color"})) { $color = @LineDefs {"color"} ; }
+ if (defined (@LineDefs {"layer"})) { $layer = @LineDefs {"layer"} ; }
+ if (defined (@LineDefs {"width"})) { $width = @LineDefs {"width"} ; }
+ if (defined (@LineDefs {"frompos"})) { $frompos = @LineDefs {"frompos"} ; }
+ if (defined (@LineDefs {"tillpos"})) { $tillpos = @LineDefs {"tillpos"} ; }
+ if (defined (@LineDefs {"atpos"})) { $atpos = @LineDefs {"atpos"} ; }
+
+ foreach $attribute (keys %Attributes)
+ {
+ my $attrvalue = @Attributes {$attribute} ;
+
+ if ($attribute =~ /^(?:At|From|Till)$/i)
+ {
+ if ($attrvalue =~ /^Start$/i)
+ { $attrvalue = @Period {"from"} ; }
+
+ if ($attrvalue =~ /^End$/i)
+ { $attrvalue = @Period {"till"} ; }
+
+ if (! &ValidDateFormat ($attrvalue))
+ { &Error ("LineData attribute '$attribute' invalid.\n" .
+ "Date does not conform to specified DateFormat '$DateFormat'.") ;
+ &GetData ; next LineData ; }
+
+ if (! &ValidDateRange ($attrvalue))
+ { &Error ("LineData attribute '$attribute' invalid.\n" .
+ "Date '$attrvalue' not within range as specified by command Period.") ;
+ &GetData ; next LineData ; }
+
+# if (substr ($attrvalue,6,4) < 1800)
+# { &Error ("LineData attribute '$attribute' invalid. Specify year >= 1800.") ;
+# &GetData ; next LineData ; }
+
+ if ($attribute =~ /At/i)
+ {
+ $at = $attrvalue ; $from = "" ; $till = "" ; }
+ elsif ($attribute =~ /From/i)
+ { $from = $attrvalue ; $at = "" ; }
+ else
+ { $till = $attrvalue ; $at = "" ; }
+ }
+ elsif ($attribute =~ /^(?:atpos|frompos|tillpos)$/i)
+ {
+ if ($attrvalue =~ /^(?:Start|End)$/i)
+ { $attrvalue = lc ($attrvalue) ; }
+ elsif (! &ValidAbs ($attrvalue))
+ { &Error ("LineData attribute '$attribute' invalid.\n" .
+ "Specify value as x[.y][px, in, cm] examples: '200', '20px', '1.3in'") ;
+ &GetData ; next LineData ; }
+
+ if ($attribute =~ /atpos/i)
+ { $atpos = &Normalize ($attrvalue) ; }
+ elsif ($attribute =~ /frompos/i)
+ { $frompos = &Normalize ($attrvalue) ; }
+ else
+ { $tillpos = &Normalize ($attrvalue) ; }
+ }
+ elsif ($attribute =~ /Color/i)
+ {
+ if ((! &ColorPredefined ($attrvalue)) && (! defined (@Colors {lc ($attrvalue)})))
+ { &Error ("LineData attribute '$attribute' invalid. Unknown color '$attrvalue'.\n" .
+ " Specify command 'Color' before this command.") ;
+ &GetData ; next LineData ; }
+
+ if (! &ColorPredefined ($attrvalue))
+ { $attrvalue = @Colors {lc ($attrvalue)} ; }
+
+ $color = $attrvalue ;
+ }
+ elsif ($attribute =~ /Layer/i)
+ {
+ if (! ($attrvalue =~ /^(?:back|front)$/i))
+ { &Error ("LineData attribute '$attrvalue' invalid.\nSpecify back(default) or front") ;
+ &GetData ; next LineData ; }
+
+ $layer = $attrvalue ;
+ }
+ elsif ($attribute =~ /Points/i)
+ {
+ $attribute =~ s/\s//g ;
+
+ if ($attrvalue !~ /^$hBrO\d+\,\d+$hBrC$hBrO\d+\,\d+$hBrC$/)
+ { &Error ("LineData attribute '$attrvalue' invalid.\nSpecify 'points:(x1,y1)(x2,y2)'") ;
+ &GetData ; next LineData ; }
+
+ $attrvalue =~ s/^$hBrO(\d+)\,(\d+)$hBrC$hBrO(\d+)\,(\d+)$hBrC$/$1,$2,$3,$4/ ;
+ $points = $attrvalue ;
+ }
+ elsif ($attribute =~ /Width/i)
+ {
+ if (! &ValidAbs ($attrvalue))
+ { &Error ("LineData attribute '$attribute' invalid.\n" .
+ "Specify value as x[.y][px, in, cm] examples: '200', '20px', '1.3in'") ;
+ &GetData ; next LineData ; }
+
+ if (($attrvalue < 0.1) || ($attrvalue > 10))
+ { &Error ("LineData attribute '$attribute' invalid.\n" .
+ "Specify value as between 0.1 and 10") ;
+ &GetData ; next LineData ; }
+
+ $width = $attrvalue ;
+ }
+ }
+
+ if (($at eq "") && ($from eq "") && ($till eq "") && ($points eq "")) # upd defaults
+ {
+ if ($color ne "") { @LineDefs {"color"} = $color ; }
+ if ($layer ne "") { @LineDefs {"layer"} = $layer ; }
+ if ($width ne "") { @LineDefs {"width"} = $width ; }
+ if ($atpos ne "") { @LineDefs {"atpos"} = $atpos ; }
+ if ($frompos ne "") { @LineDefs {"frompos"} = $frompos ; }
+ if ($tillpos ne "") { @LineDefs {"tillpos"} = $tillpos ; }
+ }
+
+ if ($layer eq "")
+ { $layer = "back" ; }
+
+ if ($color eq "")
+ { $color = "black" ; }
+
+ $explanation = "\nA line is defined as follows:\n" .
+ " Perpendicular to the time axis: 'at frompos tillpos'\n" .
+ " Parralel to the time axis: 'from till atpos'\n" .
+ " Any direction: points(x1,y1)(x2,y2)\n" .
+ " at,from,till expect date/time values, just like with command PlotData\n" .
+ " frompos,tillpos,atpos,x1,x2,y1,y2 expect coordinates (e.g. pixels values)\n" ;
+
+ if (($at ne "") && (($from ne "") || ($till ne "") || ($points ne "")))
+ { &Error ("LineData attribute 'at' can not be combined with 'from', 'till' or 'points'\n" . $explanation) ;
+ $explanation = "" ;
+ &GetData ; next LineData ; }
+
+ if ((($from ne "") && ($till eq "")) || (($from eq "") && ($till ne "")))
+ { &Error ("LineData attributes 'from' and 'till' should always be specified together\n" . $explanation) ;
+ $explanation = "" ;
+ &GetData ; next LineData ; }
+
+ if (($points ne "") && (($from ne "") || ($till ne "") || ($at ne "")))
+ { &Error ("LineData attribute 'points' can not be combined with 'at', 'from' or 'till'\n" . $explanation) ;
+ $explanation = "" ;
+ &GetData ; next LineData ; }
+
+ if ($at ne "")
+ { push @DrawLines, sprintf ("1|%s|%s|%s|%s|%s|%s\n", $at, $frompos, $tillpos, lc ($color), $width, lc ($layer)) ; }
+
+ if ($from ne "")
+ { push @DrawLines, sprintf ("2|%s|%s|%s|%s|%s|%s\n", $atpos, $from, $till, lc ($color), $width, lc ($layer)) ; }
+
+ if ($points ne "")
+ { push @DrawLines, sprintf ("3|%s|%s|%s|%s\n", $points, lc ($color), $width, lc ($layer)) ; }
+ &GetData ;
+ }
+}
+
+sub ParseImageSize
+{
+ if (! &ValidAttributes ("ImageSize")) { return ; }
+
+ &CheckPreset ("ImageSize") ;
+
+ foreach $attribute (keys %Attributes)
+ {
+ my $attrvalue = @Attributes {$attribute} ;
+
+ if ($attribute =~ /Width|Height/i)
+ {
+ if ($attrvalue !~ /auto/i)
+ {
+ if (! &ValidAbs ($attrvalue))
+ { &Error ("ImageSize attribute '$attribute' invalid.\n" .
+ "Specify value as x[.y][px, in, cm] examples: '200', '20px', '1.3in'") ; return ; }
+ }
+ }
+
+ elsif ($attribute =~ /BarIncrement/i)
+ {
+ if (! &ValidAbs ($attrvalue))
+ { &Error ("ImageSize attribute '$attribute' invalid.\n" .
+ "Specify value as x[.y][px, in, cm] examples: '200', '20px', '1.3in'") ; return ; }
+
+ @Attributes {"barinc"} = $attrvalue ;
+ }
+# if ($attribute =~ /Width/i)
+# { @Attributes {"width"} = $attrvalue ; }
+# elsif ($attribute =~ /Height/i)
+# { @Attributes {"height"} = $attrvalue ; }
+ }
+
+ if ((@Attributes {"width"} =~ /auto/i) || (@Attributes {"height"} =~ /auto/i))
+ {
+ if (@Attributes {"barinc"} eq "")
+ { &Error ("ImageSize attribute 'barincrement' missing.\n" .
+ "Automatic determination of image width or height implies specification of this attribute") ; return ; }
+ }
+
+ if ((@Attributes {"width"} !~ /auto/i) && (@Attributes {"height"} !~ /auto/i))
+ {
+ if (@Attributes {"barinc"} ne "")
+ { &Error ("ImageSize attribute 'barincrement' not valid now.\n" .
+ "This attribute is only valid (and mandatory) in combination with 'width:auto' or 'height:auto'") ; return ; }
+ }
+
+ %Image = %Attributes ;
+}
+
+sub ParseLegend
+{
+ if (! &ValidAttributes ("Legend")) { return ; }
+
+ &CheckPreset ("Legend") ;
+
+ foreach $attribute (keys %Attributes)
+ {
+ my $attrvalue = @Attributes {$attribute} ;
+
+ if ($attribute =~ /Columns/i)
+ {
+ if (($attrvalue < 1) || ($attrvalue > 4))
+ { &Error ("Legend attribute 'columns' invalid. Specify 1,2,3 or 4") ; return ; }
+ }
+ elsif ($attribute =~ /Orientation/i)
+ {
+ if (! ($attrvalue =~ /^(?:hor|horizontal|ver|vertical)$/i))
+ { &Error ("Legend attribute '$attrvalue' invalid. Specify hor[izontal] or ver[tical]") ; return ; }
+
+ @Attributes {"orientation"} = substr ($attrvalue,0,3) ;
+ }
+ elsif ($attribute =~ /Position/i)
+ {
+ if (! ($attrvalue =~ /^(?:top|bottom|right)$/i))
+ { &Error ("Legend attribute '$attrvalue' invalid.\nSpecify top, bottom or right") ; return ; }
+ }
+ elsif ($attribute =~ /Left/i)
+ {
+ if (! &ValidAbsRel ($attrvalue))
+ { &Error ("Legend attribute '$attribute' invalid.\nSpecify value as x[.y][px, in, cm] examples: '200', '20px', '1.3in'") ; return ; } }
+ elsif ($attribute =~ /Top/i)
+ {
+ if (! &ValidAbsRel ($attrvalue))
+ { &Error ("Legend attribute '$attribute' invalid.\nSpecify value as x[.y][px, in, cm] examples: '200', '20px', '1.3in'") ; return ; } }
+ elsif ($attribute =~ /ColumnWidth/i)
+ {
+ if (! &ValidAbsRel ($attrvalue))
+ { &Error ("Legend attribute '$attribute' invalid.\nSpecify value as x[.y][px, in, cm] examples: '200', '20px', '1.3in'") ; return ; }
+ }
+ }
+
+ if (defined (@Attributes {"position"}))
+ {
+ if (defined (@Attributes {"left"}))
+ { &Error ("Legend definition invalid. Attributes 'position' and 'left' are mutually exclusive.") ; return ; }
+ }
+ else
+ {
+ if ((! defined (@Attributes {"left"})) && (! defined (@Attributes {"top"})))
+ {
+ &Info ("Legend definition: none of attributes 'position', 'left' or 'top' have been defined. Position 'bottom' assumed.") ;
+ @Attributes {"position"} = "bottom" ;
+ }
+ elsif ((! defined (@Attributes {"left"})) || (! defined (@Attributes {"top"})))
+ { &Error ("Legend definition invalid. Specify 'position', or 'left' & 'top'.") ; return ; }
+ }
+
+ if (@Attributes {"position"} =~ /right/i)
+ {
+ if (defined (@Attributes {"columns"}))
+ { &Error ("Legend definition invalid.\nAttribute 'columns' and 'position:right' are mutually exclusive.") ; return ; }
+ if (defined (@Attributes {"columnwidth"}))
+ { &Error ("Legend definition invalid.\nAttribute 'columnwidth' and 'position:right' are mutually exclusive.") ; return ; }
+ }
+
+ if (@Attributes {"orientation"} =~ /hor/i)
+ {
+ if (@Attributes {"position"} =~ /right/i)
+ { &Error ("Legend definition invalid.\n'position:right' and 'orientation:horizontal' are mutually exclusive.") ; return ; }
+ if (defined (@Attributes {"columns"}))
+ { &Error ("Legend definition invalid.\nAttribute 'columns' and 'orientation:horizontal' are mutually exclusive.") ; return ; }
+ if (defined (@Attributes {"columnwidth"}))
+ { &Error ("Legend definition invalid.\nAttribute 'columnwidth' and 'orientation:horizontal' are mutually exclusive.") ; return ; }
+ }
+
+ if ((@Attributes {"orientation"} =~ /hor/i) && (defined (@Attributes {"columns"})))
+ { &Error ("Legend definition invalid.\nDo not specify attribute 'columns' with 'orientation:horizontal'.") ; return ; }
+
+ if (@Attributes {"columns"} > 1)
+ {
+ if ((defined (@Attributes {"left"})) && (! defined (@Attributes {"columnwidth"})))
+ { &Error ("Legend attribute 'columnwidth' not defined.\nThis is needed when attribute 'left' is specified.") ; return ; }
+ }
+
+ if (! defined (@Attributes {"orientation"}))
+ { @Attributes {"orientation"} = "ver" ; }
+
+ %Legend = %Attributes ;
+}
+
+sub ParsePeriod
+{
+ if (! defined ($DateFormat))
+ { &Error ("Period definition ambiguous. No (valid) command 'DateFormat' specified in previous lines.") ; return ; }
+
+ if (! ValidAttributes ("Period")) { return ; }
+
+ foreach $attribute (keys %Attributes)
+ {
+ my $attrvalue = @Attributes {$attribute} ;
+
+ if ($DateFormat eq "yyyy")
+ {
+ if ($attrvalue !~ /^\-?\d+$/)
+ { &Error ("Period definition invalid.\nInvalid year '$attrvalue' specified for attribute '$attribute'.") ; return ; }
+ }
+ elsif ($DateFormat eq "x.y")
+ {
+ if (! ($attrvalue =~ /^\-?\d+(?:\.\d+)?$/))
+ { &Error ("Period definition invalid.\nInvalid year '$attrvalue' specified for attribute '$attribute'.") ; return ; }
+ }
+ else
+ {
+ if (($attrvalue =~ /^\d+$/) && ($attrvalue >= 1800) && ($attrvalue <= 2030))
+ {
+ if ($attribute =~ /^From$/i)
+ { $attrvalue = "01/01/" . $attrvalue ; }
+ if ($attribute =~ /^Till$/i)
+ {
+ if ($DateFormat eq "dd/mm/yyyy")
+ { $attrvalue = "31/12/" . $attrvalue ; }
+ else
+ { $attrvalue = "12/31/" . $attrvalue ; }
+ }
+ }
+
+ $ValidDate = &ValidDateFormat ($attrvalue) ;
+ if (! $ValidDate)
+ { &Error ("Period attribute '$attribute' invalid.\n" .
+ "Date does not conform to specified DateFormat '$DateFormat'.") ; return ; }
+ if (substr ($attrvalue,6,4) < 1800)
+ { &Error ("Period attribute '$attribute' invalid. Specify year >= 1800.") ; return ; }
+
+ @Attributes {$attribute} = $attrvalue ;
+ }
+ }
+
+ %Period = %Attributes ;
+}
+
+sub ParsePlotArea
+{
+ if (! &ValidAttributes ("PlotArea")) { return ; }
+
+ &CheckPreset ("PlotArea") ;
+
+ foreach $attribute (@Attributes)
+ {
+ my $attrvalue = @Attributes {$attribute} ;
+ if (! &ValidAbsRel ($attrvalue))
+ { &Error ("PlotArea attribute '$attribute' invalid.\n" .
+ "Specify value as x[.y][px, in, cm, %] examples: '200', '20px', '1.3in', '80%'") ; return ; }
+ }
+
+ if ((@Attributes {"top"} ne "") && (@Attributes {"height"} ne ""))
+ { &Error ("PlotArea attributes 'top' and 'height' are mutually exclusive. Specify only one of them.") ; return ; }
+
+ if ((@Attributes {"right"} ne "") && (@Attributes {"width"} ne ""))
+ { &Error ("PlotArea attributes 'right' and 'width' are mutually exclusive. Specify only one of them.") ; return ; }
+
+ if ((@Attributes {"top"} eq "") && (@Attributes {"height"} eq ""))
+ { &Error ("PlotArea definition incomplete. Either attribute 'top' (advised) or 'height' should be specified") ; return ; }
+
+ if ((@Attributes {"right"} eq "") && (@Attributes {"width"} eq ""))
+ { &Error ("PlotArea definition incomplete. Either attribute 'right' (advised) or 'width' should be specified") ; return ; }
+
+ %PlotArea = %Attributes ;
+}
+
+# command Bars found ?
+# Y | N
+# bar: found ? | bar: found ?
+# Y | N | Y | N
+# validate | previous bar: found? | @Bars contains | previous bar: found?
+# bar:.. | | bar: ? | Y | N
+# | Y | N | | copy | assume
+# | copy | $#Bars .. | Y | N | bar: | bar:---
+# | bar: |== 0 | - | assume | |
+# | | assume bar:--- | | bar:--- | |
+# | |== 1 |
+# | | assume @Bar[0] |
+# | |> 1 |
+# | | err |
+sub ParsePlotData
+{
+ if (defined (@Bars))
+ { $BarsCommandFound = $true ; }
+ else
+ { $BarsCommandFound = $false ; }
+ $prevbar = "" ;
+
+ if ((! (defined ($DateFormat))) || (@Period {"from"} eq "") || (@Axis {"time"} eq ""))
+ {
+ if (! (defined ($DateFormat)))
+ { &Error ("PlotData invalid. No (valid) command 'DateFormat' specified in previous lines.") ; }
+ elsif (@Period {"from"} eq "")
+ { &Error ("PlotData invalid. No (valid) command 'Period' specified in previous lines.") ; }
+ else
+ { &Error ("PlotData invalid. No (valid) command 'TimeAxis' specified in previous lines.") ; }
+
+ &GetData ;
+ while ((! $InputParsed) && (! $NoData))
+ { &GetData ; }
+ return ;
+ }
+
+ &GetData ;
+ if ($NoData)
+ { &Error ("Data expected for command 'PlotData', but line is not indented.\n") ; return ; }
+
+ my ($bar, $at, $from, $till, $color, $bgcolor, $textcolor, $fontsize, $width,
+ $text, $anchor, $align, $shift, $shiftx, $shifty, $mark, $markcolor, $link, $hint) ;
+
+ @PlotDefs {"anchor"} = "middle" ;
+
+ PlotData:
+ while ((! $InputParsed) && (! $NoData))
+ {
+ if (! &ValidAttributes ("PlotData"))
+ { &GetData ; next ;}
+
+ $bar = "" ; # $barset = "" ;
+ $at = "" ; $from = "" ; $till = "" ;
+ $color = "barcoldefault" ; $bgcolor = "" ; $textcolor = "black" ; $fontsize = "S" ; $width = "0.25" ;
+ $text = "" ; $align = "left" ; $shift = "" ; $shiftx = "" ; $shifty = "" ; $anchor = "" ;
+ $mark = "" ; $markcolor = "" ;
+ $link = "" ; $hint = "" ;
+
+ &CheckPreset ("PlotData") ;
+
+ if (defined (@PlotDefs {"bar"})) { $bar = @PlotDefs {"bar"} ; }
+ # if (defined (@PlotDefs {"barset"})) { $barset = @PlotDefs {"barset"} ; }
+ if (defined (@PlotDefs {"color"})) { $color = @PlotDefs {"color"} ; }
+ if (defined (@PlotDefs {"bgcolor"})) { $bgcolor = @PlotDefs {"bgcolor"} ; }
+ if (defined (@PlotDefs {"textcolor"})) { $textcolor = @PlotDefs {"textcolor"} ; }
+ if (defined (@PlotDefs {"fontsize"})) { $fontsize = @PlotDefs {"fontsize"} ; }
+ if (defined (@PlotDefs {"width"})) { $width = @PlotDefs {"width"} ; }
+ if (defined (@PlotDefs {"anchor"})) { $anchor = @PlotDefs {"anchor"} ; }
+ if (defined (@PlotDefs {"align"})) { $align = @PlotDefs {"align"} ; }
+ if (defined (@PlotDefs {"shiftx"})) { $shiftx = @PlotDefs {"shiftx"} ; }
+ if (defined (@PlotDefs {"shifty"})) { $shifty = @PlotDefs {"shifty"} ; }
+ if (defined (@PlotDefs {"mark"})) { $mark = @PlotDefs {"mark"} ; }
+ if (defined (@PlotDefs {"markcolor"})) { $markcolor = @PlotDefs {"markcolor"} ; }
+# if (defined (@PlotDefs {"link"})) { $link = @PlotDefs {"link"} ; }
+# if (defined (@PlotDefs {"hint"})) { $hint = @PlotDefs {"hint"} ; }
+
+ foreach $attribute (keys %Attributes)
+ {
+ my $attrvalue = @Attributes {$attribute} ;
+
+ if ($attribute =~ /^Bar$/i)
+ {
+ if (! ($attrvalue =~ /[a-zA-Z0-9\_]+/))
+ { &Error ("PlotData attribute '$attribute' invalid.\n" .
+ "Use only characters 'a'-'z', 'A'-'Z', '0'-'9', '_'\n") ;
+ &GetData ; next PlotData ; }
+
+ $attrvalue2 = $attrvalue ;
+
+ if ($BarsCommandFound)
+ {
+ if (! &BarDefined ($attrvalue2))
+ { &Error ("PlotData invalid. Bar '$attrvalue' not (properly) defined.") ;
+ &GetData ; next PlotData ; }
+ }
+ else
+ {
+ if (! &BarDefined ($attrvalue2))
+ {
+ if (@Axis {"time"} eq "x")
+ { push @Bars, $attrvalue2 ; }
+ else
+ { unshift @Bars, $attrvalue2 ; }
+ }
+ }
+ $bar = $attrvalue2 ;
+ $prevbar = $bar ;
+ }
+ elsif ($attribute =~ /^BarSet$/i)
+ {
+ if (! ($attrvalue =~ /[a-zA-Z0-9\_]+/))
+ { &Error ("PlotData attribute '$attribute' invalid.\n" .
+ "Use only characters 'a'-'z', 'A'-'Z', '0'-'9', '_'\n") ;
+ &GetData ; next PlotData ; }
+
+ $attrvalue2 = $attrvalue ;
+
+ if ($attrvalue =~ /break/i)
+ { $barndx = 0 ; }
+ elsif ($attrvalue =~ /skip/i)
+ {
+ $barndx ++ ;
+ &BarDefined ($prevbar . "#" . $barndx) ;
+ }
+ else
+ {
+ if ($BarsCommandFound)
+ {
+ if (! &BarDefined ($attrvalue2 . "#1"))
+ { &Error ("PlotData invalid. BarSet '$attrvalue' not (properly) defined with command BarData.") ;
+ &GetData ; next PlotData ; }
+ }
+ $bar = $attrvalue2 ;
+ if ($bar ne $prevbar)
+ { $barndx = 0 ; }
+ $prevbar = $bar ;
+ }
+ }
+ elsif ($attribute =~ /^(?:At|From|Till)$/i)
+ {
+ if ($attrvalue =~ /^Start$/i)
+ { $attrvalue = @Period {"from"} ; }
+ if ($attrvalue =~ /^End$/i)
+ { $attrvalue = @Period {"till"} ; }
+
+ if (! &ValidDateFormat ($attrvalue))
+ {
+ &Error ("PlotData attribute '$attribute' invalid.\n" .
+ "Date '$attrvalue' does not conform to specified DateFormat $DateFormat.") ;
+ &GetData ; next PlotData ; }
+
+ if (! &ValidDateRange ($attrvalue))
+ { &Error ("Plotdata attribute '$attribute' invalid.\n" .
+ "Date '$attrvalue' not within range as specified by command Period.") ;
+
+ &GetData ; next PlotData ; }
+
+ if ($attribute =~ /^At$/i)
+ { $at = $attrvalue ; }
+ elsif ($attribute =~ /^From$/i)
+ { $from = $attrvalue ; }
+ else
+ { $till = $attrvalue ; }
+ }
+# elsif ($attribute =~ /^From$/i)
+# {
+# if ($attrvalue =~ /^Start$/i)
+# { $attrvalue = @Period {"from"} ; }
+
+# if (! &ValidDateFormat ($attrvalue))
+# { &Error ("PlotData invalid.\nDate '$attrvalue' does not conform to specified DateFormat $DateFormat.") ;
+# &GetData ; next PlotData ; }
+
+# if (! &ValidDateRange ($attrvalue))
+# { &Error ("Plotdata attribute 'from' invalid.\n" .
+# "Date '$attrvalue' not within range as specified by command Period.") ;
+# &GetData ; next PlotData ; }
+
+# $from = $attrvalue ;
+# }
+# elsif ($attribute =~ /^Till$/i)
+# {
+# if ($attrvalue =~ /^End$/i)
+# { $attrvalue = @Period {"till"} ; }
+
+# if (! &ValidDateFormat ($attrvalue))
+# { &Error ("PlotData invalid. Date '$attrvalue' does not conform to specified DateFormat $DateFormat.") ;
+# &GetData ; next PlotData ; }
+
+# if (! &ValidDateRange ($attrvalue))
+# { &Error ("Plotdata attribute 'till' invalid.\n" .
+# "Date '$attrvalue' not within range as specified by command Period.") ;
+# &GetData ; next PlotData ; }
+
+# $till = $attrvalue ;
+# }
+ elsif ($attribute =~ /^Color$/i)
+ {
+ if (! &ColorPredefined ($attrvalue))
+ {
+ if (! defined (@Colors {lc ($attrvalue)}))
+ { &Error ("PlotData invalid. Attribute '$attribute' has unknown color '$attrvalue'.\n" .
+ " Specify command 'Color' before this command.") ;
+ &GetData ; next PlotData ; }
+ }
+ if (defined (@Colors {lc ($attrvalue)}))
+ { $color = @Colors { lc ($attrvalue) } ; }
+ else
+ { $color = lc ($attrvalue) ; }
+
+ $color = $attrvalue ;
+ }
+ elsif ($attribute =~ /^BgColor$/i)
+ {
+ if (! &ColorPredefined ($attrvalue))
+ {
+ if (! defined (@Colors {lc ($attrvalue)}))
+ { &Error ("PlotData invalid. Attribute '$attribute' has unknown color '$attrvalue'.\n" .
+ " Specify command 'Color' before this command.") ;
+ &GetData ; next PlotData ; }
+ }
+ if (defined (@Colors {lc ($attrvalue)}))
+ { $bgcolor = @Colors { lc ($attrvalue) } ; }
+ else
+ { $bgcolor = lc ($attrvalue) ; }
+ }
+ elsif ($attribute =~ /^TextColor$/i)
+ {
+ if (! &ColorPredefined ($attrvalue))
+ {
+ if (! defined (@Colors {lc ($attrvalue)}))
+ { &Error ("PlotData invalid. Attribute '$attribute' contains unknown color '$attrvalue'.\n" .
+ " Specify command 'Color' before this command.") ;
+ &GetData ; next PlotData ; }
+ }
+ if (defined (@Colors {lc ($attrvalue)}))
+ { $textcolor = @Colors { lc ($attrvalue) } ; }
+ else
+ { $textcolor = lc ($attrvalue) ; }
+ }
+ elsif ($attribute =~ /^Width$/i)
+ {
+ $width = &Normalize ($attrvalue) ;
+ if ($width > $MaxBarWidth)
+ { $MaxBarWidth = $width ; }
+ }
+ elsif ($attribute =~ /^FontSize$/i)
+ {
+ if (($attrvalue !~ /\d+(?:\.\d)?/) && ($attrvalue !~ /xs|s|m|l|xl/i))
+ { &Error ("PlotData invalid. Specify for attribute '$attribute' a number of XS,S,M,L,XL.") ;
+ &GetData ; next PlotData ; }
+
+ $fontsize = $attrvalue ;
+ if ($fontsize =~ /(?:XS|S|M|L|XL)/i)
+ {
+ if ($fontsize !~ /(?:xs|s|m|l|xl)/i)
+ {
+ if ($fontsize < 6)
+ { &Warning ("TextData attribute 'fontsize' value too low. Font size 6 assumed.\n") ;
+ $fontsize = 6 ; }
+ if ($fontsize > 30)
+ { &Warning ("TextData attribute 'fontsize' value too high. Font size 30 assumed.\n") ;
+ $fontsize = 30 ; }
+ }
+ }
+ }
+ elsif ($attribute =~ /^Anchor$/i)
+ {
+ if (! ($attrvalue =~ /^(?:from|till|middle)$/i))
+ { &Error ("PlotData value '$attribute' invalid. Specify 'from', 'till' or 'middle'.") ;
+ &GetData ; next PlotData ; }
+
+ $anchor = lc ($attrvalue) ;
+ }
+ elsif ($attribute =~ /^Align$/i)
+ {
+ if (! ($attrvalue =~ /^(?:left|right|center)$/i))
+ { &Error ("PlotData value '$attribute' invalid. Specify 'left', 'right' or 'center'.") ;
+ &GetData ; next PlotData ; }
+
+ $align = lc ($attrvalue) ;
+ }
+ elsif ($attribute =~ /^Shift$/i)
+ {
+ $shift = $attrvalue ;
+ $shift =~ s/$hBrO(.*?)$hBrC/$1/ ;
+ $shift =~ s/\s//g ;
+ ($shiftx2,$shifty2) = split (",", $shift) ;
+ if ($shiftx2 ne "")
+ { $shiftx = &Normalize ($shiftx2) ; }
+ if ($shifty2 ne "")
+ { $shifty = &Normalize ($shifty2) ; }
+
+ if (($shiftx < -10) || ($shiftx > 10) || ($shifty < -10) || ($shifty > 10))
+ { &Error ("PlotData invalid. Attribute '$shift', specify value(s) between -1000 and 1000 pixels = -10 and 10 inch.") ;
+ &GetData ; next PlotData ; }
+ }
+ elsif ($attribute =~ /^Text$/i)
+ {
+ $text = &ParseText ($attrvalue) ;
+ $text =~ s/\\n/\n/g ;
+ if ($text =~ /\^/)
+ { &Warning ("TextData attribute 'text' contains ^ (caret).\n" .
+ "Caret symbol will not be translated into tab character (use TextData when tabs are needed)") ; }
+
+# $text=~ s/(\[\[ [^\]]* \n [^\]]* \]\])/&NormalizeWikiLink($1)/gxe ;
+ $text=~ s/(\[\[? [^\]]* \n [^\]]* \]?\])/&NormalizeWikiLink($1)/gxe ;
+ }
+ elsif ($attribute =~ /^Link$/i)
+ {
+ $link = &ParseText ($attrvalue) ;
+ $link = &EncodeURL (&NormalizeURL ($link)) ;
+ }
+# elsif ($attribute =~ /^Hint$/i)
+# {
+# $hint = &ParseText ($attrvalue) ;
+# $hint =~ s/\\n/\n/g ;
+# }
+ elsif ($attribute =~ /^Mark$/i)
+ {
+ $attrvalue =~ s/$hBrO (.*) $hBrC/$1/x ;
+ (@suboptions) = split (",", $attrvalue) ;
+ $mark = @suboptions [0] ;
+ if (! ($mark =~ /^(?:Line|None)$/i))
+ { &Error ("PlotData invalid. Value '$mark' for attribute 'mark' unknown.") ;
+ &GetData ; next PlotData ; }
+
+ if (defined (@suboptions [1]))
+ {
+ $markcolor = @suboptions [1] ;
+
+ if (! &ColorPredefined ($markcolor))
+ {
+ if (! defined (@Colors {lc ($markcolor)}))
+ { &Error ("PlotData invalid. Attribute 'mark': unknown color '$markcolor'.\n" .
+ " Specify command 'Color' before this command.") ;
+ &GetData ; next PlotData ; }
+ }
+ $markcolor = lc ($markcolor) ;
+ }
+ else
+ { $markcolor = "black" ; }
+ }
+ else
+ { &Error ("PlotData invalid. Unknown attribute '$attribute' found.") ;
+ &GetData ; next PlotData ; }
+ }
+
+# if ($text =~ /\[\[.*\[\[/s)
+# { &Error ("PlotData invalid. Text segment '$text' contains more than one wiki link. Only one allowed.") ;
+# &GetData ; next PlotData ; }
+
+# if (($text ne "") || ($link ne ""))
+# { ($text, $link, $hint) = &ProcessWikiLink ($text, $link, $hint) ; }
+
+ $shift = $shiftx . "," . $shifty ;
+
+ if ($MaxBarWidth eq "")
+ { $MaxBarWidth = $width - 0.001 ; }
+
+ if ($bar ne "")
+ {
+ if (! defined (@BarLegend {lc($bar)}))
+ { @BarLegend {lc($bar)} = $bar ; }
+ if (! defined (@BarWidths {$bar}))
+ { @BarWidths {$bar} = $width ; } # was 0 ??
+ }
+
+ if (($at eq "") && ($from eq "") && ($till eq "")) # upd defaults
+ {
+ if ($bar ne "") { @PlotDefs {"bar"} = $bar ; }
+# if ($barset ne "") { @PlotDefs {"barset"} = $barset ; }
+ if ($color ne "") { @PlotDefs {"color"} = $color ; }
+ if ($bgcolor ne "") { @PlotDefs {"bgcolor"} = $bgcolor ; }
+ if ($textcolor ne "") { @PlotDefs {"textcolor"} = $textcolor ; }
+ if ($fontsize ne "") { @PlotDefs {"fontsize"} = $fontsize ; }
+ if ($width ne "") { @PlotDefs {"width"} = $width ; }
+ if ($anchor ne "") { @PlotDefs {"anchor"} = $anchor ; }
+ if ($align ne "") { @PlotDefs {"align"} = $align ; }
+ if ($shiftx ne "") { @PlotDefs {"shiftx"} = $shiftx ; }
+ if ($shifty ne "") { @PlotDefs {"shifty"} = $shifty ; }
+ if ($mark ne "") { @PlotDefs {"mark"} = $mark ; }
+ if ($markcolor ne "") { @PlotDefs {"markcolor"} = $markcolor ; }
+# if ($link ne "") { @PlotDefs {"link"} = $link ; }
+# if ($hint ne "") { @PlotDefs {"hint"} = $hint ; }
+ &GetData ; next PlotData ;
+ }
+
+ if ($bar eq "")
+ {
+ if ($prevbar ne "")
+ { $bar = $prevbar ; }
+ else
+ {
+# if ($BarsCommandFound)
+# {
+ if ($#Bars > 0)
+ { &Error ("PlotData invalid. Specify attribute 'bar'.") ;
+ &GetData ; next PlotData ; }
+ elsif ($#Bars == 0)
+ {
+ $bar = @Bars [0] ;
+ &Info ($data, "PlotData incomplete. Attribute 'bar' missing, value '" . @Bars [0] . "' assumed.") ;
+ }
+ else
+ { $bar = "1" ; }
+# }
+# else
+# {
+# if ($#Bars > 0)
+# { &Error ("PlotData invalid. Attribute 'bar' missing.") ;
+# &GetData ; next PlotData ; }
+# elsif ($#Bars == 0)
+# {
+# $bar = @Bars [0] ;
+# &Info ($data, "PlotData incomplete. Attribute 'bar' missing, value '" . @Bars [0] . "' assumed.") ;
+# }
+# else { $bar = "1" ; }
+# }
+ $prevbar = $bar ;
+ }
+ }
+
+ if (&BarDefined ($bar . "#1")) # bar is actually a bar set
+ {
+ if (($from ne "") || ($at ne "") || ($text eq " ")) # data line ?
+ {
+ $barndx++ ;
+ if (! &BarDefined ($bar . "#" . $barndx))
+ { $barndx = 1 ; }
+ $bar = $bar . "#" . $barndx ;
+ # $text = $bar ;
+ }
+ }
+
+ if (($at ne "") && (($from ne "") || ($till ne "")))
+ { &Error ("PlotData invalid. Attributes 'at' and 'from/till' are mutually exclusive.") ;
+ &GetData ; next PlotData ; }
+
+ if ((($from eq "") && ($till ne "")) || (($from ne "") && ($till eq "")))
+ { &Error ("PlotData invalid. Specify attribute 'at' or 'from' + 'till'.") ;
+ &GetData ; next PlotData ; }
+
+
+ if ($at ne "")
+ {
+ if ($text ne "")
+ {
+ if ($align eq "")
+ { &Error ("PlotData invalid. Attribute 'align' missing.") ;
+ &GetData ; next PlotData ; }
+ if ($fontsize eq "")
+ { &Error ("PlotData invalid. Attribute '[font]size' missing.") ;
+ &GetData ; next PlotData ; }
+ if ($text eq "")
+ { &Error ("PlotData invalid. Attribute 'text' missing.") ;
+ &GetData ; next PlotData ; }
+ }
+ }
+ else
+ {
+ if (($text ne "") && ($anchor eq ""))
+ { &Error ("PlotData invalid. Attribute 'anchor' missing.") ;
+ &GetData ; next PlotData ; }
+ if ($color eq "")
+ { &Error ("PlotData invalid. Attribute 'color' missing.") ;
+ &GetData ; next PlotData ; }
+ if ($width eq "")
+ { &Error ("PlotData invalid. Attribute 'width' missing.") ;
+ &GetData ; next PlotData ; }
+ }
+
+ if ($from ne "")
+ {
+ if (($link ne "") && ($hint eq ""))
+ { $hint = &ExternalLinkToHint ($link) ; }
+
+ if (($link ne "") || ($hint ne ""))
+ { $MapPNG = $true ; }
+ if ($link ne "")
+ { $MapSVG = $true ; }
+
+ push @PlotBars, sprintf ("%6.3f,%s,%s,%s,%s,%s,%s,\n", $width, $bar, $from, $till, lc ($color),$link,$hint) ;
+ if ($width > @BarWidths {$bar})
+ { @BarWidths {$bar} = $width ; }
+
+ if ($text ne "")
+ {
+ if ($anchor eq "from")
+ { $at = $from ; }
+ elsif ($anchor eq "till")
+ { $at = $till ; }
+ else
+ { $at = &DateMedium ($from, $till) ; }
+ }
+
+ if (($mark ne "") && ($mark !~ /none/i))
+ {
+ push @PlotLines, sprintf ("%s,%s,%s,%s,,,\n", $bar, $from, $from, lc ($markcolor)) ;
+ push @PlotLines, sprintf ("%s,%s,%s,%s,,,\n", $bar, $till, $till, lc ($markcolor)) ;
+ $mark = "" ;
+ }
+ }
+
+ if ($at ne "")
+ {
+ if (($mark ne "") && ($mark !~ /none/i))
+ { push @PlotLines, sprintf ("%s,%s,%s,%s,,,\n", $bar, $at, $at, lc ($markcolor)) ; }
+
+ if ($text ne "")
+ {
+ my $textdetails = "" ;
+
+ if ($link ne "")
+ {
+ if ($text =~ /\[.*\]/)
+ {
+ &Warning ("PlotData contains implicit link(s) in attribute 'text' and explicit attribute 'link'. " .
+ "Implicit link(s) ignored.") ;
+ $text =~ s/\[+ (?:[^\|]* \|)? ([^\]]*) \]+/$1/gx ;
+ }
+ if ($hint eq "")
+ { $hint = &ExternalLinkToHint ($link) ; }
+ }
+
+ if ($anchor eq "")
+ { $anchor = "middle" ; }
+ if ($align eq "")
+ { $align = "center" ; }
+ if ($color eq "")
+ { $color = "black" ; }
+ if ($fontsize eq "")
+ { $fontsize = "S" ; }
+ if ($adjust eq "")
+ { $adjust = "0,0" ; }
+
+# $textdetails = " textdetails: align=$align size=$size" ;
+# if ($textcolor eq "")
+# { $textcolor = "black" ; }
+# if ($color ne "")
+# { $textdetails .= " color=$textcolor" ; }
+
+# my ($xpos, $ypos) ;
+# my $barcnt = 0 ;
+# for ($b = 0 ; $b <= $#Bars ; $b++)
+# {
+# if (lc(@Bars [$b]) eq lc($bar))
+# { $barcnt = ($b + 1) ; last ; }
+# }
+
+# if (@Axis {"time"} eq "x")
+# { $xpos = "$at(s)" ; $ypos = "[$barcnt](s)" ; }
+# else
+# { $ypos = "$at(s)" ; $xpos = "[$barcnt](s)" ; }
+
+# if ($shift ne "")
+# {
+# my ($shiftx, $shifty) = split (",", $shift) ;
+# if ($shiftx > 0)
+# { $xpos .= "+$shiftx" ; }
+# if ($shiftx < 0)
+# { $xpos .= "$shiftx" ; }
+# if ($shifty > 0)
+# { $ypos .= "+$shifty" ; }
+# if ($shifty < 0)
+# { $ypos .= "$shifty" ; }
+# }
+
+ $text =~ s/\,/\#\%\$/g ;
+ $link =~ s/\,/\#\%\$/g ;
+ $hint =~ s/\,/\#\%\$/g ;
+ $shift =~ s/\,/\#\%\$/g ;
+ $textcolor =~ s/\,/\#\%\$/g ;
+ push @PlotText, sprintf ("%s,%s,%s,%s,%s,%s,%s,%s,%s", $at, $bar, $text, $textcolor, $fontsize, $align, $shift, $link, $hint) ;
+ }
+ }
+
+ &GetData ;
+ }
+
+ if ((! $BarsCommandFound) && ($#Bars > 1))
+ { &Info2 ("PlotBars definition: no (valid) command 'BarData' found in previous lines.\nBars will presented in order of appearance in PlotData.") ; }
+
+ $maxwidth = 0 ;
+ foreach $key (keys %BarWidths)
+ {
+ if (@BarWidths {$key} == 0)
+ { &Warning ("PlotData incomplete. No bar width defined for bar '$key', assume width from widest bar (used for line marks).") ; }
+ elsif (@BarWidths {$key} > $maxwidth)
+ { $maxwidth = @BarWidths {$key} ; }
+ }
+ foreach $key (keys %BarWidths)
+ {
+ if (@BarWidths {$key} == 0)
+ { @BarWidths {$key} = $maxwidth ; }
+ }
+}
+
+sub ParsePreset
+{
+ if (! $firstcmd)
+ { &Error ("Specify 'Preset' command before any other commands, if desired at all.\n") ; return ; }
+
+ $preset = @Attributes {"single"} ;
+ if ($preset !~ /^(?:TimeVertical_OneBar_UnitYear|TimeHorizontal_AutoPlaceBars_UnitYear)$/i)
+ { &Error ("Preset value invalid.\n" .
+ " At the moment two presets are available:\n" .
+ " TimeVertical_OneBar_UnitYear and TimeHorizontal_AutoPlaceBars_UnitYear\n" .
+ " See also meta.wikipedia.org/wiki/EasyTimeline/Presets") ; return ; }
+
+ $Preset = $preset ;
+
+ if ($Preset =~ /^TimeVertical_OneBar_UnitYear/i)
+ {
+ $DateFormat = "yyyy" ;
+ $AlignBars = "early" ;
+ @Axis {"format"} = "yyyy" ;
+ @Axis {"time"} = "y" ;
+ @PlotArea {"left"} = 45 ;
+ @PlotArea {"right"} = 10 ;
+ @PlotArea {"top"} = 10 ;
+ @PlotArea {"bottom"} = 10 ;
+ push @PresetList, "PlotArea|+|left|" . @PlotArea {"left"} ;
+ push @PresetList, "PlotArea|+|right|" . @PlotArea {"right"};
+ push @PresetList, "PlotArea|+|top|" . @PlotArea {"top"} ;
+ push @PresetList, "PlotArea|+|bottom|" . @PlotArea {"bottom"} ;
+ push @PresetList, "PlotArea|-|width" ;
+ push @PresetList, "PlotArea|-|height" ;
+ push @PresetList, "Dateformat|-||yyyy" ;
+ push @PresetList, "TimeAxis|=|format|" . @Axis {"format"} ;
+ push @PresetList, "TimeAxis|=|orientation|vertical" ;
+ push @PresetList, "ScaleMajor|=|unit|year" ;
+ push @PresetList, "ScaleMinor|=|unit|year" ;
+ push @PresetList, "AlignBars|=||early" ;
+ push @PresetList, "PlotData|+|mark|" . $hBrO . "line,white" . $hBrC ;
+ push @PresetList, "PlotData|+|align|left" ;
+ push @PresetList, "PlotData|+|fontsize|S" ;
+ push @PresetList, "PlotData|+|width|20" ;
+ push @PresetList, "PlotData|+|shift|" . $hBrO . "20,0" . $hBrC ;
+ }
+ elsif ($Preset =~ /TimeHorizontal_AutoPlaceBars_UnitYear/i)
+ {
+ $DateFormat = "yyyy" ;
+ $AlignBars = "justify" ;
+ @Axis {"format"} = "yyyy" ;
+ @Axis {"time"} = "x" ;
+ @PlotArea {"left"} = 25 ;
+ @PlotArea {"right"} = 25 ;
+ @PlotArea {"top"} = 15 ;
+ @PlotArea {"bottom"} = 30 ;
+ @Image {"height"} = "auto" ;
+ @Image {"barinc"} = 20 ;
+ @BackgroundColors {"canvas"} = "gray(0.7)" ;
+ @Legend {"orientation"} = "ver" ;
+ @Legend {"left"} = @PlotArea {"left"}+10 ;
+ @Legend {"top"} = @PlotArea {"bottom"}+100 ;
+ &StoreColor ("canvas", &EncodeInput ("gray(0.7)"), "") ;
+ &StoreColor ("grid1", &EncodeInput ("gray(0.4)"), "") ;
+ &StoreColor ("grid2", &EncodeInput ("gray(0.2)"), "") ;
+ push @PresetList, "ImageSize|=|height|auto" ;
+ push @PresetList, "ImageSize|+|barincrement|20" ;
+ push @PresetList, "PlotArea|+|left|" . @PlotArea {"left"} ;
+ push @PresetList, "PlotArea|+|right|" . @PlotArea {"right"};
+ push @PresetList, "PlotArea|+|top|" . @PlotArea {"top"} ;
+ push @PresetList, "PlotArea|+|bottom|" . @PlotArea {"bottom"} ;
+ push @PresetList, "PlotArea|-|width" ;
+ push @PresetList, "PlotArea|-|height" ;
+ push @PresetList, "Dateformat|-||yyyy" ;
+ push @PresetList, "TimeAxis|=|format|" . @Axis {"format"} ;
+ push @PresetList, "TimeAxis|=|orientation|horizontal" ;
+ push @PresetList, "ScaleMajor|=|unit|year" ;
+ push @PresetList, "ScaleMajor|+|grid|grid1" ;
+ push @PresetList, "ScaleMinor|=|unit|year" ;
+ push @PresetList, "AlignBars|=||justify" ;
+ push @PresetList, "Legend|+|orientation|" . @Legend {"orientation"} ;
+ push @PresetList, "Legend|+|left|" . @Legend {"left"} ;
+ push @PresetList, "Legend|+|top|" . @Legend {"top"} ;
+ push @PresetList, "PlotData|+|align|left" ;
+ push @PresetList, "PlotData|+|anchor|from" ;
+ push @PresetList, "PlotData|+|fontsize|M" ;
+ push @PresetList, "PlotData|+|width|15" ;
+ push @PresetList, "PlotData|+|textcolor|black" ;
+ push @PresetList, "PlotData|+|shift|" . $hBrO . "4,-6" . $hBrC ;
+ }
+}
+
+sub ParseScale
+{
+ my ($scale) ;
+
+ if ($Command =~ /ScaleMajor/i)
+ { $scale .= 'Major' ; }
+ else
+ { $scale .= 'Minor' ; }
+
+ if (! ValidAttributes ("Scale" . $scale)) { return ; }
+
+ &CheckPreset (Scale . $scale) ;
+
+ @Scales {$scale} = $true ;
+
+ foreach $attribute (keys %Attributes)
+ {
+ my $attrvalue = @Attributes {$attribute} ;
+
+ if ($attribute =~ /Grid/i) # preferred gridcolor instead of grid, grid allowed for compatability
+ {
+ if ((! &ColorPredefined ($attrvalue)) && (! defined (@Colors {lc ($attrvalue)})))
+ { &Error ("Scale attribute '$attribute' invalid. Unknown color '$attrvalue'.\n" .
+ " Specify command 'Color' before this command.") ; return ; }
+ @Attributes {$scale . " grid"} = $attrvalue ;
+ delete (@Attributes {"grid"}) ;
+ }
+ elsif ($attribute =~ /Text/i)
+ {
+ $attrvalue =~ s/\~/\\n/g ;
+ $attrvalue =~ s/^\"//g ;
+ $attrvalue =~ s/\"$//g ;
+ @Attributes {$scale . " stubs"} = $attrvalue ;
+ }
+ elsif ($attribute =~ /Unit/i)
+ {
+ if ($DateFormat eq "yyyy")
+ {
+ if (! ($attrvalue =~ /^(?:year|years)$/i))
+ { &Error ("Scale attribute '$attribute' invalid. DateFormat 'yyyy' implies 'unit:year'.") ; return ; }
+ }
+ else
+ {
+ if (! ($attrvalue =~ /^(?:year|month|day)s?$/i))
+ { &Error ("Scale attribute '$attribute' invalid. Specify year, month or day.") ; return ; }
+ }
+ $attrvalue =~ s/s$// ;
+ @Attributes {$scale . " unit"} = $attrvalue ;
+ delete (@Attributes {"unit"}) ;
+ }
+ elsif ($attribute =~ /Increment/i)
+ {
+ if ((! ($attrvalue =~ /^\d+$/i)) || ($attrvalue == 0))
+ { &Error ("Scale attribute '$attribute' invalid. Specify positive integer.") ; return ; }
+ @Attributes {$scale . " inc"} = $attrvalue ;
+ delete (@Attributes {"increment"}) ;
+ }
+ elsif ($attribute =~ /Start/i)
+ {
+ if (! (defined ($DateFormat)))
+ { &Error ("Scale attribute '$attribute' invalid.\n" .
+ "No (valid) command 'DateFormat' specified in previous lines.") ; return ; }
+
+ if (($DateFormat eq "dd/mm/yyyy") || ($DateFormat eq "mm/dd/yyyy"))
+ {
+ if (($attrvalue =~ /^\d+$/) && ($attrvalue >= 1800) && ($attrvalue <= 2030))
+ { $attrvalue = "01/01/" . $attrvalue ; }
+ }
+
+ if (! &ValidDateFormat ($attrvalue))
+ { &Error ("Scale attribute '$attribute' invalid.\n" .
+ "Date does not conform to specified DateFormat '$DateFormat'.") ; return ; }
+
+ if (($DateFormat =~ /\d\d\/\d\d\/\d\d\d\d/) && (substr ($attrvalue,6,4) < 1800))
+ { &Error ("Scale attribute '$attribute' invalid.\n" .
+ " Specify year >= 1800.") ; return ; }
+
+ if (! &ValidDateRange ($attrvalue))
+ { &Error ("Scale attribute '$attribute' invalid.\n" .
+ "Date '$attrvalue' not within range as specified by command Period.") ; return ; }
+
+ @Attributes {$scale . " start"} = $attrvalue ;
+ delete (@Attributes {"start"}) ;
+ }
+ if ($DateFormat eq "yyyy") { @Attributes {$scale . " unit"} = "year" ; }
+ }
+
+ foreach $attribute (keys %Attributes)
+ { @Scales {$attribute} = @Attributes {$attribute} ; }
+}
+
+sub ParseTextData
+{
+ &GetData ;
+ if ($NoData)
+ { &Error ("Data expected for command 'TextData', but line is not indented.\n") ; return ; }
+
+ my ($pos, $tabs, $fontsize, $lineheight, $textcolor, $text, $link, $hint) ;
+
+ TextData:
+ while ((! $InputParsed) && (! $NoData))
+ {
+ if (! &ValidAttributes ("TextData"))
+ { &GetData ; next ;}
+
+ &CheckPreset ("TextData") ;
+
+ $pos = "" ; $tabs = "" ; $fontsize = "" ; $lineheight = "" ; $textcolor = "" ; $link = "" ; $hint = "" ;
+
+ if (defined (@TextDefs {"tabs"})) { $tabs = @TextDefs {"tabs"} ; }
+ if (defined (@TextDefs {"fontsize"})) { $fontsize = @TextDefs {"fontsize"} ; }
+ if (defined (@TextDefs {"lineheight"})) { $lineheight = @TextDefs {"lineheight"} ; }
+ if (defined (@TextDefs {"textcolor"})) { $textcolor = @TextDefs {"textcolor"} ; }
+
+ my $data2 = $data ;
+ ($data2, $text) = &ExtractText ($data2) ;
+ @Attributes = split (" ", $data2) ;
+
+ foreach $attribute (keys %Attributes)
+ {
+ my $attrvalue = @Attributes {$attribute} ;
+
+ if ($attribute =~ /^FontSize$/i)
+ {
+ if (($attrvalue !~ /\d+(?:\.\d)?/) && ($attrvalue !~ /^(?:xs|s|m|l|xl)$/i))
+ { &Error ("TextData invalid. Attribute '$attribute': specify number of XS,S,M,L,XL.") ;
+ &GetData ; next TextData ; }
+
+ $fontsize = $attrvalue ;
+
+ if ($fontsize !~ /^(?:xs|s|m|l|xl)$/i)
+ {
+ if ($fontsize < 6)
+ { &Warning ("TextData attribute 'fontsize' value too low. Font size 6 assumed.\n") ;
+ $fontsize = 6 ; }
+ if ($fontsize > 30)
+ { &Warning ("TextData attribute 'fontsize' value too high. Font size 30 assumed.\n") ;
+ $fontsize = 30 ; }
+ }
+ }
+ elsif ($attribute =~ /^LineHeight$/i)
+ {
+ $lineheight = &Normalize ($attrvalue) ;
+ if (($lineheight < -0.4) || ($lineheight > 0.4))
+ {
+ if (! $bypass)
+ { &Error ("TextData attribute 'lineheight' invalid.\n" .
+ "Specify value up to 40 pixels = 0.4 inch\n" .
+ "Run with option -b (bypass checks) when this is correct.\n") ; }
+ }
+ }
+ elsif ($attribute =~ /^Pos$/i)
+ {
+ $attrvalue =~ s/\s*$hBrO (.*) $hBrC\s*/$1/x ;
+ ($posx,$posy) = split (",", $attrvalue) ;
+ $posx = &Normalize ($posx) ;
+ $posy = &Normalize ($posy) ;
+ $pos = "$posx,$posy" ;
+ }
+ elsif ($attribute =~ /^Tabs$/i)
+ {
+ $tabs = $attrvalue ;
+ }
+ elsif ($attribute =~ /^(?:Color|TextColor)$/i)
+ {
+ if (! &ColorPredefined ($attrvalue))
+ {
+ if (! defined (@Colors {lc ($attrvalue)}))
+ { &Error ("TextData invalid. Attribute '$attribute' contains unknown color '$attrvalue'.\n" .
+ " Specify command 'Color' before this command.") ;
+ &GetData ; next TextData ; }
+ }
+ if (defined (@Colors {lc ($attrvalue)}))
+ { $textcolor = @Colors { lc ($attrvalue) } ; }
+ else
+ { $textcolor = lc ($attrvalue) ; }
+ }
+ elsif ($attribute =~ /^Text$/i)
+ {
+ $text = $attrvalue ;
+ $text =~ s/\\n/~/gs ;
+ if ($text =~ /\~/)
+ { &Warning ("TextData attribute 'text' contains ~ (tilde).\n" .
+ "Tilde will not be translated into newline character (only in PlotData)") ; }
+
+ }
+ elsif ($attribute =~ /^Link$/i)
+ {
+ $link = &ParseText ($attrvalue) ;
+ $link = &EncodeURL (&NormalizeURL ($link)) ;
+ }
+ }
+
+ if ($fontsize eq "")
+ { $fontsize = "S" ; }
+
+ if ($lineheight eq "")
+ {
+ if ($fontsize =~ /^(?:XS|S|M|L|XL)$/i)
+ {
+ if ($fontsize =~ /XS/i) { $lineheight = 0.11 ; }
+ elsif ($fontsize =~ /S/i) { $lineheight = 0.13 ; }
+ elsif ($fontsize =~ /M/i) { $lineheight = 0.155 ; }
+ elsif ($fontsize =~ /XL/i) { $lineheight = 0.24 ; }
+ else { $lineheight = 0.19 ; }
+ }
+ else
+ {
+ $lineheight = sprintf ("%.2f", (($fontsize * 1.2) / 100)) ;
+ if ($lineheight < $fontsize/100 + 0.02)
+ { $lineheight = $fontsize/100 + 0.02 ; }
+ }
+ }
+
+ if ($textcolor eq "")
+ { $textcolor = "black" ; }
+
+ if ($pos eq "")
+ {
+ $pos = @TextDefs {"pos"} ;
+ ($posx,$posy) = split (",", $pos) ;
+ $posy -= $lineheight ;
+ if ($posy < 0)
+ { $posy = 0 ; }
+ $pos = "$posx,$posy" ;
+ @TextDefs {"pos"} = $pos ;
+ }
+
+# if ($link ne "")
+# { ($text, $link, $hint) = &ProcessWikiLink ($text, $link, $hint) ; }
+
+ if ($text eq "") # upd defaults
+ {
+ if ($pos ne "") { @TextDefs {"pos"} = $pos ; }
+ if ($tabs ne "") { @TextDefs {"tabs"} = $tabs ; }
+ if ($fontsize ne "") { @TextDefs {"fontsize"} = $fontsize ; }
+ if ($textcolor ne "") { @TextDefs {"textcolor"} = $textcolor ; }
+ if ($lineheight ne "") { @TextDefs {"lineheight"} = $lineheight ; }
+ &GetData ; next TextData ;
+ }
+
+ if ($link ne "")
+ {
+ if ($text =~ /\[.*\]/)
+ {
+ &Warning ("TextData contains implicit link(s) in attribute 'text' and explicit attribute 'link'.\n" .
+ "Implicit link(s) ignored.") ;
+ $text =~ s/\[+ (?:[^\|]* \|)? ([^\]]*) \]+/$1/gx ;
+ }
+
+ if ($hint eq "")
+ { $hint = &ExternalLinkToHint ($link) ; }
+ }
+
+ if ($text =~ /\[ [^\]]* \^ [^\]]* \]/x)
+ {
+ &Warning ("TextData attribute 'text' contains tab character (^) inside implicit link ([[..]]). Tab ignored.") ;
+ $text =~ s/(\[+ [^\]]* \^ [^\]]* \]+)/($a = $1), ($a =~ s+\^+ +g), $a/gxe ;
+ }
+
+ if (defined ($tabs) && ($tabs ne ""))
+ {
+ $tabs =~ s/^\s*$hBrO (.*) $hBrC\s*$/$1/x ;
+ @Tabs = split (",", $tabs) ;
+ foreach $tab (@Tabs)
+ {
+ $tab =~ s/\s* (.*) \s*$/$1/x ;
+ if (! ($tab =~ /\d+\-(?:center|left|right)$/))
+ { &Error ("Specify attribute 'tabs' as 'n-a,n-a,n-a,.. where n = numeric value, a = left|right|center.") ;
+ while ((! $InputParsed) && (! $NoData)) { &GetData ; } return ; }
+ }
+
+ @Text = split ('\^', $text) ;
+ if ($#Text > $#Tabs + 1)
+ { &Error ("TextData invalid. " . $#Text . " tab characters ('^') in text, only " . ($#Tabs+1) . " tab(s) defined.") ;
+ &GetData ; next TextData ; }
+ }
+
+ &WriteText ("^", "", 0, $posx, $posy, $text, $textcolor, $fontsize, "left", $link, $hint, $tabs) ;
+
+ &GetData ;
+ }
+}
+
+sub ParseTimeAxis
+{
+ if (! &ValidAttributes ("TimeAxis")) { return ; }
+
+ &CheckPreset ("TimeAxis") ;
+
+ foreach $attribute (keys %Attributes)
+ {
+ my $attrvalue = @Attributes {$attribute} ;
+
+
+ if ($attribute =~ /Format/i)
+ {
+ if ($attrvalue =~ /^yy$/i)
+ { &Error ("TimeAxis attribute '$attribute' valid but not available, waiting for bug fix.\n" .
+ "Please specify 'format:yyyy' instead of 'format:yy'.") ; return ; }
+
+ if ($DateFormat eq "yyyy")
+ {
+ if (! ($attrvalue =~ /^(?:yy|yyyy)$/i))
+ { &Error ("TimeAxis attribute '$attribute' invalid.\n" .
+ "DateFormat 'yyyy' implies 'format:yy' or 'format:yyyy'.") ; return ; }
+ }
+ }
+
+ elsif ($attribute =~ /Order/i)
+ {
+ if ($attrvalue !~ /^(?:normal|reverse)$/i)
+ { &Error ("TimeAxis attribute '$attribute' invalid.\n" .
+ " Specify 'order:normal' (default) or 'order:reverse'\n" .
+ " normal =\n" .
+ " vertical axis: highest date on top,\n" .
+ " horizontal axis: highest date at right side\n" ) ; return ; }
+
+ if (($attrvalue =~ /reverse/i) && ($DateFormat ne "yyyy"))
+ { &Error ("TimeAxis attribute '$attribute' invalid.\n" .
+ " 'order:reverse' is only possible with DateFormat=yyyy (sorry)\n") ; return ; }
+
+ @Attributes {"order"} = lc ($attrvalue) ;
+ }
+
+ elsif ($attribute =~ /Orientation/i)
+ {
+ if ($attrvalue =~ /^hor(?:izontal)?$/i)
+ { @Attributes {"time"} = "x" ; }
+ elsif ($attrvalue =~ /^ver(?:tical)?$/i)
+ { @Attributes {"time"} = "y" ; }
+ else
+ { &Error ("TimeAxis attribute '$attribute' invalid.\n" .
+ "Specify hor[izontal] or ver[tical]") ; return ; }
+ delete (@Attributes {"orientation"}) ;
+ }
+ }
+
+ if (! defined (@Attributes {"format"}))
+ { @Attributes {"format"} = "yyyy" ; }
+
+ %Axis = %Attributes ;
+}
+
+sub ParseUnknownCommand
+{
+ $name = $Command ;
+ $name =~ s/[^a-zA-Z].*$// ;
+ &Error ("Command '$name' unknown.") ;
+}
+
+sub RemoveSpaces
+{
+ my $text = shift ;
+ $text =~ s/\s//g ;
+ return ($text) ;
+}
+
+sub DetectMissingCommands
+{
+ if (! defined (%Image)) { &Error2 ("Command ImageSize missing or invalid") ; }
+ if (! defined (%PlotArea)) { &Error2 ("Command PlotArea missing or invalid") ; }
+ if (! defined ($DateFormat)) { &Error2 ("Command DateFormat missing or invalid") ; }
+ if (! defined (@Axis {"time"})) { &Error2 ("Command TimeAxis missing or invalid") ; }
+
+ if ((@Image {"width"} =~ /auto/i) && (@Axis {"time"} =~ /x/i))
+ { &Error2 ("ImageSize value 'width:auto' only allowed with TimeAxis value 'orientation:vertical'") ; }
+ if ((@Image {"height"} =~ /auto/i) && (@Axis {"time"} =~ /y/i))
+ { &Error2 ("ImageSize value 'height:auto' only allowed with TimeAxis value 'orientation:horizontal'") ; }
+}
+
+sub Normalize
+{
+ my $number = shift ;
+ my $reference = shift ;
+ my ($val, $dim) ;
+
+ if (($number eq "") || ($number =~ /auto/i))
+ { return ($number) ; }
+
+ $val = $number ; $val =~ s/[^\d\.\-].*$//g ;
+ $dim = $number ; $dim =~ s/\d//g ;
+ if ($dim =~ /in/i) { $number = $val ; }
+ elsif ($dim =~ /cm/i) { $number = $val / 2.54 ; }
+ elsif ($dim =~ /%/) { $number = $reference * $val / 100 ; }
+ else { $number = $val / 100 ; }
+ return (sprintf ("%.3f", $number)) ;
+}
+
+sub ValidateAndNormalizeDimensions
+{
+ my ($val, $dim) ;
+
+ if (@Image {"width"} =~ /auto/i)
+ {
+ foreach $attribute ("width","left","right")
+ { if (@PlotArea {$attribute} =~ /\%/)
+ { &Error2 ("You specified 'ImageSize = width:auto'.\n" .
+ " This implies absolute values in PlotArea attributes 'left', 'right' and/or 'width' (no \%).\n") ; return ; }
+ }
+
+ if ((@PlotArea {"width"} ne "") || (@PlotArea {"left"} eq "") || (@PlotArea {"right"} eq ""))
+ { &Error2 ("You specified 'ImageSize = width:auto'.\n" .
+ " This implies 'PlotArea = width:auto'.\n" .
+ " Instead of 'width' specify plot margins with PlotArea attributes 'left' and 'right'.\n") ; return ; }
+ }
+
+
+ if (@Image {"height"} =~ /auto/i)
+ {
+ foreach $attribute ("height","top","bottom")
+ { if (@PlotArea {$attribute} =~ /\%/)
+ { &Error2 ("You specified 'ImageSize = height:auto'.\n" .
+ " This implies absolute values in PlotArea attributes 'top', 'bottom' and/or 'height' (no \%).\n") ; return ; }
+ }
+
+ if ((@PlotArea {"height"} ne "") || (@PlotArea {"top"} eq "") || (@PlotArea {"bottom"} eq ""))
+ { &Error2 ("You specified 'ImageSize = height:auto'.\n" .
+ " This implies 'PlotArea = height:auto'.\n" .
+ " Instead of 'height' specify plot margins with PlotArea attributes 'top' and 'bottom'.\n") ; return ; }
+ }
+
+ @Image {"width"} = &Normalize (@Image {"width"}) ;
+ @Image {"height"} = &Normalize (@Image {"height"}) ;
+ @Image {"barinc"} = &Normalize (@Image {"barinc"}) ;
+ @PlotArea {"width"} = &Normalize (@PlotArea {"width"}, @Image {"width"}) ;
+ @PlotArea {"height"} = &Normalize (@PlotArea {"height"}, @Image {"height"}) ;
+ @PlotArea {"left"} = &Normalize (@PlotArea {"left"}, @Image {"width"}) ;
+ @PlotArea {"right"} = &Normalize (@PlotArea {"right"}, @Image {"width"}) ;
+ @PlotArea {"bottom"} = &Normalize (@PlotArea {"bottom"}, @Image {"height"}) ;
+ @PlotArea {"top"} = &Normalize (@PlotArea {"top"}, @Image {"height"}) ;
+
+ if (@Image {"width"} =~ /auto/i)
+ {
+ @PlotArea {"width"} = $#Bars * @Image {"barinc"} ;
+ @Image {"width"} = @PlotArea {"left"} + @PlotArea {"width"} + @PlotArea {"right"} ;
+ }
+
+ elsif (@Image {"height"} =~ /auto/i)
+ {
+ @PlotArea {"height"} = $#Bars * @Image {"barinc"} ;
+ @Image {"height"} = @PlotArea {"top"} + @PlotArea {"height"} + @PlotArea {"bottom"} ;
+ }
+
+ if (@PlotArea {"right"} ne "")
+ { @PlotArea {"width"} = @Image {"width"} - @PlotArea {"left"} - @PlotArea {"right"} ; }
+
+ if (@PlotArea {"top"} ne "")
+ { @PlotArea {"height"} = @Image {"height"} - @PlotArea {"top"} - @PlotArea {"bottom"} ; }
+
+ if ((@Image {"width"} > 16) || (@Image {"height"} > 20))
+ {
+ if (! $bypass)
+ { &Error2 ("Maximum image size is 1600x2000 pixels = 16x20 inch\n" .
+ " Run with option -b (bypass checks) when this is correct.\n") ; return ; }
+ }
+
+ if ((@Image {"width"} < 0.25) || (@Image {"height"} < 0.25))
+ {
+ &Error2 ("Minimum image size is 25x25 pixels = 0.25x0.25 inch\n") ;
+ return ;
+ }
+
+ if (@PlotArea {"width"} > @Image {"width"})
+ { &Error2 ("Plot width larger than image width. Please adjust.\n") ; return ; }
+
+ if (@PlotArea {"width"} < 0.2)
+ { &Error2 ("Plot width less than 20 pixels = 0.2 inch. Please adjust.\n") ; return ; }
+
+ if (@PlotArea {"height"} > @Image {"height"})
+ { &Error2 ("Plot height larger than image height. Please adjust.\n") ; return ; }
+
+ if (@PlotArea {"height"} < 0.2)
+ { &Error2 ("Plot height less than 20 pixels = 0.2 inch. Please adjust.\n") ; return ; }
+
+ if (@PlotArea {"left"} + @PlotArea {"width"} > @Image {"width"})
+ { &Error2 ("Plot width + margins larger than image width. Please adjust.\n") ; return ; }
+# @PlotArea {"left"} = @Image {"width"} - @PlotArea {"width"} ; }
+
+ if (@PlotArea {"left"} < 0)
+ { @PlotArea {"left"} = 0 ; }
+
+ if (@PlotArea {"bottom"} + @PlotArea {"height"} > @Image {"height"})
+ { &Error2 ("Plot height + margins larger than image height. Please adjust.\n") ; return ; }
+# @PlotArea {"bottom"} = @Image {"height"} - @PlotArea {"height"} ; }
+
+ if (@PlotArea {"bottom"} < 0)
+ { @PlotArea {"bottom"} = 0 ; }
+
+ if ((defined (@Scales {"Major"})) ||
+ (defined (@Scales {"Minor"})))
+ {
+ if (defined (@Scales {"Major"}))
+ { $margin = 0.2 ; }
+ else
+ { $margin = 0.05 ; }
+
+ if (@Axis {"time"} eq "x")
+ {
+ if (@PlotArea {"bottom"} < $margin)
+ { &Error2 ("Not enough space below plot area for plotting time axis\n" .
+ " Specify 'PlotArea = bottom:x', where x is at least " . (100 * $margin) . " pixels = $margin inch\n") ; return ; }
+ }
+ else
+ {
+ if (@PlotArea {"left"} < $margin)
+ { &Error2 ("Not enough space outside plot area for plotting time axis\n" .
+ " Specify 'PlotArea = left:x', where x is at least " . (100 * $margin) . " pixels = $margin inch\n") ; return ; }
+ }
+ }
+
+ if (defined (@Legend {"orientation"}))
+ {
+ if (defined (@Legend {"left"}))
+ { @Legend {"left"} = &Normalize (@Legend {"left"}, @Image {"width"}) ; }
+ if (defined (@Legend {"top"}))
+ { @Legend {"top"} = &Normalize (@Legend {"top"}, @Image {"height"}) ; }
+ if (defined (@Legend {"columnwidth"}))
+ { @Legend {"columnwidth"} = &Normalize (@Legend {"columnwidth"}, @Image {"width"}) ; }
+
+ if (! defined (@Legend {"columns"}))
+ {
+ @Legend {"columns"} = 1 ;
+ if ((@Legend {"orientation"} =~ /ver/i) &&
+ (@Legend {"position"} =~ /^(?:top|bottom)$/i))
+ {
+ if ($#LegendData > 10)
+ {
+ @Legend {"columns"} = 3 ;
+ &Info2 ("Legend attribute 'columns' not defined. 3 columns assumed.") ;
+ }
+ elsif ($#LegendData > 5)
+ {
+ @Legend {"columns"} = 2 ;
+ &Info2 ("Legend attribute 'columns' not defined. 2 columns assumed.") ;
+ }
+ }
+ }
+
+ if (@Legend {"position"} =~ /top/i)
+ {
+ if (! defined (@Legend {"left"}))
+ { @Legend {"left"} = @PlotArea {"left"} ; }
+ if (! defined (@Legend {"top"}))
+ { @Legend {"top"} = (@Image {"height"} - 0.2) ; }
+ if ((! defined (@Legend {"columnwidth"})) && (@Legend {"columns"} > 1))
+ { @Legend {"columnwidth"} = sprintf ("%02f", ((@PlotArea {"left"} + @PlotArea {"width"} - 0.2) / @Legend {"columns"})) ; }
+ }
+ elsif (@Legend {"position"} =~ /bottom/i)
+ {
+ if (! defined (@Legend {"left"}))
+ { @Legend {"left"} = @PlotArea {"left"} ; }
+ if (! defined (@Legend {"top"}))
+ { @Legend {"top"} = (@PlotArea {"bottom"} - 0.4) ; }
+ if ((! defined (@Legend {"columnwidth"})) && (@Legend {"columns"} > 1))
+ { @Legend {"columnwidth"} = sprintf ("%02f", ((@PlotArea {"left"} + @PlotArea {"width"} - 0.2) / @Legend {"columns"})) ; }
+ }
+ elsif (@Legend {"position"} =~ /right/i)
+ {
+ if (! defined (@Legend {"left"}))
+ { @Legend {"left"} = (@PlotArea {"left"} + @PlotArea {"width"} + 0.2) ; }
+ if (! defined (@Legend {"top"}))
+ { @Legend {"top"} = (@PlotArea {"bottom"} + @PlotArea {"height"} - 0.2) ; }
+ }
+ }
+
+ if (! defined (@Axis {"order"}))
+ { @Axis {"order"} = "normal" ; }
+}
+
+sub WriteProcAnnotate
+{
+ my $bar = shift ;
+ my $shiftx = shift ;
+ my $xpos = shift ;
+ my $ypos = shift ;
+ my $text = shift ;
+ my $textcolor = shift ;
+ my $fontsize = shift ;
+ my $align = shift ;
+ my $link = shift ;
+ my $hint = shift ;
+
+ if (length ($text) > 250)
+ { &Error ("Text segments can be up to 250 characters long. This segment is " . length ($text) . " chars.\n" .
+ " You can either shorten the text or\n" .
+ " - PlotData: insert line breaks (~)\n" .
+ " - TextData: insert tabs (~) to produce columns\n") ; return ; }
+
+ if ($textcolor eq "")
+ { $textcolor = "black" ; }
+
+ my $textdetails = " textdetails: align=$align size=$fontsize color=$textcolor" ;
+
+ push @PlotTextsPng, "#proc annotate\n" ;
+ push @PlotTextsSvg, "#proc annotate\n" ;
+
+ push @PlotTextsPng, " location: $xpos $ypos\n" ;
+ push @PlotTextsSvg, " location: $xpos $ypos\n" ;
+
+ push @PlotTextsPng, $textdetails . "\n" ;
+ push @PlotTextsSvg, $textdetails . "\n" ;
+
+ $text2 = $text ;
+ $text2 =~ s/\[\[//g ;
+ $text2 =~ s/\]\]//g ;
+ if ($text2 =~ /^\s/)
+ { push @PlotTextsPng, " text: \n\\$text2\n\n" ; }
+ else
+ { push @PlotTextsPng, " text: $text2\n\n" ; }
+
+ $text2 = $text ;
+ if ($link ne "")
+ {
+ # put placeholder in Ploticus input file
+ # will be replaced by real link after SVG generation
+ # this allows adding color info
+ push @linksSVG, &DecodeInput ($link) ;
+ my $lcnt = $#linksSVG ;
+ $text2 =~ s/\[\[ ([^\]]+) \]\]/\[$lcnt\[$1\]$lcnt\]/x ;
+ $text2 =~ s/\[\[ ([^\]]+) $/\[$lcnt\[$1\]$lcnt\]/x ;
+ $text2 =~ s/^ ([^\[]+) \]\]/\[$lcnt\[$1\]$lcnt\]/x ;
+ }
+
+ $text3 = &EncodeHtml ($text2) ;
+ if ($text2 ne $text3)
+ {
+ # put placeholder in Ploticus input file
+ # will be replaced by real text after SVG generation
+ # Ploticus would autoscale image improperly when text contains &#xxx; tags
+ # because this would count as 5 chars
+ push @textsSVG, &DecodeInput ($text3) ;
+ $text3 = "{{" . $#textsSVG . "}}" ;
+ while (length ($text3) < length ($text2)) { $text3 .= "x" ; }
+ }
+
+ if ($text3 =~ /^\s/)
+ { push @PlotTextsSvg, " text: \n\\$text3\n\n" ; }
+ else
+ { push @PlotTextsSvg, " text: $text3\n\n" ; }
+
+ if ($link ne "")
+ {
+ $MapPNG = $true ;
+
+ push @PlotTextsPng, "#proc annotate\n" ;
+ push @PlotTextsPng, " location: $xpos $ypos\n" ;
+
+# push @PlotTextsPng, " boxmargin: 0.01\n" ;
+
+ if ($align ne "right")
+ {
+ push @PlotTextsPng, " clickmapurl: $link\n" ;
+ if ($hint ne "")
+ { push @PlotTextsPng, " clickmaplabel: $hint\n" ; }
+ }
+ else
+ {
+ if ($bar eq "")
+ {
+ if ($WarnOnRightAlignedText ++ == 0)
+ { &Warning2 ("Links on right aligned texts are only supported for svg output,\npending Ploticus bug fix.") ; }
+ return ;
+ }
+ else
+ {
+ push @PlotTextsPng, " clickmapurl: $link\&\&$shiftx\n" ;
+ if ($hint ne "")
+ { push @PlotTextsPng, " clickmaplabel: $hint\n" ; }
+ }
+ }
+
+ $textdetails =~ s/color=[^\s]+/color=$LinkColor/ ;
+ push @PlotTextsPng, $textdetails . "\n" ;
+
+ $text = &DecodeInput ($text) ;
+ if ($text =~ /^[^\[]+\]\]/)
+ { $text = "[[" . $text ; }
+ if ($text =~ /\[\[[^\]]+$/)
+ { $text .= "]]" ; }
+ my $pos1 = index ($text, "[[") ;
+ my $pos2 = index ($text, "]]") + 1 ;
+ if (($pos1 > -1) && ($pos2 > -1))
+ {
+ for (my $i = 0 ; $i < length ($text) ; $i++)
+ {
+ $c = substr ($text, $i, 1) ;
+ if ($c ne "\n")
+ {
+ if (($i < $pos1) || ($i > $pos2))
+ { substr ($text, $i, 1) = " " ; }
+ }
+ }
+ }
+
+ $text =~ s/\[\[(.*?)\]\]/$1/s ;
+
+ if ($text =~ /^\s/)
+ { push @PlotTextsPng, " text: \n\\$text\n\n" ; }
+ else
+ { push @PlotTextsPng, " text: $text\n\n" ; }
+
+# push @PlotTextsPng, "#proc rect\n" ;
+# push @PlotTextsPng, " color: green\n" ;
+# push @PlotTextsPng, " rectangle: 1(s)+0.25 1937.500(s)+0.06 1(s)+0.50 1937.500(s)+0.058\n" ;
+# push @PlotTextsPng, "\n\n" ;
+ }
+}
+
+sub WriteText
+{
+ my $mode = shift ;
+ my $bar = shift ;
+ my $shiftx = shift ;
+ my $posx = shift ;
+ my $posy = shift ;
+ my $text = shift ;
+ my $textcolor = shift ;
+ my $fontsize = shift ;
+ my $align = shift ;
+ my $link = shift ;
+ my $hint = shift ;
+ my $tabs = shift ;
+ my ($link2, $hint2, $tab) ;
+ my $outside = $false ;
+ if (@Axis {"order"} =~ /reverse/i)
+ {
+ if (@Axis {"time"} eq "y")
+ { $posy =~ s/(.*)(\(s\))/(-$1).$2/xe ; }
+ else
+ { $posx =~ s/(.*)(\(s\))/(-$1).$2/xe ; }
+ }
+
+ if ($posx !~ /\(s\)/)
+ {
+ if ($posx < 0)
+ { $outside = $true ; }
+ if (@Image {"width"} !~ /auto/i)
+ {
+ if ($posx > @Image {"width"}/100)
+ { $outside = $true ; }
+ }
+ }
+ if ($posy !~ /\(s\)/)
+ {
+ if ($posy < 0)
+ { $outside = $true ; }
+ if (@Image {"height"} !~ /auto/i)
+ {
+ if ($posy > @Image {"height"}/100)
+ { $outside = $true ; }
+ }
+ }
+ if ($outside)
+ {
+ if ($WarnTextOutsideArea++ < 5)
+ { $text =~ s/\n/~/g ;
+ &Error ("Text segment '$text' falls outside image area. Text ignored.") ; }
+ return ;
+ }
+
+ my @Tabs = split (",", $tabs) ;
+ foreach $tab (@Tabs)
+ { $tab =~ s/\s* (.*) \s*$/$1/x ; }
+
+ $posx0 = $posx ;
+ my @Text ;
+ my $dy = 0 ;
+
+ if ($text =~ /\[\[.*\]\]/)
+ {
+ $link = "" ; $hint = "" ;
+ }
+
+ my @Text ;
+ if ($mode eq "^")
+ { @Text = split ('\^', $text) ; }
+ elsif ($mode eq "~")
+ {
+ @Text = split ('\n', $text) ;
+
+ if ($fontsize =~ /^(?:XS|S|M|L|XL)$/i)
+ {
+ if ($fontsize =~ /XS/i) { $dy = 0.09 ; }
+ elsif ($fontsize =~ /S/i) { $dy = 0.11 ; }
+ elsif ($fontsize =~ /M/i) { $dy = 0.135 ; }
+ elsif ($fontsize =~ /XL/i) { $dy = 0.21 ; }
+ else { $dy = 0.16 ; }
+ }
+ else
+ {
+ $dy = sprintf ("%.2f", (($fontsize * 1.2) / 100)) ;
+ if ($dy < $fontsize/100 + 0.02)
+ { $dy = $fontsize/100 + 0.02 ; }
+ }
+ }
+ else
+ { push @Text, $text ; }
+
+
+ foreach $text (@Text)
+ {
+ if ($text !~ /^[\n\s]*$/)
+ {
+ $link2 = "" ;
+ $hint2 = "" ;
+ ($text, $link2, $hint2) = &ProcessWikiLink ($text, $link2, $hint2) ;
+
+ if ($link2 eq "")
+ {
+ $link2 = $link ;
+ if (($link ne "") && ($text !~ /\[\[.*\]\]/))
+ { $text = "[[" . $text . "]]" ;}
+ }
+ if ($hint2 eq "")
+ { $hint2 = $hint ; }
+
+ &WriteProcAnnotate ($bar, $shiftx, $posx, $posy, $text, $textcolor, $fontsize, $align, $link2, $hint2) ;
+ }
+
+ if ($#Tabs >= 0)
+ {
+ $tab = shift (@Tabs) ;
+ ($dx,$align) = split ("\-", $tab) ;
+ $posx = $posx0 + &Normalize ($dx) ;
+ }
+ if ($posy =~ /\+/)
+ { ($posy1, $posy2) = split ('\+', $posy) ; }
+ elsif ($posy =~ /.+\-/)
+ {
+ if ($posy =~ /^\-/)
+ {
+ ($sign, $posy1, $posy2) = split ('\-', $posy) ; $posy2 = -$posy2 ;
+ $posy1 = "-" . $posy1 ;
+ }
+ else
+ { ($posy1, $posy2) = split ('\-', $posy) ; $posy2 = -$posy2 ; }
+ }
+ else
+ { $posy1 = $posy ; $posy2 = 0 ; }
+
+ $posy2 -= $dy ;
+
+ if ($posy2 == 0)
+ { $posy = $posy1 ; }
+ elsif ($posy2 < 0)
+ { $posy = $posy1 . "$posy2" ; }
+ else
+ { $posy = $posy1 . "+" . $posy2 ; }
+ }
+}
+
+sub WriteProcDrawCommandsOld
+{
+ my $posx = shift ;
+ my $posy = shift ;
+ my $text = shift ;
+ my $textcolor = shift ;
+ my $fontsize = shift ;
+ my $link = shift ;
+ my $hint = shift ;
+
+ $posx0 = $posx ;
+ my @Text = split ('\^', $text) ;
+ my $align = "text" ;
+ foreach $text (@Text)
+ {
+ push @TextData, " mov $posx $posy\n" ;
+ push @TextData, " textsize $fontsize\n" ;
+ push @TextData, " color $textcolor\n" ;
+ push @TextData, " $align $text\n" ;
+
+
+ $tab = shift (@Tabs) ;
+ ($dx,$align) = split ("\-", $tab) ;
+ $posx = $posx0 + &Normalize ($dx) ;
+ if ($align =~ /left/i) { $align = "text" ; }
+ elsif ($align =~ /right/i) { $align = "rightjust" ; }
+ else { $align = "centext" ; }
+ }
+}
+
+sub WritePlotFile
+{
+ &WriteTexts ;
+
+ $script = "" ;
+ my ($color) ;
+ if (@Axis {"time"} eq "x")
+ { $AxisBars = "y" ; }
+ else
+ { $AxisBars = "x" ; }
+
+# if ((@Axis {"time"} eq "y") && ($#Bars > 0))
+# {
+# undef @BarsTmp ;
+# while ($#Bars >= 0)
+# { push @BarsTmp, pop @Bars ; }
+# @Bars = @BarsTmp ;
+# }
+
+ if ($tmpdir ne "")
+ { $file_script = $tmpdir.$pathseparator."EasyTimeline.txt.$$" ; }
+ else
+ { $file_script = "EasyTimeline.txt" ; }
+
+ print "Ploticus input file = ".$file_script."\n";
+
+ # $fmt = "gif" ;
+ open "FILE_OUT", ">", $file_script ;
+
+ #proc settings
+# $script .= "#proc settings\n" ;
+# $script .= " xml_encoding: utf-8\n" ;
+# $script .= "\n" ;
+
+ # proc page
+ $script .= "#proc page\n" ;
+ $script .= " dopagebox: no\n" ;
+ $script .= " pagesize: ". @Image {"width"} . " ". @Image {"height"} . "\n" ;
+ if (defined (@BackgroundColors {"canvas"}))
+ { $script .= " backgroundcolor: " . @BackgroundColors {"canvas"} . "\n" ; }
+ $script .= "\n" ;
+
+ $barcnt = $#Bars + 1 ;
+
+# if ($AlignBars eq "justify") && ($#Bars > 0)
+#
+# given P = plotwidth in pixels
+# given B = half bar width in pixels
+# get U = plotwidth in units
+# get x = half bar width in units
+#
+# first bar plotted at unit 1
+# last bar plotted at unit c
+# let C = c - 1 (units between centers of lowest and highest bar) -> x = (U-C) / 2
+#
+# Justify: calculate range for axis in units:
+# axis starts at 1-x and ends at c+x =
+# x/B = U/P -> x = BU/P (1)
+# U = c+x - (1-x) = (c-1) + 2x -> x = (U-(c-1))/2 (2)
+#
+# (1) & (2) -> BU/P = (U-(c-1))/2
+# -> 2BU/P = U-(c-1)
+# -> 2BU/P = U - C
+# -> 2BU = PU - PC
+# -> U (2B-P) = -PC
+# -> U = -PC/(2B-P)
+# P = @PlotArea {$extent}
+# C = c - 1 = $#Bars
+# 2B = $MaxBarWidth
+ if (! defined ($AlignBars))
+ {
+ &Info2 ("AlignBars not defined. Alignment 'early' assumed.") ;
+ $AlignBars = "early" ;
+ }
+
+ if (@Axis {"time"} eq "x")
+ { $extent = "height" ; }
+ else
+ { $extent = "width" ; }
+
+ if ($MaxBarWidth > @PlotArea {$extent})
+ { &Error2 ("Maximum bar width exceeds plotarea " . $extent . ".") ; return ; }
+
+ if ($MaxBarWidth == @PlotArea {$extent})
+ { @PlotArea {$extent} += 0.01 ; }
+
+ if ($MaxBarWidth == @PlotArea {$extent})
+ {
+ $till = 1 ;
+ $from = 1 ;
+ }
+ else
+ {
+ if ($AlignBars eq "justify")
+ {
+ if ($#Bars > 0)
+ {
+ $U = - (@PlotArea {$extent} * $#Bars) / ($MaxBarWidth - @PlotArea {$extent}) ;
+ $x = ($U - $#Bars) / 2 ;
+ $from = 1 - $x ;
+ $till = 1 + $#Bars + $x ;
+ }
+ else # one bar-> "justify" is misnomer here, treat as "center"
+ {
+ # $x = ($MaxBarWidth /2) / @PlotArea {$extent} ;
+ # $from = 0.5 - $x ;
+ # $till = $from + 1 ;
+ $from = 0.5 ;
+ $till = 1.5 ;
+ }
+ }
+ elsif ($AlignBars eq "early")
+ {
+ $U = $#Bars + 1 ;
+ if ($U == 0)
+ { $U = 1 ; }
+ $x = (($MaxBarWidth /2) * $U) / @PlotArea {$extent} ;
+ $from = 1 - $x ;
+ $till = $from + $U ;
+ }
+ elsif ($AlignBars eq "late")
+ {
+ $U = $#Bars + 1 ;
+ $x = (($MaxBarWidth /2) * $U) / @PlotArea {$extent} ;
+ $till = $U + $x ;
+ $from = $till - $U ;
+ }
+ }
+
+# if ($#Bars == 0)
+# {
+# $from = 1 - $MaxBarWidth ;
+# $till = 1 + $MaxBarWidth ;
+# }
+ if ($from eq $till)
+ { $till = $from + 1 ; }
+
+ #proc areadef
+ $script .= "#proc areadef\n" ;
+ $script .= " rectangle: " . @PlotArea {"left"} . " " . @PlotArea {"bottom"} . " " .
+ sprintf ("%.2f", @PlotArea {"left"} + @PlotArea {"width"}). " " . sprintf ("%.2f", @PlotArea {"bottom"} + @PlotArea {"height"}) . "\n" ;
+ if (($DateFormat eq "yyyy") || ($DateFormat eq "x.y"))
+ { $script .= " " . @Axis {"time"} . "scaletype: linear\n" ; } # date yyyy
+ else
+ { $script .= " " . @Axis {"time"} . "scaletype: date $DateFormat\n" ; }
+
+ if (@Axis {"order"} !~ /reverse/i)
+ { $script .= " " . @Axis {"time"} . "range: " . @Period{"from"} . " " . @Period{"till"} . "\n" ; }
+ else
+ { $script .= " " . @Axis {"time"} . "range: " . (-@Period{"till"}) . " " . (-@Period{"from"}) . "\n" ; }
+
+ $script .= " " . $AxisBars . "scaletype: linear\n" ;
+ $script .= " " . $AxisBars . "range: " . sprintf ("%.3f", $from-0.001) . " " . sprintf ("%.3f", $till) . "\n" ;
+ $script .= " #saveas: A\n" ;
+ $script .= "\n" ;
+
+ #proc rect (test)
+# $script .= "#proc rect\n" ;
+# $script .= " rectangle 1.0 1.0 1.4 1.4\n" ;
+# $script .= " color gray(0.95)\n" ;
+# $script .= " clickmaplabel: Vladimir Ilyich Lenin\n" ;
+# $script .= " clickmapurl: http://www.wikipedia.org/wiki/Vladimir_Lenin\n" ;
+
+
+ #proc legendentry
+ foreach $color (sort keys %Colors)
+ {
+ $script .= "#proc legendentry\n" ;
+ $script .= " sampletype: color\n" ;
+
+ if ((defined (@ColorLabels {$color})) && (@ColorLabels {$color} ne ""))
+ { $script .= " label: " . @ColorLabels {$color} . "\n" ; }
+ $script .= " details: " . @Colors {$color} . "\n" ;
+ $script .= " tag: $color\n" ;
+ $script .= "\n" ;
+ }
+
+ if (defined (@BackgroundColors {"bars"}))
+ {
+ #proc getdata / #proc bars
+ $script .= "#proc getdata\n" ;
+ $script .= " delim: comma\n" ;
+ $script .= " data:\n" ;
+
+ $maxwidth = 0 ;
+ foreach $entry (@PlotBars)
+ {
+ ($width) = split (",", $entry) ;
+ if ($width > $maxwidth)
+ { $maxwidth = $width ; }
+ }
+
+ for ($b = 0 ; $b <= $#Bars ; $b++)
+ { $script .= ($b+1) . "," . @Period {"from"} . "," . @Period {"till"} . ",".
+ @BackgroundColors {"bars"} . "\n" ; }
+ $script .= "\n" ;
+
+ #proc bars
+ $script .= "#proc bars\n" ;
+ $script .= " axis: " . @Axis {"time"} . "\n" ;
+ $script .= " barwidth: $maxwidth\n" ;
+ $script .= " outline: no\n" ;
+ if (@Axis {"time"} eq "x")
+ { $script .= " horizontalbars: yes\n" ; }
+ $script .= " locfield: 1\n" ;
+ $script .= " segmentfields: 2 3\n" ;
+ $script .= " colorfield: 4\n" ;
+
+# $script .= " clickmaplabel: Vladimir Ilyich Lenin\n" ;
+# $script .= " clickmapurl: http://www.wikipedia.org/wiki/Vladimir_Lenin\n" ;
+
+ $script .= "\n" ;
+ }
+
+ #proc axis
+ if (defined (@Scales {"Minor grid"}))
+ { &PlotScale ("Minor", $true) ; }
+ if (defined (@Scales {"Major grid"}))
+ { &PlotScale ("Major", $true) ; }
+
+ &PlotLines ("back") ;
+
+ @PlotBarsNow = @PlotBars ;
+ &PlotBars ;
+
+ $script .= "\n([inc3])\n\n" ; # will be replace by rects
+
+%x = %BarWidths ;
+ foreach $entry (@PlotLines)
+ {
+ ($bar) = split (",", $entry) ;
+ $bar =~ s/\#.*// ;
+ $width = @BarWidths {$bar} ;
+ $entry = sprintf ("%6.3f",$width) . "," . $entry ;
+ }
+
+ @PlotBarsNow = @PlotLines ;
+ &PlotBars ;
+
+ #proc axis
+ if ($#Bars > 0)
+ {
+ $scriptPng2 = "#proc " . $AxisBars . "axis\n" ;
+ $scriptSvg2 = "#proc " . $AxisBars . "axis\n" ;
+ if ($AxisBars eq "x")
+ {
+ $scriptPng2 .= " stubdetails: adjust=0,0.09\n" ;
+ $scriptSvg2 .= " stubdetails: adjust=0,0.09\n" ;
+ }
+ else
+ {
+ $scriptPng2 .= " stubdetails: adjust=0.09,0\n" ;
+ $scriptSvg2 .= " stubdetails: adjust=0.09,0\n" ;
+ }
+ $scriptPng2 .= " tics: none\n" ;
+ $scriptSvg2 .= " tics: none\n" ;
+ $scriptPng2 .= " stubrange: 1\n" ;
+ $scriptSvg2 .= " stubrange: 1\n" ;
+ if ($AxisBars eq "y")
+ {
+ $scriptPng2 .= " stubslide: -" . sprintf ("%.2f", $MaxBarWidth / 2) . "\n" ;
+ $scriptSvg2 .= " stubslide: -" . sprintf ("%.2f", $MaxBarWidth / 2) . "\n" ;
+ }
+ $scriptPng2 .= " stubs: text\n" ;
+ $scriptSvg2 .= " stubs: text\n" ;
+
+ my ($text, $link, $hint) ;
+
+ undef (@Bars2) ;
+ foreach $bar (@Bars)
+ {
+ if ($AxisBars eq "y")
+ { push @Bars2, $bar ; }
+ else
+ { unshift @Bars2, $bar ; }
+ }
+
+ foreach $bar (@Bars2)
+ {
+ $hint = "" ;
+ $text = @BarLegend {lc ($bar)} ;
+ if ($text =~ /^\s*$/)
+ { $text = "\\" ; }
+
+ $link = @BarLink {lc ($bar)} ;
+ if (! defined ($link))
+ {
+ if ($text =~ /\[.*\]/)
+ { ($text, $link, $hint) = &ProcessWikiLink ($text, $link, $hint) ; }
+ }
+
+ $text =~ s/\[+([^\]]*)\]+/$1/ ;
+ $scriptPng2 .= "$text\n" ;
+ if (defined ($link))
+ {
+ push @linksSVG, $link ;
+ my $lcnt = $#linksSVG ;
+ $scriptSvg2 .= "[" . $lcnt . "[" . $text . "]" . $lcnt . "]\n" ;
+ }
+ else
+ { $scriptSvg2 .= "$text\n" ; }
+ }
+ $scriptPng2 .= "\n" ;
+ $scriptSvg2 .= "\n" ;
+
+ $scriptPng2 .= "#proc " . $AxisBars . "axis\n" ;
+ if ($AxisBars eq "x")
+ { $scriptPng2 .= " stubdetails: adjust=0,0.09 color=$LinkColor\n" ; }
+ else
+ { $scriptPng2 .= " stubdetails: adjust=0.09,0 color=$LinkColor\n" ; }
+ $scriptPng2 .= " tics: none\n" ;
+ $scriptPng2 .= " stubrange: 1\n" ;
+ if ($AxisBars eq "y")
+ { $scriptPng2 .= " stubslide: -" . sprintf ("%.2f", $MaxBarWidth / 2) . "\n" ; }
+ $scriptPng2 .= " stubs: text\n" ;
+
+ $barcnt = $#Bars + 1 ;
+ foreach $bar (@Bars2)
+ {
+ $hint = "" ;
+ $text = @BarLegend {lc ($bar)} ;
+ if ($text =~ /^\s*$/)
+ { $text = "\\" ; }
+
+ $link = @BarLink {lc ($bar)} ;
+ if (! defined ($link))
+ {
+ if ($text =~ /\[.*\]/)
+ { ($text, $link, $hint) = &ProcessWikiLink ($text, $link, $hint) ; }
+ }
+ if ((! defined ($link)) || ($link eq ""))
+ { $text = "\\" ; }
+ else
+ {
+ $scriptPng3 .= "#proc rect\n" ;
+ $scriptPng3 .= " rectangle: 0 $barcnt(s)+0.05 " . @PlotArea {"left"} . " $barcnt(s)-0.05\n" ;
+ $scriptPng3 .= " color: " . @BackgroundColors {"canvas"} . "\n" ;
+ $scriptPng3 .= " clickmapurl: " . $link . "\n" ;
+ if ((defined ($hint)) && ($hint ne ""))
+ { $scriptPng3 .= " clickmaplabel: " . $hint . "\n" ; }
+
+ $text =~ s/\[+([^\]]*)\]+/$1/ ;
+ }
+ $scriptPng2 .= "$text\n" ;
+
+ $barcnt-- ;
+ }
+ $scriptPng2 .= "\n" ;
+ }
+
+ &PlotLines ("front") ;
+
+ $script .= "\n([inc1])\n\n" ; # will be replaced by annotations
+ $script .= "\n([inc2])\n\n" ;
+
+
+ if ($#PlotTextsPng >= 0)
+ {
+ foreach $command (@PlotTextsPng)
+ {
+ if ($command =~ /^\s*location/)
+ { $command =~ s/(.*)\[(.*)\](.*)/$1 . ($#Bars - $2 + 2) . $3/xe ; }
+
+ $scriptPng1 .= $command ;
+ }
+ $scriptPng1 .= "\n" ;
+ }
+
+ if ($#PlotTextsSvg >= 0)
+ {
+ foreach $command (@PlotTextsSvg)
+ {
+ if ($command =~ /^\s*location/)
+ { $command =~ s/(.*)\[(.*)\](.*)/$1 . ($#Bars - $2 + 2) . $3/xe ; }
+
+ $scriptSvg1 .= $command ;
+ }
+ $scriptSvg1 .= "\n" ;
+ }
+
+# $script .= "#proc symbol\n" ;
+# $script .= " location: 01/01/1943(s) Korea \n" ;
+# $script .= " symbol: style=fill shape=downtriangle fillcolor=white radius=0.04\n" ;
+# $script .= "\n" ;
+
+ #proc axis
+ # repeat without grid to get axis on top of bar
+ # needed because axis may overlap bar slightly
+ if (defined (@Scales {"Minor"}))
+ { &PlotScale ("Minor", $false) ; }
+ if (defined (@Scales {"Major"}))
+ { &PlotScale ("Major", $false) ; }
+
+ #proc drawcommands
+ if ($#TextData >= 0)
+ {
+ $script .= "#proc drawcommands\n" ;
+ $script .= " commands:\n" ;
+ foreach $entry (@TextData)
+ { $script .= $entry ; }
+ $script .= "\n" ;
+ }
+
+ #proc legend
+ if (defined (@Legend {"orientation"}))
+ {
+ if (($#LegendData < 0) && ($Preset eq ""))
+ { &Error2 ("Command 'Legend' found, but no entries for the legend were specified.\n" .
+ " Please remove or disable command (disable = put \# before the command)\n" .
+ " or specify entries for the legend with command 'Colors', attribute 'legend'\n") ;
+ return ; }
+
+ $perColumn = 999 ;
+ if (@Legend {"orientation"} =~ /ver/i)
+ {
+ if (@Legend {"columns"} > 1)
+ {
+ $perColumn = 0 ;
+ while ((@Legend {"columns"} * $perColumn) < $#LegendData + 1)
+ { $perColumn ++ ; }
+ }
+ }
+
+ for ($l = 1 ; $l <= @Legend {"columns"} ; $l++)
+ {
+ $script .= "#proc legend\n" ;
+ $script .= " noclear: yes\n" ;
+ if (@Legend {"orientation"} =~ /ver/i)
+ { $script .= " format: multiline\n" ; }
+ else
+ { $script .= " format: singleline\n" ; }
+ $script .= " seglen: 0.2\n" ;
+ $script .= " swatchsize: 0.12\n" ;
+ $script .= " textdetails: size=S\n" ;
+ $script .= " location: " . (@Legend{"left"}+0.2) . " " . @Legend{"top"} . "\n" ;
+ $script .= " specifyorder:\n" ;
+ for ($l2 = 1 ; $l2 <= $perColumn ; $l2++)
+ {
+ $category = shift (@LegendData) ;
+ if (defined ($category))
+ { $script .= "$category\n" ; }
+ }
+ $script .= "\n" ;
+ @Legend {"left"} += @Legend {"columnwidth"} ;
+ }
+ }
+
+ $script .= "#endproc\n" ;
+
+ print "\nGenerating output:\n" ;
+ if ( $plcommand ne "" )
+ { $pl = $plcommand; }
+ else
+ {
+ $pl = "pl.exe" ;
+ if ($env eq "Linux")
+ { $pl = "pl" ; }
+ }
+
+ print "Using ploticus command \"".$pl."\" (".$plcommand.")\n";
+
+ $script_save = $script ;
+
+ $script =~ s/\(\[inc1\]\)/$scriptSvg1/ ;
+ $script =~ s/\(\[inc2\]\)/$scriptSvg2/ ;
+ $script =~ s/\(\[inc3\]\)// ;
+
+ $script =~ s/textsize XS/textsize 7/gi ;
+ $script =~ s/textsize S/textsize 8.9/gi ;
+
+ $script =~ s/textsize M/textsize 10.5/gi ;
+ $script =~ s/textsize L/textsize 13/gi ;
+ $script =~ s/textsize XL/textsize 17/gi ;
+ $script =~ s/size=XS/size=7/gi ;
+ $script =~ s/size=S/size=8.9/gi ;
+ $script =~ s/size=M/size=10.5/gi ;
+ $script =~ s/size=L/size=13/gi ;
+ $script =~ s/size=XL/size=17/gi ;
+
+
+ $script =~ s/(\n location:.*)/&ShiftOnePixelForSVG($1)/ge ;
+
+ open "FILE_OUT", ">", $file_script ;
+ print FILE_OUT &DecodeInput($script) ;
+ close "FILE_OUT" ;
+
+ $map = ($MapSVG) ? "-map" : "";
+
+ print "Running Ploticus to generate svg file\n" ;
+# my $cmd = "$pl $map -" . "svg" . " -o $file_vector $file_script -tightcrop -font \"Times\"" ;
+# my $cmd = "$pl $map -" . "svg" . " -o $file_vector $file_script -tightcrop" ;
+ my $cmd = EscapeShellArg($pl) . " $map -" . "svg" . " -o " .
+ EscapeShellArg($file_vector) . " " . EscapeShellArg($file_script) . " -tightcrop" ;
+ print "$cmd\n";
+ system ($cmd) ;
+
+ $script = $script_save ;
+ $script =~ s/dopagebox: no/dopagebox: yes/ ;
+
+ $script =~ s/\(\[inc1\]\)/$scriptPng1/ ;
+ $script =~ s/\(\[inc2\]\)/$scriptPng2/ ;
+ $script =~ s/\(\[inc3\]\)/$scriptPng3/ ;
+
+ $script =~ s/textsize XS/textsize 6/gi ;
+ $script =~ s/textsize S/textsize 8/gi ;
+ $script =~ s/textsize M/textsize 10/gi ;
+ $script =~ s/textsize L/textsize 14/gi ;
+ $script =~ s/textsize XL/textsize 18/gi ;
+ $script =~ s/size=XS/size=6/gi ;
+ $script =~ s/size=S/size=8/gi ;
+ $script =~ s/size=M/size=10/gi ;
+ $script =~ s/size=L/size=14/gi ;
+ $script =~ s/size=XL/size=18/gi ;
+
+ open "FILE_OUT", ">", $file_script ;
+ print FILE_OUT &DecodeInput($script) ;
+ close "FILE_OUT" ;
+
+ $map = ($MapPNG && $linkmap) ? "-csmap" : "";
+ if ($linkmap && $showmap)
+ { $map .= " -csmapdemo" ; }
+
+# $crop = "-crop 0,0," + @ImageSize {"width"} . "," . @ImageSize {"height"} ;
+ print "Running Ploticus to generate bitmap\n" ;
+# $cmd = "$pl $map -" . $fmt . " -o $file_bitmap $file_script -tightcrop" ; # -v $file_bitmap" ;
+# $cmd = "$pl $map -" . $fmt . " -o $file_bitmap $file_script -tightcrop -diagfile $file_pl_info -errfile $file_pl_err" ;
+ $cmd = EscapeShellArg($pl) . " $map -" . $fmt . " -o " .
+ EscapeShellArg($file_bitmap) . " " . EscapeShellArg($file_script) . " -tightcrop" .
+ " -mapfile " . EscapeShellArg($file_htmlmap) ;
+ print "$cmd\n";
+ system ($cmd) ;
+
+ if ((-e $file_bitmap) && (-s $file_bitmap > 500 * 1024))
+ {
+ &Error2 ("Output image size exceeds 500 K. Image deleted.\n" .
+ "Run with option -b (bypass checks) when this is correct.\n") ;
+ unlink $file_bitmap ;
+ } ;
+
+ # not for Wikipedia, only for offline use:
+ if ((-e $file_bitmap) && ($fmt eq "gif"))
+ {
+ print "Running nconvert to convert gif image to png format\n\n" ;
+ print "---------------------------------------------------------------------------\n" ;
+ $cmd = "nconvert.exe -out png " . EscapeShellArg($file_bitmap) ;
+ system ($cmd) ;
+ print "---------------------------------------------------------------------------\n" ;
+
+ if (! (-e $file_png))
+ { print "PNG file not created (is nconvert.exe missing?)\n\n" ; }
+ }
+
+ if (-e $file_htmlmap) # correct click coordinates of right aligned texts (Ploticus bug)
+ {
+ open "FILE_IN", "<", $file_htmlmap ;
+ @map = <FILE_IN> ;
+ close "FILE_IN" ;
+
+ foreach $line (@map)
+ {
+ chomp $line ;
+ if ($line =~ /\&\&/)
+ {
+ $coords = $line ;
+ $shift = $line ;
+ $coords =~ s/^.*coords\=\"([^\"]*)\".*$/$1/ ;
+ $shift =~ s/^.*\&\&([^\"]*)\".*$/$1/ ;
+ $line =~ s/\&\&[^\"]*// ;
+ (@updcoords) = split (",", $coords) ;
+ $maplength = @updcoords [2] - @updcoords [0] ;
+ @updcoords [0] = @updcoords [0] - 2 * ($maplength-25) ;
+ @updcoords [2] = @updcoords [0] + $maplength ;
+ $coordsnew = join (",", @updcoords) ;
+ $line =~ s/$coords/$coordsnew/ ;
+ push @map2, $line . "\n" ;
+ }
+ else
+ { push @map2, $line . "\n" ; }
+ }
+
+ open "FILE_OUT", ">", $file_htmlmap ;
+ print FILE_OUT @map2 ;
+ close "FILE_OUT" ;
+ }
+
+ if (-e $file_vector)
+ {
+ open "FILE_IN", "<", $file_vector ;
+ @svg = <FILE_IN> ;
+ close "FILE_IN" ;
+
+ foreach $line (@svg)
+ {
+ $line =~ s/\{\{(\d+)\}\}x+/@textsSVG[$1]/gxe ;
+ $line =~ s/\[(\d+)\[ (.*?) \]\d+\]/'<a style="fill:blue;" xlink:href="' . @linksSVG[$1] . '">' . $2 . '<\/a>'/gxe ;
+ }
+
+ open "FILE_OUT", ">", $file_vector ;
+ print FILE_OUT @svg ;
+ close "FILE_OUT" ;
+ }
+
+ # not for Wikipedia, for offline use:
+ if ($makehtml)
+ {
+ $map = "" ;
+ if ($linkmap)
+ {
+ open "FILE_IN", "<", $file_htmlmap ;
+ while ($line = <FILE_IN>)
+ { $map .= $line ; }
+ close "FILE_IN" ;
+ }
+ print "Generating html test file\n" ;
+ $width = sprintf ("%.0f", @Image {"width"} * 100) ;
+ $height = sprintf ("%.0f", @Image {"height"} * 100) ;
+ $html = <<__HTML__ ;
+
+<html>
+<head>
+<title>%FILENAME% - EasyTimeline test file</title>\n
+</head>
+
+<body>
+<h1><font color="green">EasyTimeline</font> - Test Page</h1>
+
+<b>Fixed size version (PNG): file $file_png</b><p>
+<map name="map1">
+$map</map>
+
+<!--
+If you want a border simplest way is set <img .. border='1'>
+Here tables are used to draw similar borders around both images (border='1' seems not to work for embed tag)
+-->
+
+<table border='1' cellpadding='0' cellspacing='0'><tr><td>
+<img src=$file_png usemap='#map1' border='0'>
+</td></tr></table>
+
+<hr>
+<b>Scalable version (SVG): file $file_vector</b><p>
+<table border='1' cellpadding='0' cellspacing='0'><tr><td>
+<noembed>Your browser does not support embedded objects</noembed>
+<embed src='$file_vector' name='SVGEmbed' border='1'
+width='$width' height='$height' type='image/svg-xml' pluginspage='http://www.adobe.com/svg/viewer/install/'>
+</td></tr></table>
+
+<p>As you can see the scalable version renders fonts smoother better than the bitmap version.
+<br>Any SVG picture can also be rescaled or zoomed into, without annoying artefacts.
+
+<p>Windows users:<br>
+<small>&nbsp;&nbsp;Right mouse click on picture for zoom options or</small>
+<p><small>&nbsp;&nbsp;Ctrl+click for zoom in</small>
+<br><small>&nbsp;&nbsp;Ctrl+Shift+click for zoom out</small>
+<br><small>&nbsp;&nbsp;Alt+drag with mouse to move focus</small>
+
+</body>
+</html>
+
+__HTML__
+
+ $html =~ s/\%FILENAME\%/$file_name/ ;
+
+ open "FILE_OUT", ">", $file_html ;
+ print FILE_OUT $html ;
+ close "FILE_OUT" ;
+ }
+# my $cmd = "\"c:\\\\Program Files\\\\XnView\\\\xnview.exe\"" ;
+# system ("\"c:\\\\Program Files\\\\XnView\\\\xnview.exe\"", "d:\\\\Wikipedia\\Perl\\\\Wo2\\\\Test.png") ;
+}
+
+sub WriteTexts
+{
+ my ($line, $xpos, $ypos) ;
+ foreach $line (@PlotText)
+ {
+ my ($at, $bar, $text, $textcolor, $fontsize, $align, $shift, $link, $hint) = split (",", $line) ;
+ $text =~ s/\#\%\$/\,/g ;
+ $link =~ s/\#\%\$/\,/g ;
+ $hint =~ s/\#\%\$/\,/g ;
+ $shift =~ s/\#\%\$/\,/g ;
+ $textcolor =~ s/\#\%\$/\,/g ;
+
+ my $barcnt = 0 ;
+ for ($b = 0 ; $b <= $#Bars ; $b++)
+ {
+ if (lc(@Bars [$b]) eq lc($bar))
+ { $barcnt = ($b + 1) ; last ; }
+ }
+
+ if (@Axis {"time"} eq "x")
+ { $xpos = "$at(s)" ; $ypos = "[$barcnt](s)" ; }
+ else
+ { $ypos = "$at(s)" ; $xpos = "[$barcnt](s)" ; }
+
+ if ($shift ne "")
+ {
+ my ($shiftx, $shifty) = split (",", $shift) ;
+ if ($shiftx > 0)
+ { $xpos .= "+$shiftx" ; }
+ if ($shiftx < 0)
+ { $xpos .= "$shiftx" ; }
+ if ($shifty > 0)
+ { $ypos .= "+$shifty" ; }
+ if ($shifty < 0)
+ { $ypos .= "$shifty" ; }
+ }
+
+ &WriteText ("~", $bar, $shiftx, $xpos, $ypos, $text, $textcolor, $fontsize, $align, $link, $hint) ;
+ }
+}
+
+sub PlotBars
+{
+ #proc getdata / #proc bars
+ while ($#PlotBarsNow >= 0)
+ {
+ undef @PlotBarsLater ;
+
+ $maxwidth = 0 ;
+ foreach $entry (@PlotBarsNow)
+ {
+ ($width) = split (",", $entry) ;
+ if ($width > $maxwidth)
+ { $maxwidth = $width ; }
+ }
+
+ $script .= "#proc getdata\n" ;
+ $script .= " delim: comma\n" ;
+ $script .= " data:\n" ;
+
+ foreach $entry (@PlotBarsNow)
+ {
+ my ($width, $bar, $from, $till, $color, $link, $hint) = split (",", $entry) ;
+ if ($width < $maxwidth)
+ {
+ push @PlotBarsLater, $entry ;
+ next ;
+ }
+ for ($b = 0 ; $b <= $#Bars ; $b++)
+ {
+ if (lc(@Bars [$b]) eq lc($bar))
+ { $bar = ($#Bars - ($b - 1)) ; last ; }
+ }
+ if (@Axis {"order"} !~ /reverse/i)
+ { $entry = "$bar,$from,$till,$color,$link,$hint,\n" ; }
+ else
+ { $entry = "$bar," . (-$till) . "," . (-$from) . ",$color,$link,$hint,\n" ; }
+
+ $script .= "$entry" ;
+ }
+ $script .= "\n" ;
+
+ #proc bars
+ $script .= "#proc bars\n" ;
+ $script .= " axis: " . @Axis {"time"} . "\n" ;
+ $script .= " barwidth: $maxwidth\n" ;
+ $script .= " outline: no\n" ;
+# $script .= " thinbarline: width=5\n" ;
+ if (@Axis {"time"} eq "x")
+ { $script .= " horizontalbars: yes\n" ; }
+ $script .= " locfield: 1\n" ;
+ $script .= " segmentfields: 2 3\n" ;
+ $script .= " colorfield: 4\n" ;
+# $script .= " outline: width=1\n" ;
+# $script .= " barwidthfield: 5\n" ;
+# if (@fields [4] ne "")
+# { $script .= " clickmapurl: " . &LinkToUrl ($text) . "\n" ; }
+# if (@fields [5] ne "")
+# { $script .= " clickmaplabel: $text\n" ; }
+ $script .= " clickmapurl: \@\@5\n" ;
+ $script .= " clickmaplabel: \@\@6\n" ;
+ $script .= "\n" ;
+
+ @PlotBarsNow = @PlotBarsLater ;
+ }
+}
+
+sub PlotScale
+{
+ my $scale = shift ;
+ my $grid = shift ;
+ my ($color, $from, $till, $start) ;
+
+ %x = %Period ;
+# if (($DateFormat =~ /\//) && ($grid))
+# { return ; }
+
+# if (($DateFormat =~ /\//)
+# {
+# }
+
+# if (! $grid) # redefine area, scale linear for time axis, showl whole years always, Ploticus bug
+# {
+ # $from = @Period {"from"} ;
+ # $till = @Period {"till"} ;
+ $from = &DateToFloat (@Period {"from"}) ;
+ $till = &DateToFloat (@Period {"till"}) ;
+ # $from =~ s/.*\///g ; # delete dd mm if present
+ # $till =~ s/.*\///g ;
+ #proc areadef
+ $script .= "#proc areadef\n" ;
+ $script .= " #clone: A\n" ;
+ $script .= " " . @Axis {"time"} . "scaletype: linear\n" ; # date yyyy
+
+ if (@Axis {"order"} !~ /reverse/i)
+ { $script .= " " . @Axis {"time"} . "range: $from $till\n" ; }
+ else
+ { $script .= " " . @Axis {"time"} . "range: " . (-$till) . " " . (-$from) . "\n" ; }
+
+ $script .= "\n" ;
+# }
+
+ $script .= "#proc " . @Axis {"time"} . "axis\n" ;
+
+ if (($scale eq "Major") && (! $grid))
+ {
+# $script .= " stubs: incremental " . @Scales {"Major inc"} . " " . @Scales {"Major unit"} . "\n" ;
+# if ($DateFormat =~ /\//)
+# { $script .= " stubformat: " . @Axis {"format"} . "\n" ; }
+# temp always show whole years (Ploticus autorange bug)
+ if (@Scales {"Major stubs"} eq "") # ($DateFormat !~ /\//)
+ { $script .= " stubs: incremental " . @Scales {"Major inc"} . "\n" ; }
+ else
+ { $script .= " stubs: list " . @Scales {"Major stubs"} . "\n" ; }
+ }
+ else
+ { $script .= " stubs: none\n" ; }
+
+ if ($DateFormat !~ /\//)
+# { $script .= " ticincrement: " . @Scales {"$scale inc"} . " " . @Scales {"$scale unit"} . "\n" ; }
+ { $script .= " ticincrement: " . @Scales {"$scale inc"} . "\n" ; }
+ else
+ {
+ my $unit = 1 ;
+ if (@Scales {"$scale unit"} =~ /month/i)
+ { $unit = 1/12 ; }
+ if (@Scales {"$scale unit"} =~ /day/i)
+ { $unit = 1/365 ; }
+ $script .= " ticincrement: " . @Scales {"$scale inc"} . " $unit\n" ;
+ }
+
+ if (defined (@Scales {"$scale start"}))
+ {
+ $start = @Scales {"$scale start"} ;
+ # $start =~ s/.*\///g ; # delete dd mm if present
+ $start = &DateToFloat ($start) ;
+ if (@Axis {"order"} =~ /reverse/i)
+ {
+ $loop = 0 ;
+ $start = -$start ;
+ while ($start - @Scales {"$scale inc"} >= - @Period {"till"})
+ {
+ $start -= @Scales {"$scale inc"} ;
+ if (++$loop > 1000) { last ; } # precaution
+ }
+ }
+ $script .= " stubrange: $start\n" ;
+ }
+
+ if ($scale eq "Major")
+ {
+ $script .= " ticlen: 0.05\n" ;
+ if (@Axis {"time"} eq "y")
+ { $script .= " stubdetails: adjust=0.05,0\n" ; }
+ if (@Axis {"order"} =~ /reverse/i)
+ { $script .= " signreverse: yes\n" ; }
+ }
+ else
+ { $script .= " ticlen: 0.02\n" ; }
+# $script .= " location: 4\n" ; test
+
+ $color .= @Scales {"$scale grid"} ;
+
+ if (defined (@Colors {$color}))
+ { $color = @Colors {$color} ; }
+
+ if ($grid)
+ { $script .= " grid: color=$color\n" ; }
+
+ $script .= "\n" ;
+
+ if ($grid) # restore areadef
+ {
+ #proc areadef
+ $script .= "#proc areadef\n" ;
+ $script .= " #clone: A\n" ;
+ $script .= "\n" ;
+ }
+}
+
+sub PlotLines
+{
+ my $layer = shift ;
+
+ if ($#DrawLines < 0)
+ { return ; }
+
+ undef (@DrawLinesNow) ;
+
+ foreach $line (@DrawLines)
+ {
+ if ($line =~ /\|$layer\n/)
+ { push @DrawLinesNow, $line ; }
+ }
+
+ if ($#DrawLinesNow < 0)
+ { return ; }
+
+ foreach $entry (@DrawLinesNow)
+ {
+ chomp ($entry) ;
+ $script .= "#proc line\n" ;
+# $script .= " notation: scaled\n" ;
+ if ($entry =~ /^[12]/)
+ { ($mode, $at, $from, $till, $color, $width) = split ('\|', $entry) ; }
+ else
+ { ($mode, $points, $color, $width) = split ('\|', $entry) ; }
+
+ $script .= " linedetails: width=$width color=$color style=0\n" ;
+
+ if ($mode == 1) # draw perpendicular to time axis
+ {
+ if (@Axis {"order"} =~ /reverse/i)
+ { $at = -$at ; }
+
+ if (@Axis {"time"} eq "x")
+ {
+ if ($from eq "")
+ { $from = @PlotArea {"bottom"} }
+ if ($till eq "")
+ { $till = @PlotArea {"bottom"} + @PlotArea {"height"} }
+ $from += ($width/200) ; # compensate for overstrechting of thick lines
+ $till -= ($width/200) ;
+ if ($from > @Image {"height"})
+ { $from = @Image {"height"} ; }
+ if ($till > @Image {"height"})
+ { $till = @Image {"height"} ; }
+ $script .= " points: $at(s) $from $at(s) $till\n" ;
+ }
+ else
+ {
+ if ($from eq "")
+ { $from = @PlotArea {"left"} }
+ if ($till eq "")
+ { $till = @PlotArea {"left"} + @PlotArea {"width"} }
+ $from += ($width/200) ;
+ $till -= ($width/200) ;
+ if ($from > @Image {"width"})
+ { $from = @Image {"width"} ; }
+ if ($till > @Image {"width"})
+ { $till = @Image {"width"} ; }
+ $script .= " points: $from $at(s) $till $at(s)\n" ;
+ }
+ }
+
+ if ($mode == 2) # draw parralel to time axis
+ {
+ if (@Axis {"order"} =~ /reverse/i)
+ {
+ $from = -$from ;
+ $till = -$till ;
+ }
+
+ $from .= "(s)+" .($width/200) ;
+ $till .= "(s)-" .($width/200) ;
+ if (@Axis {"time"} eq "x")
+ {
+ if ($at eq "")
+ { $at = @PlotArea {"bottom"} ; }
+ if ($at > @Image {"height"})
+ { $at = @Image {"height"} ; }
+ $script .= " points: $from $at $till $at\n" ;
+ }
+ else
+ {
+ if ($at eq "")
+ { $at = @PlotArea {"left"} ; }
+ if ($at > @Image {"width"})
+ { $at = @Image {"width"} ; }
+ $script .= " points: $at $from $at $till\n" ;
+ }
+ }
+
+ if ($mode == 3) # draw free line
+ {
+ @Points = split (",", $points) ;
+ foreach $point (@Points)
+ { $point = &Normalize ($point) ; }
+ if ((@Points [0] > @Image {"width"}) ||
+ (@Points [1] > @Image {"height"}) ||
+ (@Points [2] > @Image {"width"}) ||
+ (@Points [3] > @Image {"height"}))
+ { &Error2 ("Linedata attribute 'points' invalid.\n" .
+ sprintf ("(%d,%d)(%d,%d)", @Points[0]*100, @Points[1]*100, @Points[2]*100, @Points[3]*100) . " does not fit in image\n") ;
+ return ; }
+ $script .= " points: @Points[0] @Points[1] @Points[2] @Points[3]\n" ;
+ }
+ }
+
+
+ $script .= "\n" ;
+}
+
+sub ColorPredefined
+{
+ my $color = shift ;
+ if ($color =~ /^(?:black|white|tan1|tan2|red|magenta|claret|coral|pink|orange|
+ redorange|lightorange|yellow|yellow2|dullyellow|yelloworange|
+ brightgreen|green|kelleygreen|teal|drabgreen|yellowgreen|
+ limegreen|brightblue|darkblue|blue|oceanblue|skyblue|
+ purple|lavender|lightpurple|powderblue|powderblue2)$/xi)
+ {
+ if (! defined (@Colors {lc ($color)}))
+ { &StoreColor ($color, $color, "", $command) ; }
+ return ($true) ;
+ }
+ else
+ { return ($false) ; }
+}
+
+sub ValidAbs
+{
+ $value = shift ;
+ if ($value =~ /^ \d+ \.? \d* (?:px|in|cm)? $/xi)
+ { return ($true) ; }
+ else
+ { return ($false) ; }
+}
+
+sub ValidAbsRel
+{
+ $value = shift ;
+ if ($value =~ /^ \d+ \.? \d* (?:px|in|cm|$hPerc)? $/xi)
+ { return ($true) ; }
+ else
+ { return ($false) ; }
+}
+
+sub ValidDateFormat
+{
+ my $date = shift ;
+ my ($day, $month, $year) ;
+
+# if ($date=~ /^\-?\d+$/) # for now full years are always allowed
+# { return ($true) ; }
+
+ if ($DateFormat eq "yyyy")
+ {
+ if (! ($date=~ /^\-?\d+$/))
+ { return ($false) ; }
+ return ($true) ;
+ }
+
+ if ($DateFormat eq "x.y")
+ {
+ if (! ($date=~ /^\-?\d+(?:\.\d+)?$/))
+ { return ($false) ; }
+ return ($true) ;
+ }
+
+ if (! ($date=~ /^\d\d\/\d\d\/\d\d\d\d$/))
+ { return ($false) ; }
+
+ if ($DateFormat eq "dd/mm/yyyy")
+ {
+ $day = substr ($date,0,2) ;
+ $month = substr ($date,3,2) ;
+ $year = substr ($date,6,4) ;
+ }
+ else
+ {
+ $day = substr ($date,3,2) ;
+ $month = substr ($date,0,2) ;
+ $year = substr ($date,6,4) ;
+ }
+
+ if ($month =~ /^(?:01|03|05|07|08|10|12)$/)
+ { if ($day > 31) { return ($false) ; }}
+ elsif ($month =~ /^(?:04|06|09|11)$/)
+ { if ($day > 30) { return ($false) ; }}
+ elsif ($month =~ /^02$/)
+ {
+ if (($year % 4 == 0) && ($year % 100 != 0))
+ { if ($day > 29) { return ($false) ; }}
+ else
+ { if ($day > 28) { return ($false) ; }}
+ }
+ else { return ($false) ; }
+ return ($true) ;
+}
+
+sub ValidDateRange
+{
+ my $date = shift ;
+ my ($day, $month, $year,
+ $dayf, $monthf, $yearf,
+ $dayt, $montht, $yeart) ;
+
+ my $from = @Period {"from"} ;
+ my $till = @Period {"till"} ;
+
+ if (($DateFormat eq "yyyy") || ($DateFormat eq "x.y"))
+ {
+ if (($date < $from) || ($date > $till))
+ { return ($false) ; }
+ return ($true) ;
+ }
+
+ if ($DateFormat eq "dd/mm/yyyy")
+ {
+ $day = substr ($date,0,2) ;
+ $month = substr ($date,3,2) ;
+ $year = substr ($date,6,4) ;
+ $dayf = substr ($from,0,2) ;
+ $monthf = substr ($from,3,2) ;
+ $yearf = substr ($from,6,4) ;
+ $dayt = substr ($till,0,2) ;
+ $montht = substr ($till,3,2) ;
+ $yeart = substr ($till,6,4) ;
+ }
+ if ($DateFormat eq "mm/dd/yyyy")
+ {
+ $day = substr ($date,3,2) ;
+ $month = substr ($date,0,2) ;
+ $year = substr ($date,6,4) ;
+ $dayf = substr ($from,3,2) ;
+ $monthf = substr ($from,0,2) ;
+ $yearf = substr ($from,6,4) ;
+ $dayt = substr ($till,3,2) ;
+ $montht = substr ($till,0,2) ;
+ $yeart = substr ($till,6,4) ;
+ }
+
+ if (($year < $yearf) ||
+ (($year == $yearf) &&
+ (($month < $monthf) ||
+ (($month == $monthf) && ($day < $dayf))
+ )))
+ { return ($false) }
+
+ if (($year > $yeart) ||
+ (($year == $yeart) &&
+ (($month > $montht) ||
+ (($month == $montht) && ($day > $dayt))
+ )))
+ { return ($false) }
+
+ return ($true) ;
+}
+
+sub DateMedium
+{
+ my $from = shift ;
+ my $till = shift ;
+
+ if (($DateFormat eq "yyyy") || ($DateFormat eq "x.y"))
+ { return (sprintf ("%.3f", ($from + $till) / 2)) ; }
+
+ $from2 = &DaysFrom1800 ($from) ;
+ $till2 = &DaysFrom1800 ($till) ;
+ my $date = &DateFrom1800 (int (($from2 + $till2) / 2)) ;
+ return ($date) ;
+}
+
+sub DaysFrom1800
+{
+ @mmm = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) ;
+ my $date = shift ;
+ if ($DateFormat eq "dd/mm/yyyy")
+ {
+ $day = substr ($date,0,2) ;
+ $month = substr ($date,3,2) ;
+ $year = substr ($date,6,4) ;
+ }
+ else
+ {
+ $day = substr ($date,3,2) ;
+ $month = substr ($date,0,2) ;
+ $year = substr ($date,6,4) ;
+ }
+ if ($year < 1800)
+ { &Error2 ("Function 'DaysFrom1800' expects year >= 1800, not '$year'.") ; return ; }
+
+ $days = ($year - 1800) * 365 ;
+ $days += int (($year -1 - 1800) / 4) ;
+ $days -= int (($year -1 - 1800) / 100) ;
+ if ($month > 1)
+ {
+ for ($m = $month - 2 ; $m >= 0 ; $m--)
+ {
+ $days += @mmm [$m] ;
+ if ($m == 1)
+ {
+ if ((($year % 4) == 0) && (($year % 100) != 0))
+ { $days ++ ; }
+ }
+ }
+ }
+ $days += $day ;
+
+ return ($days) ;
+}
+
+sub DateToFloat
+{
+ my $date = shift ;
+ if ($DateFormat !~ /\//)
+ { return ($date) ; }
+ my $year = $date ;
+ $year =~ s/.*\///g ; # delete dd mm/mm dd
+ my $fraction = (&DaysFrom1800 ($date) - &DaysFrom1800 ("01/01/" . $year)) / 365.25 ;
+ return ($year + $fraction) ;
+}
+
+sub DateFrom1800
+{
+ my $days = shift ;
+
+ @mmm = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) ;
+
+ $year = 1800 ;
+ while ($days > 365 + (($year % 4) == 0))
+ {
+ if ((($year % 4) == 0) && (($year % 100) != 0))
+ { $days -= 366 ; }
+ else
+ { $days -= 365 ; }
+ $year ++ ;
+ }
+
+ $month = 0 ;
+ while ($days > @mmm [$month])
+ {
+ $days -= @mmm [$month] ;
+ if ($month == 1)
+ {
+ if ((($year % 4) == 0) && (($year % 100) != 0))
+ { $days -- ; } ;
+ }
+ $month++ ;
+ }
+ $day = $days ;
+
+ $month ++ ;
+ if ($DateFormat eq "dd/mm/yyyy")
+ { $date = sprintf ("%02d/%02d/%04d", $day, $month, $year) ; }
+ else
+ { $date = sprintf ("%02d/%02d/%04d", $month, $day, $year) ; }
+
+ return ($date) ;
+}
+
+sub ExtractText
+{
+ my $data = shift ;
+ my $data2 = $data ;
+ my $text = "" ;
+
+ # special case: allow embedded spaces when 'text' is last attribute
+# $data2 =~ s/\:\:/\@\#\!/g ;
+ if ($data2 =~ /text\:[^\:]+$/)
+ {
+ $text = $data2 ;
+ $text =~ s/^.*?text\:// ;
+# $text =~ s/^\s(.*?)\s*$/$1/ ; ?? ->
+ $text =~ s/^(.*?)\s*$/$1/ ;
+ $text =~ s/\\n/\n/g ;
+ $text =~ s/\"\"/\@\#\$/g ;
+ $text =~ s/\"//g ;
+ $text =~ s/\@\#\$/"/g ;
+ $data2 =~ s/text\:.*$// ;
+ }
+
+ # extract text between double quotes
+ $data2 =~ s/\"\"/\@\#\$/g ;
+ if ($data2 =~ /text\:\s*\"/)
+ {
+ $text = $data2 ;
+ $text =~ s/^.*?text\:\s*\"// ;
+
+ if (! ($text =~ /\"/))
+ { &Error ("PlotData invalid. Attribute 'text': no closing \" found.") ;
+ return ("x", "x") ; }
+
+ $text =~ s/\".*$//;
+ $text =~ s/\@\#\$/"/g ;
+ $text =~ s/\\n/\n/g ;
+ }
+ $data2 =~ s/text\:\s*\"[^\"]*\"// ;
+ $data2 =~ s/\@\#\$/"/g ;
+ return ($data2, $text) ;
+}
+
+sub ParseText
+{
+ my $text = shift ;
+ $text =~ s/\_\_/\@\#\$/g ;
+ $text =~ s/\_/ /g ;
+ $text =~ s/\@\#\$/_/g ;
+
+ $text =~ s/\~\~/\@\#\$/g ;
+ $text =~ s/\~/\\n/g ;
+ $text =~ s/\@\#\$/~/g ;
+
+ return ($text) ;
+}
+
+sub BarDefined
+{
+ my $bar = shift ;
+ foreach $bar2 (@Bars)
+ {
+ if (lc ($bar2) eq lc ($bar))
+ { return ($true) ; }
+ }
+
+# not part of barset ? return
+ if ($bar != /\#\d+$/)
+ { return ($false) ; }
+
+# find previous bar in barset
+ my $barcnt = $bar ;
+ my $barid = $bar ;
+ $barcnt =~ s/.*\#(\d+$)/$1/ ;
+ $barid =~ s/(.*\#)\d+$/$1/ ;
+ $barcnt -- ;
+ $a = $#Bars ;
+ for (my $b = 0 ; $b <= $#Bars ; $b++)
+ {
+ if (lc (@Bars [$b]) eq lc ($barid . $barcnt))
+ {
+ $b++ ;
+ for (my $b2 = $#Bars + 1 ; $b2 > $b ; $b2--)
+ { @Bars [$b2] = @Bars [$b2-1]; }
+ @Bars [$b] = lc ($bar) ;
+ @BarLegend {lc ($bar)} = " " ;
+ return ($true) ;
+ }
+ }
+ return ($false) ;
+}
+
+sub ValidAttributes
+{
+ my $command = shift ;
+
+ if ($command =~ /^BackgroundColors$/i)
+ { return (CheckAttributes ($command, "", "canvas,bars")) ; }
+
+ if ($command =~ /^BarData$/i)
+# { return (CheckAttributes ($command, "", "bar,barset,barcount,link,text")) ; }
+ { return (CheckAttributes ($command, "", "bar,barset,link,text")) ; }
+
+ if ($command =~ /^Colors$/i)
+ { return (CheckAttributes ($command, "id,value", "legend")) ; }
+
+ if ($command =~ /^ImageSize$/i)
+ { return (CheckAttributes ($command, "", "width,height,barincrement")) ; }
+
+ if ($command =~ /^Legend$/i)
+ { return (CheckAttributes ($command, "", "columns,columnwidth,orientation,position,left,top")) ; }
+
+ if ($command =~ /^LineData$/i)
+ { return (CheckAttributes ($command, "", "at,from,till,atpos,frompos,tillpos,points,color,layer,width")) ; }
+
+ if ($command =~ /^Period$/i)
+ { return (CheckAttributes ($command, "from,till", "")) ; }
+
+ if ($command =~ /^PlotArea$/i)
+ { return (CheckAttributes ($command, "", "left,bottom,width,height,right,top")) ; }
+
+ if ($command =~ /^PlotData$/i)
+ { return (CheckAttributes ($command, "", "align,anchor,at,bar,barset,color,fontsize,from,link,mark,shift,text,textcolor,till,width")) ; }
+
+ if ($command =~ /^Scale/i)
+ { return (CheckAttributes ($command, "increment,start", "unit,grid,gridcolor,text")) ; }
+
+ if ($command =~ /^TextData$/i)
+ { return (CheckAttributes ($command, "", "fontsize,lineheight,link,pos,tabs,text,textcolor")) ; }
+
+ if ($command =~ /^TimeAxis$/i)
+ { return (CheckAttributes ($command, "", "orientation,format,order")) ; }
+
+ return ($true) ;
+}
+
+sub CheckAttributes
+{
+ my $name = shift ;
+ my @Required = split (",", shift) ;
+ my @Allowed = split (",", shift) ;
+
+ my $attribute ;
+ my %Attributes2 = %Attributes ;
+
+ $hint = "\nSyntax: '$name =" ;
+ foreach $attribute (@Required)
+ { $hint .= " $attribute:.." ; }
+ foreach $attribute (@Allowed)
+ { $hint .= " [$attribute:..]" ; }
+ $hint .= "'" ;
+
+ foreach $attribute (@Required)
+ {
+ if ((! defined (@Attributes {$attribute})) || (@Attributes {$attribute} eq ""))
+ { &Error ("$name definition incomplete. $hint") ;
+ undef (@Attributes) ; return ($false) ; }
+ delete (@Attributes2 {$attribute}) ;
+ }
+ foreach $attribute (@Allowed)
+ { delete (@Attributes2 {$attribute}) ; }
+
+ @AttrKeys = keys %Attributes2 ;
+ if ($#AttrKeys >= 0)
+ {
+ if (@AttrKeys [0] eq "single")
+ { &Error ("$name definition invalid. Specify all attributes as name:value pairs.") ; }
+ else
+ { &Error ("$name definition invalid. Invalid attribute '" . @AttrKeys [0] . "' found. $hint") ; }
+ undef (@Attributes) ; return ($false) ; }
+
+ return ($true) ;
+}
+
+sub CheckPreset
+{
+ my $command = shift ;
+ my ($preset, $action, $attrname, $attrvalue) ;
+
+ my $newcommand = $true ;
+ my $addvalue = $true ;
+ if ($command =~ /^$prevcommand$/i)
+ { $newcommand = $false ; }
+ if ((! $newcommand) && ($command =~ /^(?:DrawLines|PlotData|TextData)$/i))
+ { $addvalue = $false ; }
+ $prevcommand = $command ;
+
+ foreach $preset (@PresetList)
+ {
+ if ($preset =~ /^$command\|/i)
+ {
+ ($command, $action, $attrname, $attrpreset) = split ('\|', $preset) ;
+ if ($attrname eq "")
+ { $attrname = "single" ; }
+
+ $attrvalue = @Attributes {$attrname} ;
+
+ if (($action eq "-") && ($attrvalue ne ""))
+ {
+ if ($attrname eq "single")
+ { &Error ("Chosen preset makes this command redundant.\n" .
+ " Please remove this command.") ; }
+ else
+ { &Error ("Chosen preset conflicts with '$attrname:...'.\n" .
+ " Please remove this attribute.") ; }
+ @Attributes {$attrname} = "" ;
+ }
+
+ if (($action eq "+") && ($attrvalue eq ""))
+ {
+ if ($addvalue)
+ { @Attributes {$attrname} = $attrpreset ; }
+ }
+
+ if (($action eq "=") && ($attrvalue eq ""))
+ { @Attributes {$attrname} = $attrpreset ; }
+
+ if (($action eq "=") && ($attrvalue ne "") &&
+ ($attrvalue !~ /$attrpreset/i))
+ {
+ if ($attrname eq "single")
+ { &Error ("Conflicting settings.\nPreset defines '$attrpreset'.") ; }
+ else
+ { &Error ("Conflicting settings.\nPreset defines '$attrname:$attrpreset'.") ; }
+ @Attributes {$attrname} = $attrpreset ;
+ }
+ }
+ }
+}
+
+sub ShiftOnePixelForSVG
+{
+ my $line = shift ;
+ $line =~ s/location:\s*// ;
+ my ($posx, $posy) = split (" ", $line) ;
+
+ if ($posy =~ /\+/)
+ { ($posy1, $posy2) = split ('\+', $posy) ; }
+ elsif ($posy =~ /.+\-/)
+ {
+ if ($posy =~ /^\-/)
+ {
+ ($sign, $posy1, $posy2) = split ('\-', $posy) ; $posy2 = - $posy2 ;
+ $posy1 = "-" . $posy1 ;
+ }
+ else
+ { ($posy1, $posy2) = split ('\-', $posy) ; $posy2 = - $posy2 }
+ }
+ else
+ { $posy1 = $posy ; $posy2 = 0 ; }
+
+ if ($posy1 !~ /(s)/)
+ { $posy += 0.01 ; }
+ else
+ {
+ $posy2 += 0.01 ;
+ if ($posy2 == 0)
+ { $posy = $posy1 ; }
+ elsif ($posy2 < 0)
+ { $posy = $posy1 . "$posy2" ; }
+ else
+ { $posy = $posy1 . "+" . $posy2 ; }
+ }
+
+ $line = "\n location: $posx $posy" ;
+ return ($line) ;
+}
+
+sub NormalizeURL
+{
+ my $url = shift ;
+ $url =~ s/(https?)\:?\/?\/?/$1:\/\// ; # add possibly missing special characters
+ $url =~ s/ /%20/g ;
+ return ($url) ;
+}
+
+# wiki style link may include linebreak characters -> split into several wiki links
+sub NormalizeWikiLink
+{
+ my $text = shift ;
+
+ my $brdouble = $false ;
+ if ($text =~ /\[\[.*\]\]/)
+ { $brdouble = $true ; }
+
+ $text =~ s/\[\[?// ;
+ $text =~ s/\]?\]// ;
+
+ my ($hide,$show) = split ('\|', $text) ;
+ if ($show eq "")
+ { $show = $hide ; }
+ $hide =~ s/\s*\n\s*/ /g ;
+
+ my @Show = split ("\n", $show) ;
+ $text = "" ;
+ foreach $part (@Show)
+ {
+ if ($brdouble)
+ { $part = "[[" . $hide . "|" . $part . "]]" ; }
+ else
+ { $part = "[" . $hide . "|" . $part . "]" ; }
+ }
+ $text = join ("\n", @Show) ;
+
+ return ($text) ;
+}
+
+sub ProcessWikiLink
+{
+ my $text = shift ;
+ my $link = shift ;
+ my $hint = shift ;
+ my $wikilink = $false ;
+
+ chomp ($text) ;
+ chomp ($link) ;
+ chomp ($hint) ;
+
+ my ($wiki, $title) ;
+ if ($link ne "") # ignore wiki brackets in text when explicit link is specified
+ {
+ $text =~ s/\[\[ [^\|]+ \| (.*) \]\]/$1/gx ;
+ $text =~ s/\[\[ [^\:]+ \: (.*) \]\]/$1/gx ;
+# $text =~ s/\[\[ (.*) \]\]/$1/gx ;
+ }
+ else
+ {
+ if ($text =~ /\[.+\]/) # keep first link in text segment, remove others
+ {
+ $link = $text ;
+ $link =~ s/\n//g ;
+ $link =~ s/^[^\[\]]*\[/[/x ;
+
+ if ($link =~ /^\[\[/)
+ { $wikilink = $true ; }
+
+ $link =~ s/^ [^\[]* \[+ ([^\[\]]*) \].*$/$1/x ;
+ $link =~ s/\|.*$// ;
+ if ($wikilink)
+ { $link = "[[" . $link . "]]" ; }
+
+ $text =~ s/(\[+) [^\|\]]+ \| ([^\]]*) (\]+)/$1$2$3/gx ;
+ $text =~ s/(https?)\:/$1colon/gx ;
+# $text =~ s/(\[+) [^\:\]]+ \: ([^\]]*) (\]+)/$1$2$3/gx ; #???
+
+ # remove interwiki link prefix
+ $text =~ s/(\[+) (?:.{2,3}|(?:zh\-.*)|simple|minnan|tokipona) \: ([^\]]*) (\]+)/$1$2$3/gxi ; #???
+
+ $text =~ s/\[+ ([^\]]+) \]+/{{{$1}}}/x ;
+ $text =~ s/\[+ ([^\]]+) \]+/$1/gx ;
+ $text =~ s/\{\{\{ ([^\}]*) \}\}\}/[[$1]]/x ;
+ }
+# if ($text =~ /\[\[.+\]\]/)
+# {
+# $wikilink = $true ;
+# $link = $text ;
+# $link =~ s/\n//g ;
+# $link =~ s/^.*?\[\[/[[/x ;
+# $link =~ s/\| .*? \]\].*$/]]/x ;
+# $link =~ s/\]\].*$/]]/x ;
+# $text =~ s/\[\[ [^\|\]]+ \| (.*?) \]\]/[[$1]]/x ;
+# $text =~ s/\[\[ [^\:\]]+ \: (.*?) \]\]/[[$1]]/x ;
+
+# # remove remaining links
+# $text =~ s/\[\[ ([^\]]+) \]\]/^%#$1#%^/x ;
+# $text =~ s/\[+ ([^\]]+) \]+/$1/gx ;
+# $text =~ s/\^$hPerc\# (.*?) \#$hPerc\^/[[$1]]/x ;
+# }
+# elsif ($text =~ /\[.+\]/)
+# {
+# $link = $text ;
+# $link =~ s/\n//g ;
+# $link =~ s/^.*?\[/[/x ;
+# $link =~ s/\| .*? \].*$/]/x ;
+# $link =~ s/\].*$/]/x ;
+# $link =~ s/\[ ([^\]]+) \]/$1/x ;
+# $text =~ s/\[ [^\|\]]+ \| (.*?) \]/[[$1]]/x ;
+
+# # remove remaining links
+# $text =~ s/\[\[ ([^\]]+) \]\]/^%#$1#%^/x ;
+# $text =~ s/\[+ ([^\]]+) \]+/$1/gx ;
+# $text =~ s/\^$hPerc\# (.*?) \#$hPerc\^/[[$1]]/x ;
+## $text =~ s/\[\[ (.*) \]\]/$1/gx ;
+# }
+
+ }
+
+ if ($wikilink)
+ {
+# if ($link =~ /^\[\[.+\:.+\]\]$/) # has a colon in its name
+ if ($link =~ /^\[\[ (?:.{2,3}|(?:zh\-.*)|simple|minnan|tokipona) \: .+\]\]$/xi) # has a interwiki link prefix
+ {
+ # This will fail for all interwiki links other than Wikipedia.
+ $wiki = lc ($link) ;
+ $title = $link ;
+ $wiki =~ s/\[\[([^\:]+)\:.*$/$1/x ;
+ $title =~ s/^[^\:]+\:(.*)\]\]$/$1/x ;
+ $title =~ s/ /_/g ;
+ $link = "http://$wiki.wikipedia.org/wiki/$title" ;
+ $link = &EncodeURL ($title) ;
+ if (($hint eq "") && ($title ne ""))
+ { $hint = "$wiki: $title" ; }
+ }
+ else
+ {
+ # $wiki = "en" ;
+ $title = $link ;
+ $title =~ s/^\[\[(.*)\]\]$/$1/x ;
+ $title =~ s/ /_/g ;
+ $link = $articlepath ;
+ $urlpart = &EncodeURL ($title) ;
+ $link =~ s/\$1/$urlpart/ ;
+ if (($hint eq "") && ($title ne ""))
+ { $hint = "$title" ; }
+ }
+ $hint =~ s/_/ /g ;
+ }
+ else
+ {
+ if ($link ne "")
+ { $hint = &ExternalLinkToHint ($link) ; }
+ }
+
+ if (($link ne "") && ($text !~ /\[\[/) && ($text !~ /\]\]/))
+ { $text = "[[" . $text . "]]" ; }
+
+ $hint = &EncodeHtml ($hint) ;
+ return ($text, $link, $hint) ;
+}
+
+sub ExternalLinkToHint
+{
+ my $hint = shift ;
+ $hint =~ s/^https?\:?\/?\/?// ;
+ $hint =~ s/\/.*$// ;
+ return (&EncodeHtml ($hint . "/..")) ;
+}
+
+sub EncodeInput
+{
+ my $text = shift ;
+ # revert encoding of '<' & '>' by MediaWiki
+ $text =~ s/\&lt\;/\</g ;
+ $text =~ s/\&gt\;/\>/g ;
+ $text =~ s/([\`\{\}\%\&\@\$\(\)\;\=])/"%" . sprintf ("%X", ord($1)) . "%";/ge ;
+ return ($text) ;
+}
+
+sub DecodeInput
+{
+ my $text = shift ;
+ $text =~ s/\%([0-9A-F]{2})\%/chr(hex($1))/ge ;
+ return ($text) ;
+}
+
+sub EncodeHtml
+{
+ my $text = shift ;
+ $text =~ s/([\<\>\&\'\"])/"\&\#" . ord($1) . "\;"/ge ;
+ $text =~ s/\n/<br>/g ;
+ return ($text) ;
+}
+
+sub EncodeURL
+{
+ my $url = shift ;
+ # For some reason everything gets run through this weird internal
+ # encoding that's similar to URL-encoding. Armor against this as well,
+ # or else adjacent encoded bytes will be corrupted.
+ $url =~ s/([^0-9a-zA-Z\%\:\/\._])/"%25%".sprintf ("%02X",ord($1))/ge ;
+ return ($url) ;
+}
+
+sub Error
+{
+ my $msg = &DecodeInput(shift) ;
+ $msg =~ s/\n\s*/\n /g ; # indent consecutive lines
+
+ $CntErrors++ ;
+ if (! $listinput)
+ { push @Errors, "Line $LineNo: " . &DecodeInput($Line) . "\n" ; }
+ push @Errors, "- $msg\n\n" ;
+ if ($CntErrors > 10)
+ { &Abort ("More than 10 errors found") ; }
+}
+
+sub Error2
+{
+ my $msg = &DecodeInput(shift) ;
+ $msg =~ s/\n\s*/\n /g ; # indent consecutive lines
+ $CntErrors++ ;
+ push @Errors, "- $msg\n" ;
+}
+
+sub Warning
+{
+ my $msg = &DecodeInput(shift) ;
+ $msg =~ s/\n\s*/\n /g ; # indent consecutive lines
+ if (! $listinput)
+ { push @Warnings, "Line $LineNo: " . &DecodeInput ($Line) . "\n" ; }
+ push @Warnings, "- $msg\n\n" ;
+}
+
+sub Warning2
+{
+ my $msg = &DecodeInput(shift) ;
+ $msg =~ s/\n\s*/\n /g ; # indent consecutive lines
+ push @Warnings, "- $msg\n" ;
+}
+
+sub Info
+{
+ my $msg = &DecodeInput(shift) ;
+ $msg =~ s/\n\s*/\n /g ; # indent consecutive lines
+ if (! $listinput)
+ { push @Info, "Line $LineNo: " . &DecodeInput ($Line) . "\n" ; }
+ push @Info, "- $msg\n\n" ;
+}
+
+sub Info2
+{
+ my $msg = &DecodeInput(shift) ;
+ $msg =~ s/\n\s*/\n /g ; # indent consecutive lines
+ push @Info, "- $msg\n" ;
+}
+
+sub Abort
+{
+ my $msg = &DecodeInput(shift) ;
+
+ print "\n\n***** " . $msg . " *****\n\n" ;
+ print @Errors ;
+ print "Execution aborted.\n" ;
+
+ open "FILE_OUT", ">", $file_errors ;
+ print FILE_OUT "<p>EasyTimeline $version</p><p><b>Timeline generation failed: " . &EncodeHtml ($msg) ."</b></p>\n" ;
+ foreach $line (@Errors)
+ { print FILE_OUT &EncodeHtml ($line) . "\n" ; }
+ close "FILE_OUT" ;
+
+ if ($makehtml) # generate html test file, which would normally contain png + svg (+ image map)
+ {
+ open "FILE_IN", "<", $file_errors ;
+ open "FILE_OUT", ">", $file_html ;
+ print FILE_OUT "<html><head>\n<title>Graphical Timelines - HTML test file</title>\n</head>\n" .
+ "<body><h1><font color='green'>EasyTimeline</font> - Test Page</h1>\n\n" .
+ "<code>\n" ;
+ print FILE_OUT <FILE_IN> ;
+ print FILE_OUT "</code>\n\n</body>\n</html>" ;
+ close "FILE_IN" ;
+ close "FILE_OUT" ;
+ }
+ exit ;
+}
+
+sub EscapeShellArg
+{
+ my $arg = shift;
+ if ($env eq "Linux") {
+ $arg =~ s/'/\\'/;
+ $arg = "'$arg'";
+ } else {
+ $arg =~ s/"/\\"/;
+ $arg = "\"$arg\"";
+ }
+ return $arg;
+}
+
+# vim: set sts=2 ts=2 sw=2 et :
+
+sub UnicodeToAscii {
+ my $unicode = shift ;
+ my $char = substr ($unicode,0,1) ;
+ my $ord = ord ($char) ;
+
+ if ($ord < 128) # plain ascii character
+ { return ($unicode) ; } # (will not occur in this script)
+ else
+ {
+ # for completeness sake complete routine, only 2 byte unicodes sent here
+ if ($ord >= 252)
+ { $value = $ord - 252 ; }
+ elsif ($ord >= 248)
+ { $value = $ord - 248 ; }
+ elsif ($ord >= 240)
+ { $value = $ord - 240 ; }
+ elsif ($ord >= 224)
+ { $value = $ord - 224 ; }
+ else
+ { $value = $ord - 192 ; }
+ for ($c = 1 ; $c < length ($unicode) ; $c++)
+ { $value = $value * 64 + ord (substr ($unicode, $c,1)) - 128 ; }
+
+# $html = "\&\#" . $value . ";" ; any unicode can be specified as html char
+
+ if (($value >= 128) && ($value <= 255))
+ { return (chr ($value)) ; }
+ else
+ { return "?" ; }
+ }
+}
+
diff --git a/mwlib/Makefile b/mwlib/Makefile
new file mode 100644
index 0000000..0a7abd2
--- /dev/null
+++ b/mwlib/Makefile
@@ -0,0 +1,20 @@
+RE2C = re2c -w --no-generation-date
+
+all: _expander.cc _mwscan.cc _mwscan.so _expander.so
+
+_expander.so: _expander.cc
+ (cd .. && python ./setup.py-mwlib build_ext --inplace build)
+
+_mwscan.so: _mwscan.cc
+ (cd .. && python ./setup.py-mwlib build_ext --inplace build)
+
+_expander.cc: _expander.re
+ $(RE2C) -o _expander.cc _expander.re
+
+_mwscan.cc: _mwscan.re
+ $(RE2C) -o _mwscan.cc _mwscan.re
+
+clean::
+ rm -rf *.pyc *~ *.so build a.out
+
+
diff --git a/mwlib/__init__.py b/mwlib/__init__.py
new file mode 100755
index 0000000..8088807
--- /dev/null
+++ b/mwlib/__init__.py
@@ -0,0 +1,6 @@
+
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+
+#import pkg_resources
+#pkg_resources.declare_namespace("mwlib")
diff --git a/mwlib/_expander.cc b/mwlib/_expander.cc
new file mode 100644
index 0000000..9641ae1
--- /dev/null
+++ b/mwlib/_expander.cc
@@ -0,0 +1,826 @@
+/* Generated by re2c 0.13.4 */
+#line 1 "_expander.re"
+// -*- mode: c++ -*-
+// Copyright (c) 2007-2008 PediaPress GmbH
+// See README.txt for additional licensing information.
+
+#include <Python.h>
+
+#include <iostream>
+#include <assert.h>
+#include <vector>
+
+using namespace std;
+
+#define RET(x) {found(x); return x;}
+
+struct Token
+{
+ int type;
+ int start;
+ int len;
+};
+
+
+class MacroScanner
+{
+public:
+
+ MacroScanner(Py_UNICODE *_start, Py_UNICODE *_end) {
+ source = start = _start;
+ end = _end;
+ cursor = start;
+ }
+
+ int found(int val) {
+ if (val==5 && tokens.size()) {
+ Token &previous_token (tokens[tokens.size()-1]);
+ if (previous_token.type==val) {
+ previous_token.len += cursor-start;
+ return tokens.size()-1;
+ }
+ }
+ Token t;
+ t.type = val;
+ t.start = (start-source);
+ t.len = cursor-start;
+ tokens.push_back(t);
+ return tokens.size()-1;
+ }
+
+ inline int scan();
+
+ Py_UNICODE *source;
+
+ Py_UNICODE *start;
+ Py_UNICODE *cursor;
+ Py_UNICODE *end;
+ vector<Token> tokens;
+};
+
+
+int MacroScanner::scan()
+{
+
+std:
+
+ start=cursor;
+
+ Py_UNICODE *marker=cursor;
+
+ Py_UNICODE *save_cursor = cursor;
+
+
+#define YYCTYPE Py_UNICODE
+#define YYCURSOR cursor
+#define YYMARKER marker
+#define YYLIMIT (end)
+// #define YYFILL(n) return 0;
+
+#line 80 "_expander.re"
+
+
+
+
+
+#line 87 "_expander.cc"
+{
+ YYCTYPE yych;
+
+ yych = *YYCURSOR;
+ if (yych <= '\\') {
+ if (yych <= '<') {
+ if (yych <= 0x0000) goto yy10;
+ if (yych <= ';') goto yy12;
+ goto yy9;
+ } else {
+ if (yych == '[') goto yy5;
+ goto yy12;
+ }
+ } else {
+ if (yych <= '{') {
+ if (yych <= ']') goto yy6;
+ if (yych <= 'z') goto yy12;
+ } else {
+ if (yych <= '|') goto yy7;
+ if (yych <= '}') goto yy4;
+ goto yy12;
+ }
+ }
+ ++YYCURSOR;
+ if ((yych = *YYCURSOR) == '{') goto yy78;
+yy3:
+#line 99 "_expander.re"
+ {RET(5);}
+#line 116 "_expander.cc"
+yy4:
+ yych = *++YYCURSOR;
+ if (yych == '}') goto yy75;
+ goto yy3;
+yy5:
+ yych = *++YYCURSOR;
+ if (yych == '[') goto yy73;
+ goto yy3;
+yy6:
+ yych = *++YYCURSOR;
+ if (yych == ']') goto yy73;
+ goto yy3;
+yy7:
+ ++YYCURSOR;
+#line 88 "_expander.re"
+ {RET(6);}
+#line 133 "_expander.cc"
+yy9:
+ yych = *(YYMARKER = ++YYCURSOR);
+ if (yych <= 'M') {
+ if (yych <= 'G') {
+ if (yych == '!') goto yy13;
+ if (yych <= 'F') goto yy3;
+ goto yy15;
+ } else {
+ if (yych == 'I') goto yy17;
+ if (yych <= 'L') goto yy3;
+ goto yy16;
+ }
+ } else {
+ if (yych <= 'h') {
+ if (yych <= 'N') goto yy18;
+ if (yych == 'g') goto yy15;
+ goto yy3;
+ } else {
+ if (yych <= 'l') {
+ if (yych <= 'i') goto yy17;
+ goto yy3;
+ } else {
+ if (yych <= 'm') goto yy16;
+ if (yych <= 'n') goto yy18;
+ goto yy3;
+ }
+ }
+ }
+yy10:
+ ++YYCURSOR;
+#line 98 "_expander.re"
+ {RET(0);}
+#line 166 "_expander.cc"
+yy12:
+ yych = *++YYCURSOR;
+ goto yy3;
+yy13:
+ yych = *++YYCURSOR;
+ if (yych == '-') goto yy60;
+yy14:
+ YYCURSOR = YYMARKER;
+ goto yy3;
+yy15:
+ yych = *++YYCURSOR;
+ if (yych == 'A') goto yy51;
+ if (yych == 'a') goto yy51;
+ goto yy14;
+yy16:
+ yych = *++YYCURSOR;
+ if (yych == 'A') goto yy45;
+ if (yych == 'a') goto yy45;
+ goto yy14;
+yy17:
+ yych = *++YYCURSOR;
+ if (yych == 'M') goto yy35;
+ if (yych == 'm') goto yy35;
+ goto yy14;
+yy18:
+ yych = *++YYCURSOR;
+ if (yych == 'O') goto yy19;
+ if (yych != 'o') goto yy14;
+yy19:
+ yych = *++YYCURSOR;
+ if (yych <= 'W') {
+ if (yych == 'I') goto yy21;
+ if (yych <= 'V') goto yy14;
+ } else {
+ if (yych <= 'i') {
+ if (yych <= 'h') goto yy14;
+ goto yy21;
+ } else {
+ if (yych != 'w') goto yy14;
+ }
+ }
+ yych = *++YYCURSOR;
+ if (yych == 'I') goto yy30;
+ if (yych == 'i') goto yy30;
+ goto yy14;
+yy21:
+ yych = *++YYCURSOR;
+ if (yych == 'N') goto yy22;
+ if (yych != 'n') goto yy14;
+yy22:
+ yych = *++YYCURSOR;
+ if (yych == 'C') goto yy23;
+ if (yych != 'c') goto yy14;
+yy23:
+ yych = *++YYCURSOR;
+ if (yych == 'L') goto yy24;
+ if (yych != 'l') goto yy14;
+yy24:
+ yych = *++YYCURSOR;
+ if (yych == 'U') goto yy25;
+ if (yych != 'u') goto yy14;
+yy25:
+ yych = *++YYCURSOR;
+ if (yych == 'D') goto yy26;
+ if (yych != 'd') goto yy14;
+yy26:
+ yych = *++YYCURSOR;
+ if (yych == 'E') goto yy27;
+ if (yych != 'e') goto yy14;
+yy27:
+ yych = *++YYCURSOR;
+ if (yych != '>') goto yy14;
+ ++YYCURSOR;
+#line 90 "_expander.re"
+ {goto noinclude;}
+#line 242 "_expander.cc"
+yy30:
+ yych = *++YYCURSOR;
+ if (yych == 'K') goto yy31;
+ if (yych != 'k') goto yy14;
+yy31:
+ yych = *++YYCURSOR;
+ if (yych == 'I') goto yy32;
+ if (yych != 'i') goto yy14;
+yy32:
+ yych = *++YYCURSOR;
+ if (yych != '>') goto yy14;
+ ++YYCURSOR;
+#line 91 "_expander.re"
+ {goto nowiki;}
+#line 257 "_expander.cc"
+yy35:
+ yych = *++YYCURSOR;
+ if (yych == 'A') goto yy36;
+ if (yych != 'a') goto yy14;
+yy36:
+ yych = *++YYCURSOR;
+ if (yych == 'G') goto yy37;
+ if (yych != 'g') goto yy14;
+yy37:
+ yych = *++YYCURSOR;
+ if (yych == 'E') goto yy38;
+ if (yych != 'e') goto yy14;
+yy38:
+ yych = *++YYCURSOR;
+ if (yych == 'M') goto yy39;
+ if (yych != 'm') goto yy14;
+yy39:
+ yych = *++YYCURSOR;
+ if (yych == 'A') goto yy40;
+ if (yych != 'a') goto yy14;
+yy40:
+ yych = *++YYCURSOR;
+ if (yych == 'P') goto yy41;
+ if (yych != 'p') goto yy14;
+yy41:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych <= '<') {
+ if (yych <= 0x0000) goto yy14;
+ if (yych <= ';') goto yy41;
+ goto yy14;
+ } else {
+ if (yych != '>') goto yy41;
+ }
+ ++YYCURSOR;
+#line 92 "_expander.re"
+ {goto imagemap;}
+#line 295 "_expander.cc"
+yy45:
+ yych = *++YYCURSOR;
+ if (yych == 'T') goto yy46;
+ if (yych != 't') goto yy14;
+yy46:
+ yych = *++YYCURSOR;
+ if (yych == 'H') goto yy47;
+ if (yych != 'h') goto yy14;
+yy47:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych <= '<') {
+ if (yych <= 0x0000) goto yy14;
+ if (yych <= ';') goto yy47;
+ goto yy14;
+ } else {
+ if (yych != '>') goto yy47;
+ }
+ ++YYCURSOR;
+#line 93 "_expander.re"
+ {goto math;}
+#line 317 "_expander.cc"
+yy51:
+ yych = *++YYCURSOR;
+ if (yych == 'L') goto yy52;
+ if (yych != 'l') goto yy14;
+yy52:
+ yych = *++YYCURSOR;
+ if (yych == 'L') goto yy53;
+ if (yych != 'l') goto yy14;
+yy53:
+ yych = *++YYCURSOR;
+ if (yych == 'E') goto yy54;
+ if (yych != 'e') goto yy14;
+yy54:
+ yych = *++YYCURSOR;
+ if (yych == 'R') goto yy55;
+ if (yych != 'r') goto yy14;
+yy55:
+ yych = *++YYCURSOR;
+ if (yych == 'Y') goto yy56;
+ if (yych != 'y') goto yy14;
+yy56:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych <= '<') {
+ if (yych <= 0x0000) goto yy14;
+ if (yych <= ';') goto yy56;
+ goto yy14;
+ } else {
+ if (yych != '>') goto yy56;
+ }
+ ++YYCURSOR;
+#line 94 "_expander.re"
+ {goto gallery;}
+#line 351 "_expander.cc"
+yy60:
+ yych = *++YYCURSOR;
+ if (yych != '-') goto yy14;
+ yych = *++YYCURSOR;
+ if (yych != '[') goto yy14;
+ yych = *++YYCURSOR;
+ if (yych != '^') goto yy14;
+ yych = *++YYCURSOR;
+ if (yych >= 0x0001) goto yy14;
+ yych = *++YYCURSOR;
+ if (yych != '<') goto yy14;
+ yych = *++YYCURSOR;
+ if (yych != '>') goto yy14;
+ yych = *++YYCURSOR;
+ if (yych != ']') goto yy14;
+ yych = *++YYCURSOR;
+ if (yych != '*') goto yy14;
+ yych = *++YYCURSOR;
+ if (yych != '-') goto yy14;
+ yych = *++YYCURSOR;
+ if (yych != '-') goto yy14;
+ yych = *++YYCURSOR;
+ if (yych != '>') goto yy14;
+ ++YYCURSOR;
+#line 96 "_expander.re"
+ {RET(5);}
+#line 378 "_expander.cc"
+yy73:
+ ++YYCURSOR;
+#line 87 "_expander.re"
+ {RET(3);}
+#line 383 "_expander.cc"
+yy75:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych == '}') goto yy75;
+#line 86 "_expander.re"
+ {RET(2);}
+#line 390 "_expander.cc"
+yy78:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych == '{') goto yy78;
+#line 85 "_expander.re"
+ {RET(1);}
+#line 397 "_expander.cc"
+}
+#line 101 "_expander.re"
+
+
+
+
+noinclude:
+
+#line 406 "_expander.cc"
+{
+ YYCTYPE yych;
+ yych = *YYCURSOR;
+ if (yych <= 0x0000) goto yy86;
+ if (yych != '<') goto yy85;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if (yych == '/') goto yy88;
+yy84:
+#line 108 "_expander.re"
+ {goto noinclude;}
+#line 417 "_expander.cc"
+yy85:
+ yych = *++YYCURSOR;
+ goto yy84;
+yy86:
+ ++YYCURSOR;
+#line 109 "_expander.re"
+ {cursor=start+11; RET(5);}
+#line 425 "_expander.cc"
+yy88:
+ yych = *++YYCURSOR;
+ if (yych == 'N') goto yy90;
+ if (yych == 'n') goto yy90;
+yy89:
+ YYCURSOR = YYMARKER;
+ goto yy84;
+yy90:
+ yych = *++YYCURSOR;
+ if (yych == 'O') goto yy91;
+ if (yych != 'o') goto yy89;
+yy91:
+ yych = *++YYCURSOR;
+ if (yych == 'I') goto yy92;
+ if (yych != 'i') goto yy89;
+yy92:
+ yych = *++YYCURSOR;
+ if (yych == 'N') goto yy93;
+ if (yych != 'n') goto yy89;
+yy93:
+ yych = *++YYCURSOR;
+ if (yych == 'C') goto yy94;
+ if (yych != 'c') goto yy89;
+yy94:
+ yych = *++YYCURSOR;
+ if (yych == 'L') goto yy95;
+ if (yych != 'l') goto yy89;
+yy95:
+ yych = *++YYCURSOR;
+ if (yych == 'U') goto yy96;
+ if (yych != 'u') goto yy89;
+yy96:
+ yych = *++YYCURSOR;
+ if (yych == 'D') goto yy97;
+ if (yych != 'd') goto yy89;
+yy97:
+ yych = *++YYCURSOR;
+ if (yych == 'E') goto yy98;
+ if (yych != 'e') goto yy89;
+yy98:
+ yych = *++YYCURSOR;
+ if (yych != '>') goto yy89;
+ ++YYCURSOR;
+#line 107 "_expander.re"
+ {goto std;}
+#line 471 "_expander.cc"
+}
+#line 110 "_expander.re"
+
+
+nowiki:
+
+#line 478 "_expander.cc"
+{
+ YYCTYPE yych;
+ yych = *YYCURSOR;
+ if (yych <= 0x0000) goto yy106;
+ if (yych != '<') goto yy105;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if (yych == '/') goto yy108;
+yy104:
+#line 115 "_expander.re"
+ {goto nowiki;}
+#line 489 "_expander.cc"
+yy105:
+ yych = *++YYCURSOR;
+ goto yy104;
+yy106:
+ ++YYCURSOR;
+#line 116 "_expander.re"
+ {RET(0);}
+#line 497 "_expander.cc"
+yy108:
+ yych = *++YYCURSOR;
+ if (yych == 'N') goto yy110;
+ if (yych == 'n') goto yy110;
+yy109:
+ YYCURSOR = YYMARKER;
+ goto yy104;
+yy110:
+ yych = *++YYCURSOR;
+ if (yych == 'O') goto yy111;
+ if (yych != 'o') goto yy109;
+yy111:
+ yych = *++YYCURSOR;
+ if (yych == 'W') goto yy112;
+ if (yych != 'w') goto yy109;
+yy112:
+ yych = *++YYCURSOR;
+ if (yych == 'I') goto yy113;
+ if (yych != 'i') goto yy109;
+yy113:
+ yych = *++YYCURSOR;
+ if (yych == 'K') goto yy114;
+ if (yych != 'k') goto yy109;
+yy114:
+ yych = *++YYCURSOR;
+ if (yych == 'I') goto yy115;
+ if (yych != 'i') goto yy109;
+yy115:
+ yych = *++YYCURSOR;
+ if (yych != '>') goto yy109;
+ ++YYCURSOR;
+#line 114 "_expander.re"
+ {RET(5);}
+#line 531 "_expander.cc"
+}
+#line 117 "_expander.re"
+
+
+math:
+
+#line 538 "_expander.cc"
+{
+ YYCTYPE yych;
+ yych = *YYCURSOR;
+ if (yych <= 0x0000) goto yy123;
+ if (yych != '<') goto yy122;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if (yych == '/') goto yy125;
+yy121:
+#line 122 "_expander.re"
+ {goto math;}
+#line 549 "_expander.cc"
+yy122:
+ yych = *++YYCURSOR;
+ goto yy121;
+yy123:
+ ++YYCURSOR;
+#line 123 "_expander.re"
+ {RET(0);}
+#line 557 "_expander.cc"
+yy125:
+ yych = *++YYCURSOR;
+ if (yych == 'M') goto yy127;
+ if (yych == 'm') goto yy127;
+yy126:
+ YYCURSOR = YYMARKER;
+ goto yy121;
+yy127:
+ yych = *++YYCURSOR;
+ if (yych == 'A') goto yy128;
+ if (yych != 'a') goto yy126;
+yy128:
+ yych = *++YYCURSOR;
+ if (yych == 'T') goto yy129;
+ if (yych != 't') goto yy126;
+yy129:
+ yych = *++YYCURSOR;
+ if (yych == 'H') goto yy130;
+ if (yych != 'h') goto yy126;
+yy130:
+ yych = *++YYCURSOR;
+ if (yych != '>') goto yy126;
+ ++YYCURSOR;
+#line 121 "_expander.re"
+ {RET(5);}
+#line 583 "_expander.cc"
+}
+#line 124 "_expander.re"
+
+
+gallery:
+
+#line 590 "_expander.cc"
+{
+ YYCTYPE yych;
+ yych = *YYCURSOR;
+ if (yych <= 0x0000) goto yy138;
+ if (yych != '<') goto yy137;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if (yych == '/') goto yy140;
+yy136:
+#line 129 "_expander.re"
+ {goto gallery;}
+#line 601 "_expander.cc"
+yy137:
+ yych = *++YYCURSOR;
+ goto yy136;
+yy138:
+ ++YYCURSOR;
+#line 130 "_expander.re"
+ {RET(0);}
+#line 609 "_expander.cc"
+yy140:
+ yych = *++YYCURSOR;
+ if (yych == 'G') goto yy142;
+ if (yych == 'g') goto yy142;
+yy141:
+ YYCURSOR = YYMARKER;
+ goto yy136;
+yy142:
+ yych = *++YYCURSOR;
+ if (yych == 'A') goto yy143;
+ if (yych != 'a') goto yy141;
+yy143:
+ yych = *++YYCURSOR;
+ if (yych == 'L') goto yy144;
+ if (yych != 'l') goto yy141;
+yy144:
+ yych = *++YYCURSOR;
+ if (yych == 'L') goto yy145;
+ if (yych != 'l') goto yy141;
+yy145:
+ yych = *++YYCURSOR;
+ if (yych == 'E') goto yy146;
+ if (yych != 'e') goto yy141;
+yy146:
+ yych = *++YYCURSOR;
+ if (yych == 'R') goto yy147;
+ if (yych != 'r') goto yy141;
+yy147:
+ yych = *++YYCURSOR;
+ if (yych == 'Y') goto yy148;
+ if (yych != 'y') goto yy141;
+yy148:
+ yych = *++YYCURSOR;
+ if (yych != '>') goto yy141;
+ ++YYCURSOR;
+#line 128 "_expander.re"
+ {RET(5);}
+#line 647 "_expander.cc"
+}
+#line 131 "_expander.re"
+
+
+imagemap:
+
+#line 654 "_expander.cc"
+{
+ YYCTYPE yych;
+ yych = *YYCURSOR;
+ if (yych <= 0x0000) goto yy156;
+ if (yych != '<') goto yy155;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if (yych == '/') goto yy158;
+yy154:
+#line 136 "_expander.re"
+ {goto imagemap;}
+#line 665 "_expander.cc"
+yy155:
+ yych = *++YYCURSOR;
+ goto yy154;
+yy156:
+ ++YYCURSOR;
+#line 137 "_expander.re"
+ {RET(0);}
+#line 673 "_expander.cc"
+yy158:
+ yych = *++YYCURSOR;
+ if (yych == 'I') goto yy160;
+ if (yych == 'i') goto yy160;
+yy159:
+ YYCURSOR = YYMARKER;
+ goto yy154;
+yy160:
+ yych = *++YYCURSOR;
+ if (yych == 'M') goto yy161;
+ if (yych != 'm') goto yy159;
+yy161:
+ yych = *++YYCURSOR;
+ if (yych == 'A') goto yy162;
+ if (yych != 'a') goto yy159;
+yy162:
+ yych = *++YYCURSOR;
+ if (yych == 'G') goto yy163;
+ if (yych != 'g') goto yy159;
+yy163:
+ yych = *++YYCURSOR;
+ if (yych == 'E') goto yy164;
+ if (yych != 'e') goto yy159;
+yy164:
+ yych = *++YYCURSOR;
+ if (yych == 'M') goto yy165;
+ if (yych != 'm') goto yy159;
+yy165:
+ yych = *++YYCURSOR;
+ if (yych == 'A') goto yy166;
+ if (yych != 'a') goto yy159;
+yy166:
+ yych = *++YYCURSOR;
+ if (yych == 'P') goto yy167;
+ if (yych != 'p') goto yy159;
+yy167:
+ yych = *++YYCURSOR;
+ if (yych != '>') goto yy159;
+ ++YYCURSOR;
+#line 135 "_expander.re"
+ {RET(5);}
+#line 715 "_expander.cc"
+}
+#line 138 "_expander.re"
+
+
+pre:
+
+#line 722 "_expander.cc"
+{
+ YYCTYPE yych;
+ yych = *YYCURSOR;
+ if (yych <= 0x0000) goto yy175;
+ if (yych != '<') goto yy174;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if (yych == '/') goto yy177;
+yy173:
+#line 143 "_expander.re"
+ {goto pre;}
+#line 733 "_expander.cc"
+yy174:
+ yych = *++YYCURSOR;
+ goto yy173;
+yy175:
+ ++YYCURSOR;
+#line 144 "_expander.re"
+ {RET(0);}
+#line 741 "_expander.cc"
+yy177:
+ yych = *++YYCURSOR;
+ if (yych == 'P') goto yy179;
+ if (yych == 'p') goto yy179;
+yy178:
+ YYCURSOR = YYMARKER;
+ goto yy173;
+yy179:
+ yych = *++YYCURSOR;
+ if (yych == 'R') goto yy180;
+ if (yych != 'r') goto yy178;
+yy180:
+ yych = *++YYCURSOR;
+ if (yych == 'E') goto yy181;
+ if (yych != 'e') goto yy178;
+yy181:
+ yych = *++YYCURSOR;
+ if (yych != '>') goto yy178;
+ ++YYCURSOR;
+#line 142 "_expander.re"
+ {RET(5);}
+#line 763 "_expander.cc"
+}
+#line 145 "_expander.re"
+
+
+}
+
+
+PyObject *py_scan(PyObject *self, PyObject *args)
+{
+ PyObject *arg1;
+ if (!PyArg_ParseTuple(args, "O:_expander.scan", &arg1)) {
+ return 0;
+ }
+ PyUnicodeObject *unistr = (PyUnicodeObject*)PyUnicode_FromObject(arg1);
+ if (unistr == NULL) {
+ PyErr_SetString(PyExc_TypeError,
+ "parameter cannot be converted to unicode in _expander.scan");
+ return 0;
+ }
+
+ Py_UNICODE *start = unistr->str;
+ Py_UNICODE *end = start+unistr->length;
+
+
+ MacroScanner scanner (start, end);
+ Py_BEGIN_ALLOW_THREADS
+ while (scanner.scan()) {
+ }
+ Py_END_ALLOW_THREADS
+ Py_XDECREF(unistr);
+
+ // return PyList_New(0); // uncomment to see timings for scanning
+
+ int size = scanner.tokens.size();
+ PyObject *result = PyList_New(size);
+ if (!result) {
+ return 0;
+ }
+
+ for (int i=0; i<size; i++) {
+ Token t = scanner.tokens[i];
+ PyList_SET_ITEM(result, i, Py_BuildValue("iii", t.type, t.start, t.len));
+ }
+
+ return result;
+}
+
+
+
+static PyMethodDef module_functions[] = {
+ {"scan", (PyCFunction)py_scan, METH_VARARGS, "scan(text)"},
+ {0, 0},
+};
+
+
+
+extern "C" {
+ DL_EXPORT(void) init_expander();
+}
+
+DL_EXPORT(void) init_expander()
+{
+ /*PyObject *m =*/ Py_InitModule("_expander", module_functions);
+}
diff --git a/mwlib/_expander.re b/mwlib/_expander.re
new file mode 100644
index 0000000..7abb2ac
--- /dev/null
+++ b/mwlib/_expander.re
@@ -0,0 +1,206 @@
+// -*- mode: c++ -*-
+// Copyright (c) 2007-2008 PediaPress GmbH
+// See README.txt for additional licensing information.
+
+#include <Python.h>
+
+#include <iostream>
+#include <assert.h>
+#include <vector>
+
+using namespace std;
+
+#define RET(x) {found(x); return x;}
+
+struct Token
+{
+ int type;
+ int start;
+ int len;
+};
+
+
+class MacroScanner
+{
+public:
+
+ MacroScanner(Py_UNICODE *_start, Py_UNICODE *_end) {
+ source = start = _start;
+ end = _end;
+ cursor = start;
+ }
+
+ int found(int val) {
+ if (val==5 && tokens.size()) {
+ Token &previous_token (tokens[tokens.size()-1]);
+ if (previous_token.type==val) {
+ previous_token.len += cursor-start;
+ return tokens.size()-1;
+ }
+ }
+ Token t;
+ t.type = val;
+ t.start = (start-source);
+ t.len = cursor-start;
+ tokens.push_back(t);
+ return tokens.size()-1;
+ }
+
+ inline int scan();
+
+ Py_UNICODE *source;
+
+ Py_UNICODE *start;
+ Py_UNICODE *cursor;
+ Py_UNICODE *end;
+ vector<Token> tokens;
+};
+
+
+int MacroScanner::scan()
+{
+
+std:
+
+ start=cursor;
+
+ Py_UNICODE *marker=cursor;
+
+ Py_UNICODE *save_cursor = cursor;
+
+
+#define YYCTYPE Py_UNICODE
+#define YYCURSOR cursor
+#define YYMARKER marker
+#define YYLIMIT (end)
+// #define YYFILL(n) return 0;
+
+/*!re2c
+re2c:yyfill:enable = 0 ;
+*/
+
+
+
+/*!re2c
+ "{"{2,} {RET(1);}
+ "}"{2,} {RET(2);}
+ "[[" | "]]" {RET(3);}
+ "|" {RET(6);}
+
+ '<noinclude>' {goto noinclude;}
+ '<nowiki>' {goto nowiki;}
+ '<imagemap' [^<>\000]* '>' {goto imagemap;}
+ '<math' [^<>\000]* '>' {goto math;}
+ '<gallery' [^<>\000]* '>' {goto gallery;}
+
+ "<!--[^\000<>]*-->" {RET(5);}
+
+ "\000" {RET(0);}
+ [^\000] {RET(5);}
+
+ */
+
+
+
+noinclude:
+/*!re2c
+ '</noinclude>' {goto std;}
+ [^\000] {goto noinclude;}
+ "\000" {cursor=start+11; RET(5);}
+ */
+
+nowiki:
+/*!re2c
+ '</nowiki>' {RET(5);}
+ [^\000] {goto nowiki;}
+ "\000" {RET(0);}
+ */
+
+math:
+/*!re2c
+ '</math>' {RET(5);}
+ [^\000] {goto math;}
+ "\000" {RET(0);}
+ */
+
+gallery:
+/*!re2c
+ '</gallery>' {RET(5);}
+ [^\000] {goto gallery;}
+ "\000" {RET(0);}
+ */
+
+imagemap:
+/*!re2c
+ '</imagemap>' {RET(5);}
+ [^\000] {goto imagemap;}
+ "\000" {RET(0);}
+ */
+
+pre:
+/*!re2c
+ '</pre>' {RET(5);}
+ [^\000] {goto pre;}
+ "\000" {RET(0);}
+ */
+
+}
+
+
+PyObject *py_scan(PyObject *self, PyObject *args)
+{
+ PyObject *arg1;
+ if (!PyArg_ParseTuple(args, "O:_expander.scan", &arg1)) {
+ return 0;
+ }
+ PyUnicodeObject *unistr = (PyUnicodeObject*)PyUnicode_FromObject(arg1);
+ if (unistr == NULL) {
+ PyErr_SetString(PyExc_TypeError,
+ "parameter cannot be converted to unicode in _expander.scan");
+ return 0;
+ }
+
+ Py_UNICODE *start = unistr->str;
+ Py_UNICODE *end = start+unistr->length;
+
+
+ MacroScanner scanner (start, end);
+ Py_BEGIN_ALLOW_THREADS
+ while (scanner.scan()) {
+ }
+ Py_END_ALLOW_THREADS
+ Py_XDECREF(unistr);
+
+ // return PyList_New(0); // uncomment to see timings for scanning
+
+ int size = scanner.tokens.size();
+ PyObject *result = PyList_New(size);
+ if (!result) {
+ return 0;
+ }
+
+ for (int i=0; i<size; i++) {
+ Token t = scanner.tokens[i];
+ PyList_SET_ITEM(result, i, Py_BuildValue("iii", t.type, t.start, t.len));
+ }
+
+ return result;
+}
+
+
+
+static PyMethodDef module_functions[] = {
+ {"scan", (PyCFunction)py_scan, METH_VARARGS, "scan(text)"},
+ {0, 0},
+};
+
+
+
+extern "C" {
+ DL_EXPORT(void) init_expander();
+}
+
+DL_EXPORT(void) init_expander()
+{
+ /*PyObject *m =*/ Py_InitModule("_expander", module_functions);
+}
diff --git a/mwlib/_mwscan.cc b/mwlib/_mwscan.cc
new file mode 100644
index 0000000..f673880
--- /dev/null
+++ b/mwlib/_mwscan.cc
@@ -0,0 +1,1699 @@
+/* Generated by re2c 0.13.4 */
+#line 1 "_mwscan.re"
+// -*- mode: c++ -*-
+// Copyright (c) 2007-2008 PediaPress GmbH
+// See README.txt for additional licensing information.
+
+#include <Python.h>
+
+#include <iostream>
+#include <assert.h>
+#include <vector>
+using namespace std;
+
+#define RET(x) {found(x); return x;}
+
+typedef enum {
+ t_end,
+ t_text,
+ t_entity,
+ t_special,
+ t_magicword,
+ t_comment,
+ t_2box_open, // [[
+ t_2box_close, // ]]
+ t_http_url,
+ t_break,
+ t_begin_table,
+ t_end_table,
+ t_html_tag,
+ t_style,
+ t_pre,
+ t_section,
+ t_section_end,
+ t_item,
+ t_colon,
+ t_semicolon,
+ t_hrule,
+ t_newline,
+ t_column,
+ t_row,
+ t_tablecaption,
+ t_urllink,
+} mwtok;
+
+struct Token
+{
+ int type;
+ int start;
+ int len;
+};
+
+class Scanner
+{
+public:
+
+ Scanner(Py_UNICODE *_start, Py_UNICODE *_end) {
+ source = start = _start;
+ end = _end;
+ cursor = start;
+ line_startswith_section = -1;
+ tablemode=0;
+ }
+
+ int found(mwtok val) {
+ if (val==t_text && tokens.size()) {
+ Token &previous_token (tokens[tokens.size()-1]);
+ if (previous_token.type==val) {
+ previous_token.len += cursor-start;
+ return tokens.size()-1;
+ }
+ }
+ Token t;
+ t.type = val;
+ t.start = (start-source);
+ t.len = cursor-start;
+ tokens.push_back(t);
+ return tokens.size()-1;
+ }
+
+ bool bol() const {
+ return (start==source) || (start[-1]=='\n');
+ }
+
+ bool eol() const {
+ return *cursor=='\n' || *cursor==0;
+ }
+
+ void newline() {
+ if (line_startswith_section>=0) {
+ tokens[line_startswith_section].type = t_text;
+ }
+ line_startswith_section = -1;
+ }
+
+ inline int scan();
+
+ Py_UNICODE *source;
+
+ Py_UNICODE *start;
+ Py_UNICODE *cursor;
+ Py_UNICODE *end;
+ vector<Token> tokens;
+
+ int line_startswith_section;
+ int tablemode;
+};
+
+
+int Scanner::scan()
+{
+ start=cursor;
+
+ Py_UNICODE *marker=cursor;
+
+ Py_UNICODE *save_cursor = cursor;
+
+
+#define YYCTYPE Py_UNICODE
+#define YYCURSOR cursor
+#define YYMARKER marker
+#define YYLIMIT (end)
+// #define YYFILL(n) return 0;
+
+#line 124 "_mwscan.re"
+
+
+/*
+ the re2c manpage says:
+ "The user must arrange for a sentinel token to appear at the end of input"
+ \000 is our sentinel token.
+*/
+
+#line 157 "_mwscan.re"
+
+ if (!bol()) {
+ goto not_bol;
+ }
+
+#line 140 "_mwscan.cc"
+{
+ YYCTYPE yych;
+ unsigned int yyaccept = 0;
+
+ yych = *YYCURSOR;
+ if (yych <= '-') {
+ if (yych <= '"') {
+ if (yych <= 0x001F) goto yy18;
+ if (yych <= ' ') goto yy2;
+ if (yych <= '!') goto yy8;
+ goto yy18;
+ } else {
+ if (yych <= ')') {
+ if (yych <= '#') goto yy13;
+ goto yy18;
+ } else {
+ if (yych <= '*') goto yy13;
+ if (yych <= ',') goto yy18;
+ goto yy17;
+ }
+ }
+ } else {
+ if (yych <= '<') {
+ if (yych <= '9') goto yy18;
+ if (yych <= ':') goto yy11;
+ if (yych <= ';') goto yy15;
+ goto yy18;
+ } else {
+ if (yych <= 'z') {
+ if (yych <= '=') goto yy9;
+ goto yy18;
+ } else {
+ if (yych <= '{') goto yy4;
+ if (yych <= '|') goto yy6;
+ goto yy18;
+ }
+ }
+ }
+yy2:
+ yyaccept = 0;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if (yych <= 0x001F) goto yy3;
+ if (yych <= '!') goto yy47;
+ if (yych <= 'z') goto yy3;
+ if (yych <= '|') goto yy47;
+yy3:
+#line 199 "_mwscan.re"
+ {RET(t_pre);}
+#line 189 "_mwscan.cc"
+yy4:
+ ++YYCURSOR;
+ if ((yych = *YYCURSOR) == '|') goto yy43;
+yy5:
+#line 209 "_mwscan.re"
+ {goto not_bol;}
+#line 196 "_mwscan.cc"
+yy6:
+ ++YYCURSOR;
+ if ((yych = *YYCURSOR) <= ',') {
+ if (yych == '+') goto yy35;
+ } else {
+ if (yych <= '-') goto yy38;
+ if (yych == '}') goto yy41;
+ }
+yy7:
+#line 177 "_mwscan.re"
+ {
+ if (tablemode)
+ RET(t_column);
+
+ if (*start==' ') {
+ cursor = start+1;
+ RET(t_pre);
+ }
+ RET(t_text);
+ }
+#line 217 "_mwscan.cc"
+yy8:
+ yych = *++YYCURSOR;
+ goto yy7;
+yy9:
+ ++YYCURSOR;
+ if ((yych = *YYCURSOR) == '=') goto yy33;
+ goto yy32;
+yy10:
+#line 200 "_mwscan.re"
+ {
+ line_startswith_section = found(t_section);
+ return t_section;
+ }
+#line 231 "_mwscan.cc"
+yy11:
+ ++YYCURSOR;
+ if ((yych = *YYCURSOR) <= ')') {
+ if (yych == '#') goto yy27;
+ } else {
+ if (yych <= '*') goto yy27;
+ if (yych == ':') goto yy29;
+ }
+yy12:
+#line 205 "_mwscan.re"
+ {RET(t_colon);}
+#line 243 "_mwscan.cc"
+yy13:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ goto yy28;
+yy14:
+#line 204 "_mwscan.re"
+ {RET(t_item);}
+#line 251 "_mwscan.cc"
+yy15:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ goto yy26;
+yy16:
+#line 206 "_mwscan.re"
+ {RET(t_semicolon);}
+#line 259 "_mwscan.cc"
+yy17:
+ yyaccept = 1;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if (yych == '-') goto yy19;
+ goto yy5;
+yy18:
+ yych = *++YYCURSOR;
+ goto yy5;
+yy19:
+ yych = *++YYCURSOR;
+ if (yych == '-') goto yy21;
+yy20:
+ YYCURSOR = YYMARKER;
+ if (yyaccept <= 0) {
+ goto yy3;
+ } else {
+ goto yy5;
+ }
+yy21:
+ yych = *++YYCURSOR;
+ if (yych != '-') goto yy20;
+yy22:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych == '-') goto yy22;
+#line 207 "_mwscan.re"
+ {RET(t_hrule);}
+#line 287 "_mwscan.cc"
+yy25:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+yy26:
+ if (yych == ';') goto yy25;
+ goto yy16;
+yy27:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+yy28:
+ if (yych == '#') goto yy27;
+ if (yych == '*') goto yy27;
+ goto yy14;
+yy29:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych <= ')') {
+ if (yych == '#') goto yy27;
+ goto yy12;
+ } else {
+ if (yych <= '*') goto yy27;
+ if (yych == ':') goto yy29;
+ goto yy12;
+ }
+yy31:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+yy32:
+ if (yych == '\t') goto yy31;
+ if (yych == ' ') goto yy31;
+ goto yy10;
+yy33:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych <= 0x001F) {
+ if (yych == '\t') goto yy31;
+ goto yy10;
+ } else {
+ if (yych <= ' ') goto yy31;
+ if (yych == '=') goto yy33;
+ goto yy10;
+ }
+yy35:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych == '+') goto yy35;
+#line 189 "_mwscan.re"
+ {
+ if (tablemode)
+ RET(t_tablecaption);
+ if (*start==' ') {
+ cursor = start+1;
+ RET(t_pre);
+ }
+ RET(t_text);
+ }
+#line 344 "_mwscan.cc"
+yy38:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych == '-') goto yy38;
+#line 166 "_mwscan.re"
+ {
+ if (tablemode)
+ RET(t_row);
+ if (*start==' ') {
+ cursor = start+1;
+ RET(t_pre);
+ }
+ RET(t_text);
+ }
+#line 359 "_mwscan.cc"
+yy41:
+ ++YYCURSOR;
+#line 163 "_mwscan.re"
+ {--tablemode; RET(t_end_table);}
+#line 364 "_mwscan.cc"
+yy43:
+ ++YYCURSOR;
+#line 162 "_mwscan.re"
+ {++tablemode; RET(t_begin_table);}
+#line 369 "_mwscan.cc"
+yy45:
+ yych = *++YYCURSOR;
+ if (yych <= ',') {
+ if (yych == '+') goto yy35;
+ goto yy7;
+ } else {
+ if (yych <= '-') goto yy38;
+ if (yych == '}') goto yy41;
+ goto yy7;
+ }
+yy46:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+yy47:
+ if (yych <= '!') {
+ if (yych <= 0x001F) goto yy20;
+ if (yych <= ' ') goto yy46;
+ } else {
+ if (yych <= 'z') goto yy20;
+ if (yych <= '{') goto yy49;
+ if (yych <= '|') goto yy45;
+ goto yy20;
+ }
+ yych = *++YYCURSOR;
+ goto yy7;
+yy49:
+ ++YYCURSOR;
+ if ((yych = *YYCURSOR) == '|') goto yy43;
+ goto yy20;
+}
+#line 210 "_mwscan.re"
+
+
+
+not_bol:
+ cursor = save_cursor;
+ marker = cursor;
+
+
+#line 409 "_mwscan.cc"
+{
+ YYCTYPE yych;
+ unsigned int yyaccept = 0;
+ yych = *YYCURSOR;
+ if (yych <= 'Z') {
+ if (yych <= '\'') {
+ if (yych <= ' ') {
+ if (yych <= 0x0000) goto yy72;
+ if (yych == '\n') goto yy63;
+ goto yy74;
+ } else {
+ if (yych <= '!') goto yy66;
+ if (yych <= '%') goto yy74;
+ if (yych <= '&') goto yy71;
+ goto yy69;
+ }
+ } else {
+ if (yych <= ';') {
+ if (yych <= '/') goto yy74;
+ if (yych <= '9') goto yy59;
+ if (yych <= ':') goto yy68;
+ goto yy74;
+ } else {
+ if (yych <= '<') goto yy70;
+ if (yych <= '=') goto yy61;
+ if (yych <= '@') goto yy74;
+ goto yy59;
+ }
+ }
+ } else {
+ if (yych <= 'f') {
+ if (yych <= '^') {
+ if (yych <= '[') goto yy52;
+ if (yych == ']') goto yy60;
+ goto yy74;
+ } else {
+ if (yych <= '_') goto yy58;
+ if (yych <= '`') goto yy74;
+ if (yych <= 'e') goto yy59;
+ goto yy56;
+ }
+ } else {
+ if (yych <= 'm') {
+ if (yych == 'h') goto yy57;
+ if (yych <= 'l') goto yy59;
+ goto yy54;
+ } else {
+ if (yych <= 'z') goto yy59;
+ if (yych == '|') goto yy65;
+ goto yy74;
+ }
+ }
+ }
+yy52:
+ yyaccept = 0;
+ yych = *(YYMARKER = ++YYCURSOR);
+ switch (yych) {
+ case '[': goto yy249;
+ case 'f': goto yy252;
+ case 'h': goto yy251;
+ case 'm': goto yy253;
+ default: goto yy53;
+ }
+yy53:
+#line 256 "_mwscan.re"
+ {RET(t_special);}
+#line 476 "_mwscan.cc"
+yy54:
+ ++YYCURSOR;
+ if ((yych = *YYCURSOR) == 'a') goto yy237;
+ goto yy121;
+yy55:
+#line 225 "_mwscan.re"
+ {RET(t_text);}
+#line 484 "_mwscan.cc"
+yy56:
+ yych = *++YYCURSOR;
+ if (yych == 't') goto yy229;
+ goto yy121;
+yy57:
+ yych = *++YYCURSOR;
+ if (yych == 't') goto yy219;
+ goto yy121;
+yy58:
+ yych = *++YYCURSOR;
+ if (yych == '_') goto yy122;
+ goto yy121;
+yy59:
+ yych = *++YYCURSOR;
+ goto yy121;
+yy60:
+ yych = *++YYCURSOR;
+ if (yych == ']') goto yy118;
+ goto yy53;
+yy61:
+ ++YYCURSOR;
+ if ((yych = *YYCURSOR) == '=') goto yy116;
+ goto yy115;
+yy62:
+#line 228 "_mwscan.re"
+ {
+ if (eol()) {
+ if (line_startswith_section>=0) {
+ line_startswith_section=-1;
+ RET(t_section_end);
+ } else {
+ RET(t_text);
+ }
+ } else {
+ RET(t_text);
+ }
+ }
+#line 522 "_mwscan.cc"
+yy63:
+ ++YYCURSOR;
+ if ((yych = *YYCURSOR) == '\n') goto yy111;
+#line 241 "_mwscan.re"
+ {newline(); RET(t_newline);}
+#line 528 "_mwscan.cc"
+yy65:
+ yych = *++YYCURSOR;
+ if (yych <= '*') {
+ if (yych == '!') goto yy107;
+ goto yy53;
+ } else {
+ if (yych <= '+') goto yy109;
+ if (yych == '|') goto yy107;
+ goto yy53;
+ }
+yy66:
+ ++YYCURSOR;
+ if ((yych = *YYCURSOR) == '!') goto yy107;
+yy67:
+#line 266 "_mwscan.re"
+ {RET(t_text);}
+#line 545 "_mwscan.cc"
+yy68:
+ yych = *++YYCURSOR;
+ goto yy53;
+yy69:
+ yych = *++YYCURSOR;
+ if (yych == '\'') goto yy102;
+ goto yy67;
+yy70:
+ yyaccept = 1;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if (yych <= '/') {
+ if (yych == '!') goto yy86;
+ if (yych <= '.') goto yy67;
+ goto yy87;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@') goto yy67;
+ goto yy88;
+ } else {
+ if (yych <= '`') goto yy67;
+ if (yych <= 'z') goto yy88;
+ goto yy67;
+ }
+ }
+yy71:
+ yyaccept = 1;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if (yych <= '9') {
+ if (yych == '#') goto yy75;
+ if (yych <= '/') goto yy67;
+ goto yy77;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@') goto yy67;
+ goto yy77;
+ } else {
+ if (yych <= '`') goto yy67;
+ if (yych <= 'z') goto yy77;
+ goto yy67;
+ }
+ }
+yy72:
+ ++YYCURSOR;
+#line 265 "_mwscan.re"
+ {newline(); return t_end;}
+#line 591 "_mwscan.cc"
+yy74:
+ yych = *++YYCURSOR;
+ goto yy67;
+yy75:
+ yych = *++YYCURSOR;
+ if (yych <= 'W') {
+ if (yych <= '/') goto yy76;
+ if (yych <= '9') goto yy82;
+ } else {
+ if (yych <= 'X') goto yy81;
+ if (yych == 'x') goto yy81;
+ }
+yy76:
+ YYCURSOR = YYMARKER;
+ if (yyaccept <= 1) {
+ if (yyaccept <= 0) {
+ goto yy53;
+ } else {
+ goto yy67;
+ }
+ } else {
+ if (yyaccept <= 2) {
+ goto yy103;
+ } else {
+ goto yy55;
+ }
+ }
+yy77:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych <= ';') {
+ if (yych <= '/') goto yy76;
+ if (yych <= '9') goto yy77;
+ if (yych <= ':') goto yy76;
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '@') goto yy76;
+ goto yy77;
+ } else {
+ if (yych <= '`') goto yy76;
+ if (yych <= 'z') goto yy77;
+ goto yy76;
+ }
+ }
+yy79:
+ ++YYCURSOR;
+#line 263 "_mwscan.re"
+ {RET(t_entity);}
+#line 640 "_mwscan.cc"
+yy81:
+ yych = *++YYCURSOR;
+ if (yych == ';') goto yy76;
+ goto yy85;
+yy82:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych <= '/') goto yy76;
+ if (yych <= '9') goto yy82;
+ if (yych == ';') goto yy79;
+ goto yy76;
+yy84:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+yy85:
+ if (yych <= ';') {
+ if (yych <= '/') goto yy76;
+ if (yych <= '9') goto yy84;
+ if (yych <= ':') goto yy76;
+ goto yy79;
+ } else {
+ if (yych <= 'F') {
+ if (yych <= '@') goto yy76;
+ goto yy84;
+ } else {
+ if (yych <= '`') goto yy76;
+ if (yych <= 'f') goto yy84;
+ goto yy76;
+ }
+ }
+yy86:
+ yych = *++YYCURSOR;
+ if (yych == '-') goto yy94;
+ goto yy76;
+yy87:
+ yych = *++YYCURSOR;
+ if (yych <= '@') goto yy76;
+ if (yych <= 'Z') goto yy88;
+ if (yych <= '`') goto yy76;
+ if (yych >= '{') goto yy76;
+yy88:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych <= '>') {
+ if (yych <= ';') {
+ if (yych <= 0x0000) goto yy76;
+ } else {
+ if (yych <= '<') goto yy76;
+ if (yych >= '>') goto yy92;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych >= 'A') goto yy88;
+ } else {
+ if (yych <= '`') goto yy90;
+ if (yych <= 'z') goto yy88;
+ }
+ }
+yy90:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych <= '<') {
+ if (yych <= 0x0000) goto yy76;
+ if (yych <= ';') goto yy90;
+ goto yy76;
+ } else {
+ if (yych != '>') goto yy90;
+ }
+yy92:
+ ++YYCURSOR;
+#line 259 "_mwscan.re"
+ {RET(t_html_tag);}
+#line 713 "_mwscan.cc"
+yy94:
+ yych = *++YYCURSOR;
+ if (yych != '-') goto yy76;
+yy95:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych <= ';') {
+ if (yych <= 0x0000) goto yy76;
+ if (yych != '-') goto yy95;
+ } else {
+ if (yych == '=') goto yy95;
+ if (yych <= '>') goto yy76;
+ goto yy95;
+ }
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych <= ';') {
+ if (yych <= 0x0000) goto yy76;
+ if (yych != '-') goto yy95;
+ } else {
+ if (yych == '=') goto yy95;
+ if (yych <= '>') goto yy76;
+ goto yy95;
+ }
+yy98:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych <= ';') {
+ if (yych <= 0x0000) goto yy76;
+ if (yych == '-') goto yy98;
+ goto yy95;
+ } else {
+ if (yych <= '<') goto yy76;
+ if (yych != '>') goto yy95;
+ }
+ ++YYCURSOR;
+#line 262 "_mwscan.re"
+ {RET(t_comment);}
+#line 752 "_mwscan.cc"
+yy102:
+ ++YYCURSOR;
+ if ((yych = *YYCURSOR) == '\'') goto yy104;
+yy103:
+#line 257 "_mwscan.re"
+ {RET(t_style);}
+#line 759 "_mwscan.cc"
+yy104:
+ yyaccept = 2;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if (yych != '\'') goto yy103;
+ yych = *++YYCURSOR;
+ if (yych != '\'') goto yy76;
+ yych = *++YYCURSOR;
+ goto yy103;
+yy107:
+ ++YYCURSOR;
+#line 243 "_mwscan.re"
+ {
+ if (tablemode)
+ RET(t_column);
+ cursor = start+1;
+ RET(t_special);
+ }
+#line 777 "_mwscan.cc"
+yy109:
+ ++YYCURSOR;
+#line 250 "_mwscan.re"
+ {
+ if (tablemode)
+ RET(t_tablecaption);
+ cursor = start+1;
+ RET(t_special);
+ }
+#line 787 "_mwscan.cc"
+yy111:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych == '\n') goto yy111;
+#line 240 "_mwscan.re"
+ {newline(); RET(t_break);}
+#line 794 "_mwscan.cc"
+yy114:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+yy115:
+ if (yych == '\t') goto yy114;
+ if (yych == ' ') goto yy114;
+ goto yy62;
+yy116:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych <= 0x001F) {
+ if (yych == '\t') goto yy114;
+ goto yy62;
+ } else {
+ if (yych <= ' ') goto yy114;
+ if (yych == '=') goto yy116;
+ goto yy62;
+ }
+yy118:
+ ++YYCURSOR;
+#line 227 "_mwscan.re"
+ {RET(t_2box_close);}
+#line 817 "_mwscan.cc"
+yy120:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+yy121:
+ if (yych <= 'Z') {
+ if (yych <= '/') goto yy55;
+ if (yych <= '9') goto yy120;
+ if (yych <= '@') goto yy55;
+ goto yy120;
+ } else {
+ if (yych <= '_') {
+ if (yych <= '^') goto yy55;
+ goto yy120;
+ } else {
+ if (yych <= '`') goto yy55;
+ if (yych <= 'z') goto yy120;
+ goto yy55;
+ }
+ }
+yy122:
+ yych = *++YYCURSOR;
+ switch (yych) {
+ case 'E': goto yy126;
+ case 'F': goto yy125;
+ case 'N': goto yy124;
+ case 'S': goto yy127;
+ case 'T': goto yy123;
+ default: goto yy121;
+ }
+yy123:
+ yych = *++YYCURSOR;
+ if (yych == 'O') goto yy216;
+ goto yy121;
+yy124:
+ yych = *++YYCURSOR;
+ if (yych == 'E') goto yy146;
+ if (yych == 'O') goto yy147;
+ goto yy121;
+yy125:
+ yych = *++YYCURSOR;
+ if (yych == 'O') goto yy138;
+ goto yy121;
+yy126:
+ yych = *++YYCURSOR;
+ if (yych == 'N') goto yy135;
+ goto yy121;
+yy127:
+ yych = *++YYCURSOR;
+ if (yych != 'T') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'A') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'R') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'T') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != '_') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != '_') goto yy121;
+yy133:
+ ++YYCURSOR;
+ if ((yych = *YYCURSOR) <= 'Z') {
+ if (yych <= '/') goto yy134;
+ if (yych <= '9') goto yy120;
+ if (yych >= 'A') goto yy120;
+ } else {
+ if (yych <= '_') {
+ if (yych >= '_') goto yy120;
+ } else {
+ if (yych <= '`') goto yy134;
+ if (yych <= 'z') goto yy120;
+ }
+ }
+yy134:
+#line 224 "_mwscan.re"
+ {RET(t_magicword);}
+#line 894 "_mwscan.cc"
+yy135:
+ yych = *++YYCURSOR;
+ if (yych != 'D') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != '_') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych == '_') goto yy133;
+ goto yy121;
+yy138:
+ yych = *++YYCURSOR;
+ if (yych != 'R') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'C') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'E') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'T') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'O') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'C') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != '_') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych == '_') goto yy133;
+ goto yy121;
+yy146:
+ yych = *++YYCURSOR;
+ if (yych == 'W') goto yy203;
+ goto yy121;
+yy147:
+ yych = *++YYCURSOR;
+ switch (yych) {
+ case 'C': goto yy150;
+ case 'E': goto yy149;
+ case 'G': goto yy151;
+ case 'T': goto yy148;
+ default: goto yy121;
+ }
+yy148:
+ yych = *++YYCURSOR;
+ if (yych <= 'H') {
+ if (yych == 'C') goto yy186;
+ goto yy121;
+ } else {
+ if (yych <= 'I') goto yy187;
+ if (yych == 'O') goto yy188;
+ goto yy121;
+ }
+yy149:
+ yych = *++YYCURSOR;
+ if (yych == 'D') goto yy175;
+ goto yy121;
+yy150:
+ yych = *++YYCURSOR;
+ if (yych == 'C') goto yy159;
+ if (yych == 'O') goto yy160;
+ goto yy121;
+yy151:
+ yych = *++YYCURSOR;
+ if (yych != 'A') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'L') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'L') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'E') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'R') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'Y') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != '_') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych == '_') goto yy133;
+ goto yy121;
+yy159:
+ yych = *++YYCURSOR;
+ if (yych == '_') goto yy174;
+ goto yy121;
+yy160:
+ yych = *++YYCURSOR;
+ if (yych != 'N') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'T') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'E') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'N') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'T') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'C') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'O') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'N') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'V') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'E') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'R') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'T') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != '_') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych == '_') goto yy133;
+ goto yy121;
+yy174:
+ yych = *++YYCURSOR;
+ if (yych == '_') goto yy133;
+ goto yy121;
+yy175:
+ yych = *++YYCURSOR;
+ if (yych != 'I') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'T') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'S') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'E') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'C') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'T') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'I') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'O') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'N') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != '_') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych == '_') goto yy133;
+ goto yy121;
+yy186:
+ yych = *++YYCURSOR;
+ if (yych == '_') goto yy202;
+ goto yy121;
+yy187:
+ yych = *++YYCURSOR;
+ if (yych == 'T') goto yy191;
+ goto yy121;
+yy188:
+ yych = *++YYCURSOR;
+ if (yych != 'C') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != '_') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych == '_') goto yy133;
+ goto yy121;
+yy191:
+ yych = *++YYCURSOR;
+ if (yych != 'L') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'E') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'C') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'O') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'N') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'V') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'E') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'R') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'T') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != '_') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych == '_') goto yy133;
+ goto yy121;
+yy202:
+ yych = *++YYCURSOR;
+ if (yych == '_') goto yy133;
+ goto yy121;
+yy203:
+ yych = *++YYCURSOR;
+ if (yych != 'S') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'E') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'C') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'T') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'I') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'O') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'N') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'L') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'I') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'N') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'K') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != '_') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych == '_') goto yy133;
+ goto yy121;
+yy216:
+ yych = *++YYCURSOR;
+ if (yych != 'C') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != '_') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych == '_') goto yy133;
+ goto yy121;
+yy219:
+ yych = *++YYCURSOR;
+ if (yych != 't') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'p') goto yy121;
+ yyaccept = 3;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if (yych == ':') goto yy223;
+ if (yych != 's') goto yy121;
+ yyaccept = 3;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if (yych != ':') goto yy121;
+yy223:
+ yych = *++YYCURSOR;
+ if (yych != '/') goto yy76;
+ yych = *++YYCURSOR;
+ if (yych != '/') goto yy76;
+ yych = *++YYCURSOR;
+ if (yych <= '_') {
+ if (yych <= ':') {
+ if (yych <= '&') {
+ if (yych == '#') goto yy226;
+ if (yych <= '$') goto yy76;
+ } else {
+ if (yych <= '\'') goto yy76;
+ if (yych == '*') goto yy76;
+ }
+ } else {
+ if (yych <= '?') {
+ if (yych == '=') goto yy226;
+ if (yych <= '>') goto yy76;
+ } else {
+ if (yych <= '@') goto yy76;
+ if (yych <= 'Z') goto yy226;
+ if (yych <= '^') goto yy76;
+ }
+ }
+ } else {
+ if (yych <= 0x00D6) {
+ if (yych <= '~') {
+ if (yych <= '`') goto yy76;
+ if (yych <= 'z') goto yy226;
+ if (yych <= '}') goto yy76;
+ } else {
+ if (yych == 0x00C4) goto yy226;
+ if (yych <= 0x00D5) goto yy76;
+ }
+ } else {
+ if (yych <= 0x00E4) {
+ if (yych == 0x00DC) goto yy226;
+ if (yych <= 0x00E3) goto yy76;
+ } else {
+ if (yych <= 0x00F6) {
+ if (yych <= 0x00F5) goto yy76;
+ } else {
+ if (yych != 0x00FC) goto yy76;
+ }
+ }
+ }
+ }
+yy226:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych <= '_') {
+ if (yych <= ':') {
+ if (yych <= '&') {
+ if (yych == '#') goto yy226;
+ if (yych >= '%') goto yy226;
+ } else {
+ if (yych <= '\'') goto yy228;
+ if (yych != '*') goto yy226;
+ }
+ } else {
+ if (yych <= '?') {
+ if (yych == '=') goto yy226;
+ if (yych >= '?') goto yy226;
+ } else {
+ if (yych <= '@') goto yy228;
+ if (yych <= 'Z') goto yy226;
+ if (yych >= '_') goto yy226;
+ }
+ }
+ } else {
+ if (yych <= 0x00D6) {
+ if (yych <= '~') {
+ if (yych <= '`') goto yy228;
+ if (yych <= 'z') goto yy226;
+ if (yych >= '~') goto yy226;
+ } else {
+ if (yych == 0x00C4) goto yy226;
+ if (yych >= 0x00D6) goto yy226;
+ }
+ } else {
+ if (yych <= 0x00E4) {
+ if (yych == 0x00DC) goto yy226;
+ if (yych >= 0x00E4) goto yy226;
+ } else {
+ if (yych <= 0x00F6) {
+ if (yych >= 0x00F6) goto yy226;
+ } else {
+ if (yych == 0x00FC) goto yy226;
+ }
+ }
+ }
+ }
+yy228:
+#line 223 "_mwscan.re"
+ {RET(t_http_url);}
+#line 1221 "_mwscan.cc"
+yy229:
+ yych = *++YYCURSOR;
+ if (yych != 'p') goto yy121;
+ yyaccept = 3;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if (yych != ':') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != '/') goto yy76;
+ yych = *++YYCURSOR;
+ if (yych != '/') goto yy76;
+ yych = *++YYCURSOR;
+ if (yych <= '=') {
+ if (yych <= '&') {
+ if (yych <= '"') goto yy76;
+ if (yych == '%') goto yy76;
+ } else {
+ if (yych <= '\'') goto yy76;
+ if (yych <= ':') goto yy234;
+ if (yych <= '<') goto yy76;
+ }
+ } else {
+ if (yych <= '_') {
+ if (yych <= '>') goto yy76;
+ if (yych <= 'Z') goto yy234;
+ if (yych <= '^') goto yy76;
+ } else {
+ if (yych <= '{') {
+ if (yych <= '`') goto yy76;
+ } else {
+ if (yych <= '|') goto yy76;
+ if (yych >= 0x007F) goto yy76;
+ }
+ }
+ }
+yy234:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych <= '=') {
+ if (yych <= '&') {
+ if (yych <= '"') goto yy236;
+ if (yych != '%') goto yy234;
+ } else {
+ if (yych <= '\'') goto yy236;
+ if (yych <= ':') goto yy234;
+ if (yych >= '=') goto yy234;
+ }
+ } else {
+ if (yych <= '_') {
+ if (yych <= '>') goto yy236;
+ if (yych <= 'Z') goto yy234;
+ if (yych >= '_') goto yy234;
+ } else {
+ if (yych <= '{') {
+ if (yych >= 'a') goto yy234;
+ } else {
+ if (yych <= '|') goto yy236;
+ if (yych <= '~') goto yy234;
+ }
+ }
+ }
+yy236:
+#line 221 "_mwscan.re"
+ {RET(t_http_url);}
+#line 1285 "_mwscan.cc"
+yy237:
+ yych = *++YYCURSOR;
+ if (yych != 'i') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'l') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 't') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych != 'o') goto yy121;
+ yyaccept = 3;
+ yych = *(YYMARKER = ++YYCURSOR);
+ if (yych != ':') goto yy121;
+ yych = *++YYCURSOR;
+ if (yych == '@') goto yy76;
+ goto yy244;
+yy243:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+yy244:
+ if (yych <= '9') {
+ if (yych <= '\'') {
+ if (yych == '!') goto yy243;
+ if (yych <= '"') goto yy76;
+ goto yy243;
+ } else {
+ if (yych <= ')') goto yy76;
+ if (yych == ',') goto yy76;
+ goto yy243;
+ }
+ } else {
+ if (yych <= '?') {
+ if (yych == '=') goto yy243;
+ if (yych <= '>') goto yy76;
+ goto yy243;
+ } else {
+ if (yych <= 'Z') {
+ if (yych >= 'A') goto yy243;
+ } else {
+ if (yych <= ']') goto yy76;
+ if (yych <= '~') goto yy243;
+ goto yy76;
+ }
+ }
+ }
+ yych = *++YYCURSOR;
+ if (yych <= '@') {
+ if (yych <= '.') {
+ if (yych <= ',') goto yy76;
+ } else {
+ if (yych <= '/') goto yy76;
+ if (yych >= ':') goto yy76;
+ }
+ } else {
+ if (yych <= '_') {
+ if (yych <= 'Z') goto yy246;
+ if (yych <= '^') goto yy76;
+ } else {
+ if (yych <= '`') goto yy76;
+ if (yych >= '{') goto yy76;
+ }
+ }
+yy246:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych <= '@') {
+ if (yych <= '.') {
+ if (yych >= '-') goto yy246;
+ } else {
+ if (yych <= '/') goto yy248;
+ if (yych <= '9') goto yy246;
+ }
+ } else {
+ if (yych <= '_') {
+ if (yych <= 'Z') goto yy246;
+ if (yych >= '_') goto yy246;
+ } else {
+ if (yych <= '`') goto yy248;
+ if (yych <= 'z') goto yy246;
+ }
+ }
+yy248:
+#line 219 "_mwscan.re"
+ {RET(t_http_url);}
+#line 1369 "_mwscan.cc"
+yy249:
+ ++YYCURSOR;
+#line 226 "_mwscan.re"
+ {RET(t_2box_open);}
+#line 1374 "_mwscan.cc"
+yy251:
+ yych = *++YYCURSOR;
+ if (yych == 't') goto yy274;
+ goto yy76;
+yy252:
+ yych = *++YYCURSOR;
+ if (yych == 't') goto yy266;
+ goto yy76;
+yy253:
+ yych = *++YYCURSOR;
+ if (yych != 'a') goto yy76;
+ yych = *++YYCURSOR;
+ if (yych != 'i') goto yy76;
+ yych = *++YYCURSOR;
+ if (yych != 'l') goto yy76;
+ yych = *++YYCURSOR;
+ if (yych != 't') goto yy76;
+ yych = *++YYCURSOR;
+ if (yych != 'o') goto yy76;
+ yych = *++YYCURSOR;
+ if (yych != ':') goto yy76;
+ yych = *++YYCURSOR;
+ if (yych == '@') goto yy76;
+ goto yy261;
+yy260:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+yy261:
+ if (yych <= '9') {
+ if (yych <= '\'') {
+ if (yych == '!') goto yy260;
+ if (yych <= '"') goto yy76;
+ goto yy260;
+ } else {
+ if (yych <= ')') goto yy76;
+ if (yych == ',') goto yy76;
+ goto yy260;
+ }
+ } else {
+ if (yych <= '?') {
+ if (yych == '=') goto yy260;
+ if (yych <= '>') goto yy76;
+ goto yy260;
+ } else {
+ if (yych <= 'Z') {
+ if (yych >= 'A') goto yy260;
+ } else {
+ if (yych <= ']') goto yy76;
+ if (yych <= '~') goto yy260;
+ goto yy76;
+ }
+ }
+ }
+ yych = *++YYCURSOR;
+ if (yych <= '@') {
+ if (yych <= '.') {
+ if (yych <= ',') goto yy76;
+ } else {
+ if (yych <= '/') goto yy76;
+ if (yych >= ':') goto yy76;
+ }
+ } else {
+ if (yych <= '_') {
+ if (yych <= 'Z') goto yy263;
+ if (yych <= '^') goto yy76;
+ } else {
+ if (yych <= '`') goto yy76;
+ if (yych >= '{') goto yy76;
+ }
+ }
+yy263:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych <= '@') {
+ if (yych <= '.') {
+ if (yych >= '-') goto yy263;
+ } else {
+ if (yych <= '/') goto yy265;
+ if (yych <= '9') goto yy263;
+ }
+ } else {
+ if (yych <= '_') {
+ if (yych <= 'Z') goto yy263;
+ if (yych >= '_') goto yy263;
+ } else {
+ if (yych <= '`') goto yy265;
+ if (yych <= 'z') goto yy263;
+ }
+ }
+yy265:
+#line 218 "_mwscan.re"
+ {RET(t_urllink);}
+#line 1467 "_mwscan.cc"
+yy266:
+ yych = *++YYCURSOR;
+ if (yych != 'p') goto yy76;
+ yych = *++YYCURSOR;
+ if (yych != ':') goto yy76;
+ yych = *++YYCURSOR;
+ if (yych != '/') goto yy76;
+ yych = *++YYCURSOR;
+ if (yych != '/') goto yy76;
+ yych = *++YYCURSOR;
+ if (yych <= '=') {
+ if (yych <= '&') {
+ if (yych <= '"') goto yy76;
+ if (yych == '%') goto yy76;
+ } else {
+ if (yych <= '\'') goto yy76;
+ if (yych <= ':') goto yy271;
+ if (yych <= '<') goto yy76;
+ }
+ } else {
+ if (yych <= '_') {
+ if (yych <= '>') goto yy76;
+ if (yych <= 'Z') goto yy271;
+ if (yych <= '^') goto yy76;
+ } else {
+ if (yych <= '{') {
+ if (yych <= '`') goto yy76;
+ } else {
+ if (yych <= '|') goto yy76;
+ if (yych >= 0x007F) goto yy76;
+ }
+ }
+ }
+yy271:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych <= '=') {
+ if (yych <= '&') {
+ if (yych <= '"') goto yy273;
+ if (yych != '%') goto yy271;
+ } else {
+ if (yych <= '\'') goto yy273;
+ if (yych <= ':') goto yy271;
+ if (yych >= '=') goto yy271;
+ }
+ } else {
+ if (yych <= '_') {
+ if (yych <= '>') goto yy273;
+ if (yych <= 'Z') goto yy271;
+ if (yych >= '_') goto yy271;
+ } else {
+ if (yych <= '{') {
+ if (yych >= 'a') goto yy271;
+ } else {
+ if (yych <= '|') goto yy273;
+ if (yych <= '~') goto yy271;
+ }
+ }
+ }
+yy273:
+#line 220 "_mwscan.re"
+ {RET(t_urllink);}
+#line 1530 "_mwscan.cc"
+yy274:
+ yych = *++YYCURSOR;
+ if (yych != 't') goto yy76;
+ yych = *++YYCURSOR;
+ if (yych != 'p') goto yy76;
+ yych = *++YYCURSOR;
+ if (yych == ':') goto yy278;
+ if (yych != 's') goto yy76;
+ yych = *++YYCURSOR;
+ if (yych != ':') goto yy76;
+yy278:
+ yych = *++YYCURSOR;
+ if (yych != '/') goto yy76;
+ yych = *++YYCURSOR;
+ if (yych != '/') goto yy76;
+ yych = *++YYCURSOR;
+ if (yych <= '_') {
+ if (yych <= ':') {
+ if (yych <= '&') {
+ if (yych == '#') goto yy281;
+ if (yych <= '$') goto yy76;
+ } else {
+ if (yych <= '\'') goto yy76;
+ if (yych == '*') goto yy76;
+ }
+ } else {
+ if (yych <= '?') {
+ if (yych == '=') goto yy281;
+ if (yych <= '>') goto yy76;
+ } else {
+ if (yych <= '@') goto yy76;
+ if (yych <= 'Z') goto yy281;
+ if (yych <= '^') goto yy76;
+ }
+ }
+ } else {
+ if (yych <= 0x00D6) {
+ if (yych <= '~') {
+ if (yych <= '`') goto yy76;
+ if (yych <= 'z') goto yy281;
+ if (yych <= '}') goto yy76;
+ } else {
+ if (yych == 0x00C4) goto yy281;
+ if (yych <= 0x00D5) goto yy76;
+ }
+ } else {
+ if (yych <= 0x00E4) {
+ if (yych == 0x00DC) goto yy281;
+ if (yych <= 0x00E3) goto yy76;
+ } else {
+ if (yych <= 0x00F6) {
+ if (yych <= 0x00F5) goto yy76;
+ } else {
+ if (yych != 0x00FC) goto yy76;
+ }
+ }
+ }
+ }
+yy281:
+ ++YYCURSOR;
+ yych = *YYCURSOR;
+ if (yych <= '_') {
+ if (yych <= ':') {
+ if (yych <= '&') {
+ if (yych == '#') goto yy281;
+ if (yych >= '%') goto yy281;
+ } else {
+ if (yych <= '\'') goto yy283;
+ if (yych != '*') goto yy281;
+ }
+ } else {
+ if (yych <= '?') {
+ if (yych == '=') goto yy281;
+ if (yych >= '?') goto yy281;
+ } else {
+ if (yych <= '@') goto yy283;
+ if (yych <= 'Z') goto yy281;
+ if (yych >= '_') goto yy281;
+ }
+ }
+ } else {
+ if (yych <= 0x00D6) {
+ if (yych <= '~') {
+ if (yych <= '`') goto yy283;
+ if (yych <= 'z') goto yy281;
+ if (yych >= '~') goto yy281;
+ } else {
+ if (yych == 0x00C4) goto yy281;
+ if (yych >= 0x00D6) goto yy281;
+ }
+ } else {
+ if (yych <= 0x00E4) {
+ if (yych == 0x00DC) goto yy281;
+ if (yych >= 0x00E4) goto yy281;
+ } else {
+ if (yych <= 0x00F6) {
+ if (yych >= 0x00F6) goto yy281;
+ } else {
+ if (yych == 0x00FC) goto yy281;
+ }
+ }
+ }
+ }
+yy283:
+#line 222 "_mwscan.re"
+ {RET(t_urllink);}
+#line 1637 "_mwscan.cc"
+}
+#line 267 "_mwscan.re"
+
+}
+
+
+PyObject *py_scan(PyObject *self, PyObject *args)
+{
+ PyObject *arg1;
+ if (!PyArg_ParseTuple(args, "O:mwscan.scan", &arg1)) {
+ return 0;
+ }
+ PyUnicodeObject *unistr = (PyUnicodeObject*)PyUnicode_FromObject(arg1);
+ if (unistr == NULL) {
+ PyErr_SetString(PyExc_TypeError,
+ "parameter cannot be converted to unicode in mwscan.scan");
+ return 0;
+ }
+
+ Py_UNICODE *start = unistr->str;
+ Py_UNICODE *end = start+unistr->length;
+
+
+ Scanner scanner (start, end);
+ Py_BEGIN_ALLOW_THREADS
+ while (scanner.scan()) {
+ }
+ Py_END_ALLOW_THREADS
+ Py_XDECREF(unistr);
+
+ // return PyList_New(0); // uncomment to see timings for scanning
+
+ int size = scanner.tokens.size();
+ PyObject *result = PyList_New(size);
+ if (!result) {
+ return 0;
+ }
+
+ for (int i=0; i<size; i++) {
+ Token t = scanner.tokens[i];
+ PyList_SET_ITEM(result, i, Py_BuildValue("iii", t.type, t.start, t.len));
+ }
+
+ return result;
+}
+
+
+
+static PyMethodDef module_functions[] = {
+ {"scan", (PyCFunction)py_scan, METH_VARARGS, "scan(text)"},
+ {0, 0},
+};
+
+
+
+extern "C" {
+ DL_EXPORT(void) init_mwscan();
+}
+
+DL_EXPORT(void) init_mwscan()
+{
+ /*PyObject *m =*/ Py_InitModule("_mwscan", module_functions);
+}
diff --git a/mwlib/_mwscan.re b/mwlib/_mwscan.re
new file mode 100644
index 0000000..99ffe95
--- /dev/null
+++ b/mwlib/_mwscan.re
@@ -0,0 +1,327 @@
+// -*- mode: c++ -*-
+// Copyright (c) 2007-2008 PediaPress GmbH
+// See README.txt for additional licensing information.
+
+#include <Python.h>
+
+#include <iostream>
+#include <assert.h>
+#include <vector>
+using namespace std;
+
+#define RET(x) {found(x); return x;}
+
+typedef enum {
+ t_end,
+ t_text,
+ t_entity,
+ t_special,
+ t_magicword,
+ t_comment,
+ t_2box_open, // [[
+ t_2box_close, // ]]
+ t_http_url,
+ t_break,
+ t_begin_table,
+ t_end_table,
+ t_html_tag,
+ t_style,
+ t_pre,
+ t_section,
+ t_section_end,
+ t_item,
+ t_colon,
+ t_semicolon,
+ t_hrule,
+ t_newline,
+ t_column,
+ t_row,
+ t_tablecaption,
+ t_urllink,
+} mwtok;
+
+struct Token
+{
+ int type;
+ int start;
+ int len;
+};
+
+class Scanner
+{
+public:
+
+ Scanner(Py_UNICODE *_start, Py_UNICODE *_end) {
+ source = start = _start;
+ end = _end;
+ cursor = start;
+ line_startswith_section = -1;
+ tablemode=0;
+ }
+
+ int found(mwtok val) {
+ if (val==t_text && tokens.size()) {
+ Token &previous_token (tokens[tokens.size()-1]);
+ if (previous_token.type==val) {
+ previous_token.len += cursor-start;
+ return tokens.size()-1;
+ }
+ }
+ Token t;
+ t.type = val;
+ t.start = (start-source);
+ t.len = cursor-start;
+ tokens.push_back(t);
+ return tokens.size()-1;
+ }
+
+ bool bol() const {
+ return (start==source) || (start[-1]=='\n');
+ }
+
+ bool eol() const {
+ return *cursor=='\n' || *cursor==0;
+ }
+
+ void newline() {
+ if (line_startswith_section>=0) {
+ tokens[line_startswith_section].type = t_text;
+ }
+ line_startswith_section = -1;
+ }
+
+ inline int scan();
+
+ Py_UNICODE *source;
+
+ Py_UNICODE *start;
+ Py_UNICODE *cursor;
+ Py_UNICODE *end;
+ vector<Token> tokens;
+
+ int line_startswith_section;
+ int tablemode;
+};
+
+
+int Scanner::scan()
+{
+ start=cursor;
+
+ Py_UNICODE *marker=cursor;
+
+ Py_UNICODE *save_cursor = cursor;
+
+
+#define YYCTYPE Py_UNICODE
+#define YYCURSOR cursor
+#define YYMARKER marker
+#define YYLIMIT (end)
+// #define YYFILL(n) return 0;
+
+/*!re2c
+re2c:yyfill:enable = 0 ;
+*/
+
+/*
+ the re2c manpage says:
+ "The user must arrange for a sentinel token to appear at the end of input"
+ \000 is our sentinel token.
+*/
+
+/*!re2c
+ any = [^\000];
+ ftp = "ftp://" [-a-zA-Z0-9_+${}~?=/@#&*(),:.]+ ;
+ mailto = "mailto:" [-a-zA-Z0-9_!#$%*./?|^{}`~&'+=]+ "@" [-a-zA-Z0-9_.]+ ;
+ url = "http" "s"? "://" [-\xe4\xc4\xf6\xd6\xfc\xdca-zA-Z_0-9./?=&:%:~()#+,]+ ;
+ entity_name = "&" [a-zA-Z0-9]+ ";";
+ entity_hex = "&#" 'x' [a-fA-F0-9]+ ";";
+ entity_dec = "&#" [0-9]+ ";";
+
+ entity = (entity_name | entity_hex | entity_dec);
+
+
+ magicword = ( "__TOC__"
+ | "__NOTOC__"
+ | "__FORCETOC__"
+ | "__NOEDITSECTION__"
+ | "__NEWSECTIONLINK__"
+ | "__NOCONTENTCONVERT__"
+ | "__NOCC__"
+ | "__NOGALLERY__"
+ | "__NOTITLECONVERT__"
+ | "__NOTC__"
+ | "__END__"
+ | "__START__"
+ );
+*/
+ if (!bol()) {
+ goto not_bol;
+ }
+/*!re2c
+ " "* "{|" {++tablemode; RET(t_begin_table);}
+ " "* "|}" {--tablemode; RET(t_end_table);}
+
+ " "* "|" "-"+
+ {
+ if (tablemode)
+ RET(t_row);
+ if (*start==' ') {
+ cursor = start+1;
+ RET(t_pre);
+ }
+ RET(t_text);
+ }
+
+ " "* ("|" | "!")
+ {
+ if (tablemode)
+ RET(t_column);
+
+ if (*start==' ') {
+ cursor = start+1;
+ RET(t_pre);
+ }
+ RET(t_text);
+ }
+
+ " "* "|" "+"+
+ {
+ if (tablemode)
+ RET(t_tablecaption);
+ if (*start==' ') {
+ cursor = start+1;
+ RET(t_pre);
+ }
+ RET(t_text);
+ }
+
+ " " {RET(t_pre);}
+ "="+ [ \t]* {
+ line_startswith_section = found(t_section);
+ return t_section;
+ }
+ ":"* [#*]+ {RET(t_item);}
+ ":"+ {RET(t_colon);}
+ ";"+ {RET(t_semicolon);}
+ "-"{4,} {RET(t_hrule);}
+
+ [^] {goto not_bol;}
+ */
+
+
+not_bol:
+ cursor = save_cursor;
+ marker = cursor;
+
+/*!re2c
+ "[" mailto {RET(t_urllink);}
+ mailto {RET(t_http_url);}
+ "[" ftp {RET(t_urllink);}
+ ftp {RET(t_http_url);}
+ "[" url {RET(t_urllink);}
+ url {RET(t_http_url);}
+ magicword {RET(t_magicword);}
+ [a-zA-Z0-9_]+ {RET(t_text);}
+ "[[" {RET(t_2box_open);}
+ "]]" {RET(t_2box_close);}
+ "="+ [ \t]* {
+ if (eol()) {
+ if (line_startswith_section>=0) {
+ line_startswith_section=-1;
+ RET(t_section_end);
+ } else {
+ RET(t_text);
+ }
+ } else {
+ RET(t_text);
+ }
+ }
+ "\n"{2,} {newline(); RET(t_break);}
+ "\n" {newline(); RET(t_newline);}
+ "||" | "|!" | "!!"
+ {
+ if (tablemode)
+ RET(t_column);
+ cursor = start+1;
+ RET(t_special);
+ }
+ "|+"
+ {
+ if (tablemode)
+ RET(t_tablecaption);
+ cursor = start+1;
+ RET(t_special);
+ }
+ [:|\[\]] {RET(t_special);}
+ "'''''" | "'''" | "''" {RET(t_style);}
+ "<" "/"? [a-zA-Z]+ [^\000<>]* "/"? ">"
+ {RET(t_html_tag);}
+
+ "<!--"[^\000<>]*"-->"
+ {RET(t_comment);}
+ entity {RET(t_entity);}
+
+ "\000" {newline(); return t_end;}
+ . {RET(t_text);}
+*/
+}
+
+
+PyObject *py_scan(PyObject *self, PyObject *args)
+{
+ PyObject *arg1;
+ if (!PyArg_ParseTuple(args, "O:mwscan.scan", &arg1)) {
+ return 0;
+ }
+ PyUnicodeObject *unistr = (PyUnicodeObject*)PyUnicode_FromObject(arg1);
+ if (unistr == NULL) {
+ PyErr_SetString(PyExc_TypeError,
+ "parameter cannot be converted to unicode in mwscan.scan");
+ return 0;
+ }
+
+ Py_UNICODE *start = unistr->str;
+ Py_UNICODE *end = start+unistr->length;
+
+
+ Scanner scanner (start, end);
+ Py_BEGIN_ALLOW_THREADS
+ while (scanner.scan()) {
+ }
+ Py_END_ALLOW_THREADS
+ Py_XDECREF(unistr);
+
+ // return PyList_New(0); // uncomment to see timings for scanning
+
+ int size = scanner.tokens.size();
+ PyObject *result = PyList_New(size);
+ if (!result) {
+ return 0;
+ }
+
+ for (int i=0; i<size; i++) {
+ Token t = scanner.tokens[i];
+ PyList_SET_ITEM(result, i, Py_BuildValue("iii", t.type, t.start, t.len));
+ }
+
+ return result;
+}
+
+
+
+static PyMethodDef module_functions[] = {
+ {"scan", (PyCFunction)py_scan, METH_VARARGS, "scan(text)"},
+ {0, 0},
+};
+
+
+
+extern "C" {
+ DL_EXPORT(void) init_mwscan();
+}
+
+DL_EXPORT(void) init_mwscan()
+{
+ /*PyObject *m =*/ Py_InitModule("_mwscan", module_functions);
+}
diff --git a/mwlib/_version.py b/mwlib/_version.py
new file mode 100644
index 0000000..9e73d4f
--- /dev/null
+++ b/mwlib/_version.py
@@ -0,0 +1,9 @@
+class _Version(tuple):
+ """internal version object, subclass of C{tuple},
+ but implements a fancier __str__ representation
+ """
+ def __str__(self):
+ return '.'.join([str(x) for x in self])
+
+version = _Version((0,6,1))
+del _Version
diff --git a/mwlib/advtree.py b/mwlib/advtree.py
new file mode 100644
index 0000000..52d57e5
--- /dev/null
+++ b/mwlib/advtree.py
@@ -0,0 +1,545 @@
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+
+"""
+The parse tree generated by the parser is a 1:1 representation of the mw-markup.
+Unfortunally these trees have some flaws if used to geenerate derived documents.
+
+This module seeks to rebuild the parstree
+to be:
+ * more logical markup
+ * clean up the parse tree
+ * make it more accessible
+ * allow for validity checks
+ * implement rebuilding strategies
+
+Usefull Documentation:
+http://en.wikipedia.org/wiki/Wikipedia:Don%27t_use_line_breaks
+http://meta.wikimedia.org/wiki/Help:Advanced_editing
+"""
+
+import weakref
+from mwlib.parser import Magic, Math, _VListNode, Ref, Link, URL, NamedURL # not used but imported
+from mwlib.parser import CategoryLink, SpecialLink, Caption, LangLink # not used but imported
+from mwlib.parser import Item, ItemList, Node, Table, Row, Cell, Paragraph, PreFormatted
+from mwlib.parser import Section, Style, TagNode, Text, Timeline
+from mwlib.parser import ImageLink, Article, Book, Chapter
+import copy
+from mwlib.log import Log
+
+log = Log("advtree")
+
+
+def _idIndex(lst, el):
+ # return first appeareance of element in list
+ for i, e in enumerate(lst):
+ if e is el:
+ return i
+ return -1
+
+class AdvancedNode:
+ """
+ MixIn Class that extends Nodes so they become easier accessible
+
+ allows to traverse the tree in any direction and
+ build derived convinience functions
+ """
+ _parentref = None # weak referece to parent element
+ isblocknode = False
+
+ def copy(self):
+ "return a copy of this node and all its children"
+ n = copy.copy(self)
+ n.children = []
+ n._parentref = None
+ for c in self:
+ n.appendChild(c.copy())
+ return n
+
+
+ def moveto(self, targetnode, prefix=False):
+ """
+ moves this node after target node
+ if prefix is true, move in front of target node
+ """
+ if self.parent:
+ self.parent.removeChild(self)
+ tp = targetnode.parent
+ idx = _idIndex(tp.children, targetnode)
+ if not prefix:
+ idx+=1
+ tp.children = tp.children[:idx] + [self] + tp.children[idx:]
+ self._parentref = weakref.ref(tp)
+
+ def appendChild(self, c):
+ self.children.append(c)
+ c._parentref = weakref.ref(self)
+
+ def remove(self):
+ if self.parent:
+ for (idx, n) in enumerate(self.parent.children):
+ if n is self:
+ self.parent.children = self.parent.children[:idx] + self.parent.children[idx+1:]
+ return 0
+ else:
+ return 1
+
+ def removeChild(self, c):
+ self.replaceChild(c, [])
+
+ def replaceChild(self, c, newchildren = []):
+ idx = _idIndex(self.children, c)
+ self.children.remove(c)
+ c._parentref = None
+ if newchildren:
+ self.children = self.children[:idx] + newchildren + self.children[idx:]
+ for nc in newchildren:
+ nc._parentref = weakref.ref(self)
+
+ def getParents(self):
+ if self.parent:
+ return self.parent.getParents() + [self.parent]
+ else:
+ return []
+
+ def getParent(self):
+ if not self._parentref:
+ return None
+ x = self._parentref()
+ if not x:
+ raise weakref.ReferenceError
+ return x
+
+ def getLevel(self):
+ "returns the number of nodes of same class in parents"
+ return [p.__class__ for p in self.getParents()].count(self.__class__)
+
+
+ def getParentNodesByClass(self, klass):
+ "returns parents w/ klass"
+ return [p for p in self.parents if p.__class__ == klass]
+
+ def getChildNodesByClass(self, klass):
+ "returns all children w/ klass"
+ return [p for p in self.getAllChildren() if p.__class__ == klass]
+
+ def getAllChildren(self):
+ "don't confuse w/ Node.allchildren() which returns allchildren + self"
+ for c in self.children:
+ yield c
+ for x in c.getAllChildren():
+ yield x
+
+ def getSiblings(self):
+ return [c for c in self.getAllSiblings() if c is not self]
+
+ def getAllSiblings(self):
+ "all siblings plus me my self and i"
+ if self.parent:
+ return self.parent.children
+ return []
+
+ def getPrevious(self):
+ "return previous sibling"
+ s = self.getAllSiblings()
+ try:
+ idx = _idIndex(s,self)
+ except ValueError:
+ return None
+ if idx -1 <0:
+ return None
+ else:
+ return s[idx-1]
+
+ def getNext(self):
+ "return next sibling"
+ s = self.getAllSiblings()
+ try:
+ idx = _idIndex(s,self)
+ except ValueError:
+ return None
+ if idx+1 >= len(s):
+ return None
+ else:
+ return s[idx+1]
+
+ def getLast(self):
+ "return last sibling"
+ s = self.getAllSiblings()
+ if s:
+ return s[-1]
+
+ def getFirst(self):
+ "return first sibling"
+ s = self.getAllSiblings()
+ if s:
+ return s[0]
+
+ def getLastChild(self):
+ "return last child of this node"
+ if self.children:
+ return self.children[-1]
+
+ def getFirstChild(self):
+ "return first child of this node"
+ if self.children:
+ return self.children[0]
+
+ def getAllDisplayText(self, amap = None):
+ "return all text that is intended for display"
+ text = []
+ if not amap:
+ amap = {Text:"caption", Link:"target", URL:"caption", Math:"caption", ImageLink:"caption" }
+ for n in self.allchildren():
+ access = amap.get(n.__class__, "")
+ if access:
+ text.append( getattr(n, access) )
+ alltext = [t for t in text if t]
+ if alltext:
+ return u''.join(alltext)
+ else:
+ return ''
+
+ parent = property(getParent)
+ parents = property(getParents)
+ next = property(getNext)
+ previous = property(getPrevious)
+ siblings = property(getSiblings)
+ last = property(getLast)
+ first = property(getFirst)
+ lastchild = property(getLastChild)
+ firstchild = property(getFirstChild)
+
+
+
+# --------------------------------------------------------------------------
+# MixinClasses w/ special behaviour
+# -------------------------------------------------------------------------
+
+class AdvancedTable(AdvancedNode):
+ @property
+ def rows(self):
+ return [r for r in self if r.__class__ == Row]
+
+ @property
+ def numcols(self):
+ cols = [[n.__class__ for n in row].count(Cell) for row in self.rows]
+ if cols:
+ return max(cols)
+ else:
+ return 0
+
+class AdvancedRow(AdvancedNode):
+ @property
+ def cells(self):
+ return [c for c in self if c.__class__ == Cell]
+
+
+class AdvancedSection(AdvancedNode):
+ h_level = 0 # this is set if it originates from an H1, H2, ... TagNode
+ def getSectionLevel(self):
+ return 1 + self.getLevel()
+
+class AdvancedImageLink(AdvancedNode):
+ isblocknode = property ( lambda s: not s.isInline() )
+
+class AdvancedMath(AdvancedNode):
+ @property
+ def isblocknode(self):
+ if self.caption.strip().startswith("\\begin{align}") or \
+ self.caption.strip().startswith("\\begin{alignat}"):
+ return True
+ return False
+
+
+
+# --------------------------------------------------------------------------
+# Missing as Classes derived from parser.Style
+# -------------------------------------------------------------------------
+
+
+class Emphasized(Style, AdvancedNode):
+ "EM"
+ pass
+
+class Strong(Style, AdvancedNode):
+ pass
+
+class DefinitionList(Style, AdvancedNode):
+ "DL"
+ pass
+
+class DefinitionTerm(Style, AdvancedNode):
+ "DT"
+ pass
+
+class DefinitionDescription(Style, AdvancedNode):
+ "DD"
+ pass
+
+class Blockquote(Style, AdvancedNode):
+ "margins to left & right"
+ pass
+
+class Indented(Style, AdvancedNode):
+ "margin to the left"
+
+class Overline(Style, AdvancedNode):
+ _style = "overline"
+
+class Underline(Style, AdvancedNode):
+ _style = "u"
+
+class Sub(Style, AdvancedNode):
+ _style = "sub"
+
+class Sup(Style, AdvancedNode):
+ _style = "sup"
+
+class Small(Style, AdvancedNode):
+ _style = "small"
+
+class Big(Style, AdvancedNode):
+ _style = "big"
+
+class Cite(Style, AdvancedNode):
+ _style = "cite"
+
+
+_styleNodeMap = dict( (k._style,k) for k in [Overline, Underline, Sub, Sup, Small, Big, Cite] )
+
+# --------------------------------------------------------------------------
+# Missing as Classes derived from parser.TagNode
+# -------------------------------------------------------------------------
+
+class Source(TagNode, AdvancedNode):
+ _tag = "source"
+
+class Code(TagNode, AdvancedNode):
+ _tag = "code"
+
+class BreakingReturn(TagNode, AdvancedNode):
+ _tag = "br"
+
+class HorizontalRule(TagNode, AdvancedNode):
+ _tag = "hr"
+
+class Index(TagNode, AdvancedNode):
+ _tag = "index"
+
+class Teletyped(TagNode, AdvancedNode):
+ _tag = "tt"
+
+class Reference(TagNode, AdvancedNode):
+ _tag = "ref"
+
+class ReferenceList(TagNode, AdvancedNode):
+ _tag = "references"
+
+class Gallery(TagNode, AdvancedNode):
+ _tag = "gallery"
+
+class Center(TagNode, AdvancedNode):
+ _tag = "center"
+
+class Div(TagNode, AdvancedNode):
+ _tag = "div"
+
+class Span(TagNode, AdvancedNode): # span is defined as inline node which is in theory correct.
+ _tag = "span"
+
+class Strike(TagNode,AdvancedNode):
+ _tag = "strike"
+
+class ImageMap(TagNode, AdvancedNode): # defined as block node, maybe incorrect
+ _tag = "imagemap"
+
+_tagNodeMap = dict( (k._tag,k) for k in [Source, Code, BreakingReturn, HorizontalRule, Index, Teletyped, Reference, ReferenceList, Gallery, Center, Div, Span, Strike, ImageMap] )
+_styleNodeMap["s"] = Strike # Special Handling for deprecated s style
+
+
+# --------------------------------------------------------------------------
+# BlockNode separation for AdvancedNode.isblocknode
+# -------------------------------------------------------------------------
+
+"""
+For writers it is usefull to know whether elements are inline (within a paragraph) or not.
+We define list for blocknodes, which are used in AdvancedNode as:
+
+AdvancedNode.isblocknode
+
+Image depends on result of Image.isInline() see above
+
+Open Issues: Math, Magic, (unknown) TagNode
+
+"""
+_blockNodesMap = (Book, Chapter, Article, Section, Paragraph, Div,
+ PreFormatted, Cell, Row, Table, Item, BreakingReturn,
+ ItemList, Timeline, Cite, HorizontalRule, Gallery, Indented,
+ DefinitionList, DefinitionTerm, DefinitionDescription, ReferenceList, Source)
+
+for k in _blockNodesMap:
+ k.isblocknode = True
+
+
+
+# --------------------------------------------------------------------------
+# funcs for extending the nodes
+# -------------------------------------------------------------------------
+
+def MixIn(pyClass, mixInClass, makeFirst=False):
+ if mixInClass not in pyClass.__bases__:
+ if makeFirst:
+ pyClass.__bases__ = (mixInClass,) + pyClass.__bases__
+ else:
+ pyClass.__bases__ += (mixInClass,)
+
+def extendClasses(node):
+ for c in node.children[:]:
+ extendClasses(c)
+ c._parentref = weakref.ref(node)
+
+# Nodes we defined above and that are separetly handled in extendClasses
+_advancedNodesMap = {Section: AdvancedSection, ImageLink:AdvancedImageLink,
+ Math:AdvancedMath, Row:AdvancedRow, Table:AdvancedTable}
+MixIn(Node, AdvancedNode)
+for k, v in _advancedNodesMap.items():
+ MixIn(k,v)
+
+# --------------------------------------------------------------------------
+# funcs for repairing the tree
+# -------------------------------------------------------------------------
+
+
+def fixTagNodes(node):
+ """
+ detect known TagNode(s) and associate appropriate Nodes
+ """
+ for c in node.children:
+ if c.__class__ == TagNode:
+ if c.caption in _tagNodeMap:
+ c.__class__ = _tagNodeMap[c.caption]
+ elif c.caption in ("h1", "h2", "h3", "h4", "h5", "h6"): # FIXME
+ # NEED TO MOVE NODE IF IT REALLY STARTS A SECTION
+ c.__class__ = Section
+ MixIn(c.__class__, AdvancedSection)
+ c.level = int(c.caption[1])
+ c.caption = ""
+ else:
+ log.warn("fixTagNodes, unknowntagnode %r" % c)
+ #raise Exception, "unknown tag %s" % c.caption # FIXME
+ fixTagNodes(c)
+
+
+def fixStyle(node):
+ """
+ parser.Style Nodes are mapped to logical markup
+ detection of DefinitionList depends on removeNodes
+ and removeNewlines
+ """
+ if not node.__class__ == Style:
+ return
+ # replace this node by a more apporiate
+ if node.caption == "''":
+ node.__class__ = Emphasized
+ node.caption = ""
+ elif node.caption=="'''''":
+ node.__class__ = Strong
+ node.caption = ""
+ em = Emphasized("''")
+ for c in node.children:
+ em.appendChild(c)
+ node.children = []
+ node.appendChild(em)
+ elif node.caption == "'''":
+ node.__class__ = Strong
+ node.caption = ""
+ elif node.caption == ";":
+ # this starts a definition list ? DL [DT->DD, ...]
+ # check if previous node is DefinitionList, if not create one
+ if node.previous.__class__ == DefinitionList:
+ node.__class__ = DefinitionTerm
+ node.moveto(node.previous.lastchild)
+ else:
+ node.__class__ = DefinitionList
+ dt = DefinitionTerm()
+ for c in node.children:
+ dt.appendChild(c)
+ node.children = []
+ node.appendChild(dt)
+ elif node.caption.startswith(":"):
+ if node.previous.__class__ == DefinitionList:
+ node.__class__ = DefinitionDescription
+ node.moveto(node.previous.lastchild)
+ node.caption = ""
+ else:
+ node.__class__ = Indented
+ elif node.caption in _styleNodeMap:
+ node.__class__ = _styleNodeMap[node.caption]
+ node.caption = ""
+ else:
+ log.warn("fixStyle, unknownstyle %r" % node)
+ #raise Exception, "unknown style %s" % node.caption # FIXME
+ pass
+ return node
+
+def fixStyles(node):
+ if node.__class__ == Style:
+ fixStyle(node)
+ for c in node.children[:]:
+ fixStyles(c)
+
+
+def removeNodes(node):
+ """
+ the parser generates empty Node elements that do
+ nothing but group other nodes. we remove them here
+ """
+ if node.__class__ == Node:
+ # first child of section groups heading text - grouping Node must not be removed
+ if not (node.previous == None and node.parent.__class__ == Section):
+ node.parent.replaceChild(node, node.children)
+ for c in node.children[:]:
+ removeNodes(c)
+
+def removeNewlines(node):
+ """
+ remove newlines, tabs, spaces if we are next to a blockNode
+ """
+ if node.__class__ == Text and not node.getParentNodesByClass(PreFormatted) and not node.getParentNodesByClass(Source):
+ if node.caption.strip() == u"":
+ prev = node.previous or node.parent # previous sibling node or parentnode
+ next = node.next or node.parent.next
+ if not next or next.isblocknode or not prev or prev.isblocknode:
+ node.parent.removeChild(node)
+ node.caption = node.caption.replace("\n", " ")
+
+ for c in node.children[:]:
+ removeNewlines(c)
+
+
+
+
+def buildAdvancedTree(root): # USE WITH CARE
+ """
+ extends and cleans parse trees
+ do not use this funcs without knowing whether these
+ Node modifications fit your problem
+ """
+ extendClasses(root)
+ fixTagNodes(root)
+ removeNodes(root)
+ removeNewlines(root)
+ fixStyles(root)
+
+def getAdvTree(fn):
+ from mwlib.dummydb import DummyDB
+ from mwlib.uparser import parseString
+ db = DummyDB()
+ input = unicode(open(fn).read(), 'utf8')
+ r = parseString(title=fn, raw=input, wikidb=db)
+ buildAdvancedTree(r)
+ return r
+
+
+
diff --git a/mwlib/allnodes.py b/mwlib/allnodes.py
new file mode 100644
index 0000000..ebd6d3b
--- /dev/null
+++ b/mwlib/allnodes.py
@@ -0,0 +1,27 @@
+import mwlib.parser
+import mwlib.advtree
+
+import types
+
+def allnodes():
+ all = set()
+ names = set()
+ for m in (mwlib.parser, mwlib.advtree):
+ for x in dir(m):
+ if x in names:
+ continue
+ k = getattr(m, x)
+ if type(k) == types.TypeType:
+ if issubclass(k, mwlib.parser.Node):
+ all.add(k)
+ names.add(x)
+ return all
+
+
+if __name__ == '__main__':
+ # EXAMPLE THAT SHOWS HOW TO IDENTIFY MISSING NODES
+ from mwlib.parser import Control, Chapter
+ my = set((Control, Chapter))
+ missing = allnodes() - my
+ assert len(missing) == len(allnodes()) -2
+ #print missing
diff --git a/mwlib/apps.py b/mwlib/apps.py
new file mode 100644
index 0000000..55a427e
--- /dev/null
+++ b/mwlib/apps.py
@@ -0,0 +1,378 @@
+
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+
+"""main programs - installed via setuptools' entry_points"""
+
+import optparse
+
+def buildcdb():
+ parser = optparse.OptionParser(usage="%prog --input XMLDUMP --output OUTPUT")
+ parser.add_option("-i", "--input", help="input file")
+ parser.add_option("-o", "--output", help="write output to OUTPUT")
+ options, args = parser.parse_args()
+
+ if args:
+ parser.error("too many arguments.")
+
+
+ input = options.input
+ output = options.output
+
+ if not (input and output):
+ parser.error("missing argument.")
+
+ import os
+ from mwlib import cdbwiki
+
+ cdbwiki.BuildWiki(input, output)()
+ open(os.path.join(output, "wikiconf.txt"), "w").write("""
+[wiki]
+type = cdb
+path = %s
+
+[images]
+type = download
+url = http://upload.wikimedia.org/wikipedia/commons/
+localpath = ~/images
+""" % (os.path.abspath(output),))
+
+def show():
+ parser = optparse.OptionParser(usage="%prog [-e|--expand] --conf CONF ARTICLE [...]")
+ parser.add_option("-c", "--conf", help="config file")
+ parser.add_option("-e", "--expand", action="store_true", help="expand templates")
+ parser.add_option("-t", "--template", action="store_true", help="show template")
+
+ options, args = parser.parse_args()
+
+ if not args:
+ parser.error("missing ARTICLE argument")
+
+ articles = [unicode(x, 'utf-8') for x in args]
+
+ conf = options.conf
+ if not conf:
+ parser.error("missing --conf argument")
+
+ from mwlib import wiki, expander
+
+ db = wiki.makewiki(conf)['wiki']
+
+ for a in articles:
+ if options.template:
+ raw=db.getTemplate(a)
+ else:
+ raw=db.getRawArticle(a)
+
+ if raw:
+ if options.expand:
+ te = expander.Expander(raw, pagename=a, wikidb=db)
+ raw = te.expandTemplates()
+
+ print raw.encode("utf-8")
+
+
+def buildzip():
+ parser = optparse.OptionParser(usage="%prog [OPTIONS] [ARTICLE ...]")
+ parser.add_option("-c", "--conf", help="config file (required unless --baseurl is given)")
+ parser.add_option("-b", "--baseurl", help="base URL for mwapidb backend")
+ parser.add_option("-s", "--shared-baseurl", help="base URL for shared images for mwapidb backend")
+ parser.add_option("-m", "--metabook", help="JSON encoded text file with book structure")
+ parser.add_option('--collectionpage', help='Title of a collection page')
+ parser.add_option("-x", "--noimages", action="store_true", help="exclude images")
+ parser.add_option("-o", "--output", help="write output to OUTPUT")
+ parser.add_option("-p", "--posturl", help="http post to POSTURL")
+ parser.add_option("-i", "--imagesize",
+ help="max. pixel size (width or height) for images (default: 800)")
+ parser.add_option("-d", "--daemonize", action="store_true",
+ help='become daemon after collection articles (before POST request)')
+ parser.add_option("-l", "--logfile", help="log to logfile")
+ parser.add_option("--license", help="Title of article containing full license text")
+ parser.add_option("--template-blacklist", help="Title of article containing blacklisted templates")
+ options, args = parser.parse_args()
+
+ import tempfile
+ import os
+ import zipfile
+
+ from mwlib import utils
+ from mwlib.utils import daemonize
+
+ articles = [unicode(x, 'utf-8') for x in args]
+
+ baseurl = options.baseurl
+ conf = options.conf
+ if not baseurl and not options.conf:
+ parser.error("neither --conf nor --baseurl specified\nuse --help for all options")
+
+ posturl = None
+ def post_status(status):
+ print 'status:', status
+ if not posturl:
+ return
+ try:
+ return urllib2.urlopen(posturl, urllib.urlencode({'status': status})).read()
+ except Exception, e:
+ print 'ERROR posting status %r to %r' % (status, posturl)
+
+ def post_progress(progress):
+ print 'progress', progress
+ if not posturl:
+ return
+ try:
+ return urllib2.urlopen(posturl, urllib.urlencode({'progress': int(progress)})).read()
+ except Exception, e:
+ print 'ERROR posting progress %r to %r' % (progress, posturl)
+
+ try:
+ if options.logfile:
+ utils.start_logging(options.logfile)
+
+ output = options.output
+
+ from mwlib import wiki, recorddb, metabook
+
+ mb = metabook.MetaBook()
+ if conf:
+ from ConfigParser import ConfigParser
+
+ w = wiki.makewiki(conf)
+ cp = ConfigParser()
+ cp.read(conf)
+ license = {
+ 'name': cp.get('wiki', 'defaultarticlelicense')
+ }
+ if license['name'] is not None:
+ license['wikitext'] = w['wiki'].getRawArticle(license['name'])
+ mb.source = {
+ 'name': cp.get('wiki', 'name'),
+ 'url': cp.get('wiki', 'url'),
+ 'defaultarticlelicense': license,
+ }
+ else:
+ w = {
+ 'wiki': wiki.wiki_mwapi(baseurl, options.license, options.template_blacklist),
+ 'images': wiki.image_mwapi(baseurl, shared_base_url=options.shared_baseurl)
+ }
+ metadata = w['wiki'].getMetaData()
+ mb.source = {
+ 'name': metadata['name'],
+ 'url': metadata['url'],
+ 'defaultarticlelicense': metadata['license'],
+ }
+
+ if options.noimages:
+ w['images'] = None
+ else:
+ if options.imagesize:
+ imagesize = int(options.imagesize)
+ else:
+ imagesize = 800
+
+ if output:
+ zipfilename = output
+ else:
+ fd, zipfilename = tempfile.mkstemp()
+ os.close(fd)
+
+ if options.collectionpage:
+ mwcollection = w['wiki'].getRawArticle(options.collectionpage)
+ mb.loadCollectionPage(mwcollection)
+ elif options.metabook:
+ mb.readJsonFile(options.metabook)
+
+ # do not daemonize earlier: Collection extension deletes input metabook file!
+ if options.daemonize:
+ daemonize()
+
+ posturl = options.posturl
+ if posturl:
+ posturl = posturl.encode('utf-8')
+
+ from mwlib.utils import get_multipart
+ import urllib
+ import urllib2
+
+ zf = zipfile.ZipFile(zipfilename, 'w')
+ z = recorddb.ZipfileCreator(zf, w['wiki'], w['images'])
+
+ post_status('parsing')
+
+ for x in articles:
+ z.addArticle(x)
+ mb.addArticles(articles)
+
+ z.addObject('metabook.json', mb.dumpJson())
+ articles = list(mb.getArticles())
+ if articles:
+ inc = 70/len(articles)
+ else:
+ inc = 0
+ p = 0
+ for title, revision in articles:
+ post_progress(p)
+ z.addArticle(title, revision=revision)
+ p += inc
+
+ post_status('packaging')
+
+ if not options.noimages:
+ z.writeImages(size=imagesize)
+
+ post_progress(80)
+
+ z.writeContent()
+ zf.close()
+
+ post_progress(90)
+
+ if posturl:
+ post_status('uploading')
+ zf = open(zipfilename, "rb")
+ ct, data = get_multipart('collection.zip', zf.read(), 'collection')
+ zf.close()
+ req = urllib2.Request(posturl, data=data, headers={"Content-Type": ct})
+ result = urllib2.urlopen(req).read()
+
+ if w['images']:
+ w['images'].clear()
+
+ if not output:
+ os.unlink(zipfilename)
+
+ post_status('finished')
+ post_progress(100)
+ except Exception, e:
+ post_status('error')
+ raise
+
+
+def parse():
+ parser = optparse.OptionParser(usage="%prog [-a|--all] --conf CONF [ARTICLE1 ...]")
+ parser.add_option("-a", "--all", action="store_true", help="parse all articles")
+ parser.add_option("--tb", action="store_true", help="show traceback on error")
+
+ parser.add_option("-c", "--conf", help="config file")
+
+ options, args = parser.parse_args()
+
+ if not args and not options.all:
+ parser.error("missing option.")
+
+ if not options.conf:
+ parser.error("missing --conf argument")
+
+ articles = [unicode(x, 'utf-8') for x in args]
+
+ conf = options.conf
+
+ import traceback
+ from mwlib import wiki, uparser
+
+ w = wiki.makewiki(conf)
+
+ db = w['wiki']
+
+ if options.all:
+ if not hasattr(db, "articles"):
+ raise RuntimeError("%s does not support iterating over all articles" % (db, ))
+ articles = db.articles()
+
+
+ import time
+ for x in articles:
+ try:
+ raw = db.getRawArticle(x)
+ # yes, raw can be None, when we have a redirect to a non-existing article.
+ if raw is None:
+ continue
+ stime=time.time()
+ a=uparser.parseString(x, raw=raw, wikidb=db)
+ except Exception, err:
+ print "F", repr(x), err
+ if options.tb:
+ traceback.print_exc()
+ else:
+ print "G", time.time()-stime, repr(x)
+
+def serve():
+ parser = optparse.OptionParser(usage="%prog --conf CONF ARTICLE [...]")
+ parser.add_option("-c", "--conf", help="config file")
+
+ options, args = parser.parse_args()
+
+
+ conf = options.conf
+ if not options.conf:
+ parser.error("missing --conf argument")
+
+ from mwlib import wiki, web
+
+ res = wiki.makewiki(conf)
+ db = res['wiki']
+ images = res['images']
+ from wsgiref.simple_server import make_server, WSGIServer
+
+ from SocketServer import ForkingMixIn
+ class MyServer(ForkingMixIn, WSGIServer):
+ pass
+
+ iface, port = '0.0.0.0', 8080
+ print "serving on %s:%s" % (iface, port)
+ http = make_server(iface, port, web.Serve(db, res['images']), server_class=MyServer)
+ http.serve_forever()
+
+
+
+def html():
+ parser = optparse.OptionParser(usage="%prog --conf CONF ARTICLE [...]")
+ parser.add_option("-c", "--conf", help="config file")
+
+ options, args = parser.parse_args()
+
+ if not args:
+ parser.error("missing ARTICLE argument")
+
+ articles = [unicode(x, 'utf-8') for x in args]
+
+ conf = options.conf
+ if not options.conf:
+ parser.error("missing --conf argument")
+
+ import StringIO
+ import tempfile
+ import os
+ import webbrowser
+ from mwlib import wiki, uparser, htmlwriter
+
+ res = wiki.makewiki(conf)
+ db = res['wiki']
+ images = res['images']
+
+ for a in articles:
+ raw=db.getRawArticle(a)
+ if not raw:
+ continue
+
+ out=StringIO.StringIO()
+ out.write("""<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="content-type" content="text/html; charset="utf-8"></meta>
+<link rel="stylesheet" href="pedia.css" />
+</head>
+<body>
+
+""")
+
+ a=uparser.parseString(x, raw=raw, wikidb=db)
+ w=htmlwriter.HTMLWriter(out, images)
+ w.write(a)
+
+ fd, htmlfile = tempfile.mkstemp(".html")
+ os.close(fd)
+ open(htmlfile, "wb").write(out.getvalue().encode('utf-8'))
+ webbrowser.open("file://"+htmlfile)
+
+
diff --git a/mwlib/caller.py b/mwlib/caller.py
new file mode 100755
index 0000000..583a123
--- /dev/null
+++ b/mwlib/caller.py
@@ -0,0 +1,20 @@
+#! /usr/bin/env python
+
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+
+import sys
+import os
+
+def caller(n=2):
+ """return caller as string"""
+ f = sys._getframe(n)
+ return "%s:%s" % (f.f_code.co_filename, f.f_lineno)
+
+def short(n=2):
+ """return caller as string"""
+ f = sys._getframe(n)
+ return "%s:%s" % (os.path.basename(f.f_code.co_filename), f.f_lineno)
+
+def callerframe(n=2):
+ return sys._getframe(n)
diff --git a/mwlib/cdb.py b/mwlib/cdb.py
new file mode 100755
index 0000000..9aa2a65
--- /dev/null
+++ b/mwlib/cdb.py
@@ -0,0 +1,262 @@
+#! /usr/bin/env python
+"""
+Dan Bernstein's CDB implemented in Python
+
+see http://cr.yp.to/cdb.html
+
+"""
+
+from __future__ import generators
+
+import os
+import struct
+import mmap
+
+def uint32_unpack(buf):
+ return struct.unpack('<L', buf)[0]
+
+def uint32_pack(n):
+ return struct.pack('<L', n)
+
+CDB_HASHSTART = 5381
+
+def cdb_hash(buf):
+ h = CDB_HASHSTART
+ for c in buf:
+ h = (h + (h << 5)) & 0xffffffffL
+ h ^= ord(c)
+ return h
+
+class Cdb(object):
+
+ def __init__(self, fp):
+ self.fp = fp
+ fd = fp.fileno()
+ self.size = os.fstat(fd).st_size
+ self.map = mmap.mmap(fd, self.size, access=mmap.ACCESS_READ)
+ self.eod = uint32_unpack(self.map[:4])
+ self.findstart()
+ self.loop = 0 # number of hash slots searched under this key
+ # initialized if loop is nonzero
+ self.khash = 0
+ self.hpos = 0
+ self.hslots = 0
+ # initialized if findnext() returns 1
+ self.dpos = 0
+ self.dlen = 0
+
+ def close(self):
+ self.map.close()
+
+ def __iter__(self, fn=None):
+ len = 2048
+ while len < self.eod:
+ klen, vlen = struct.unpack("<LL", self.map[len:len+8])
+ len += 8
+ key = self.map[len:len+klen]
+ len += klen
+ val = self.map[len:len+vlen]
+ len += vlen
+ if fn:
+ yield fn(key, val)
+ else:
+ yield (key, val)
+
+ def iteritems(self):
+ return self.__iter__()
+
+ def iterkeys(self):
+ return self.__iter__(lambda k,v: k)
+
+ def itervalues(self):
+ return self.__iter__(lambda k,v: v)
+
+ def items(self):
+ ret = []
+ for i in self.iteritems():
+ ret.append(i)
+ return ret
+
+ def keys(self):
+ ret = []
+ for i in self.iterkeys():
+ ret.append(i)
+ return ret
+
+ def values(self):
+ ret = []
+ for i in self.itervalues():
+ ret.append(i)
+ return ret
+
+ def findstart(self):
+ self.loop = 0
+
+ def read(self, n, pos):
+ # XXX add code for platforms without mmap
+ return self.map[pos:pos+n]
+
+ def match(self, key, pos):
+ if key == self.read(len(key), pos):
+ return 1
+ else:
+ return 0
+
+ def findnext(self, key):
+ if not self.loop:
+ u = cdb_hash(key)
+ buf = self.read(8, u << 3 & 2047)
+ self.hslots = uint32_unpack(buf[4:])
+ if not self.hslots:
+ raise KeyError
+ self.hpos = uint32_unpack(buf[:4])
+ self.khash = u
+ u >>= 8
+ u %= self.hslots
+ u <<= 3
+ self.kpos = self.hpos + u
+
+ while self.loop < self.hslots:
+ buf = self.read(8, self.kpos)
+ pos = uint32_unpack(buf[4:])
+ if not pos:
+ raise KeyError
+ self.loop += 1
+ self.kpos += 8
+ if self.kpos == self.hpos + (self.hslots << 3):
+ self.kpos = self.hpos
+ u = uint32_unpack(buf[:4])
+ if u == self.khash:
+ buf = self.read(8, pos)
+ u = uint32_unpack(buf[:4])
+ if u == len(key):
+ if self.match(key, pos + 8):
+ dlen = uint32_unpack(buf[4:])
+ dpos = pos + 8 + len(key)
+ return self.read(dlen, dpos)
+ raise KeyError
+
+ def __getitem__(self, key):
+ self.findstart()
+ return self.findnext(key)
+
+ def get(self, key, default=None):
+ self.findstart()
+ try:
+ return self.findnext(key)
+ except KeyError:
+ return default
+
+def cdb_dump(infile):
+ """dump a database in djb's cdbdump format"""
+ db = Cdb(infile)
+ for key,value in db.iteritems():
+ print "+%d,%d:%s->%s" % (len(key), len(value), key, value)
+ print
+
+def cdb_make(outfile, items):
+ pos = 2048
+ tables = {} # { h & 255 : [(h, p)] }
+
+ # write keys and data
+ outfile.seek(pos)
+ for key, value in items:
+ outfile.write(uint32_pack(len(key)) + uint32_pack(len(value)))
+ h = cdb_hash(key)
+ outfile.write(key)
+ outfile.write(value)
+ tables.setdefault(h & 255, []).append((h, pos))
+ pos += 8 + len(key) + len(value)
+
+ final = ''
+ # write hash tables
+ for i in range(256):
+ entries = tables.get(i, [])
+ nslots = 2*len(entries)
+ final += uint32_pack(pos) + uint32_pack(nslots)
+ null = (0, 0)
+ table = [null] * nslots
+ for h, p in entries:
+ n = (h >> 8) % nslots
+ while table[n] is not null:
+ n = (n + 1) % nslots
+ table[n] = (h, p)
+ for h, p in table:
+ outfile.write(uint32_pack(h) + uint32_pack(p))
+ pos += 8
+
+ # write header (pointers to tables and their lengths)
+ outfile.flush()
+ outfile.seek(0)
+ outfile.write(final)
+
+class CdbMake(object):
+ def __init__(self, outfile):
+ self.pos = 2048
+ self.outfile = outfile
+ self.outfile.seek(self.pos)
+ self.tables = {}
+
+ def add(self, key, value):
+ outfile = self.outfile
+ outfile.write(uint32_pack(len(key)) + uint32_pack(len(value)))
+ h = cdb_hash(key)
+ outfile.write(key)
+ outfile.write(value)
+ self.tables.setdefault(h & 255, []).append((h, self.pos))
+ self.pos += 8 + len(key) + len(value)
+
+ def finish(self):
+ final = ''
+ tables = self.tables
+ pos = self.pos
+ outfile = self.outfile
+
+ # write hash tables
+ for i in range(256):
+ entries = tables.get(i, [])
+ nslots = 2*len(entries)
+ final += uint32_pack(pos) + uint32_pack(nslots)
+ null = (0, 0)
+ table = [null] * nslots
+ for h, p in entries:
+ n = (h >> 8) % nslots
+ while table[n] is not null:
+ n = (n + 1) % nslots
+ table[n] = (h, p)
+ for h, p in table:
+ outfile.write(uint32_pack(h) + uint32_pack(p))
+ pos += 8
+
+ # write header (pointers to tables and their lengths)
+ outfile.flush()
+ outfile.seek(0)
+ outfile.write(final)
+
+
+def test():
+ #db = Cdb(open("t"))
+ #print db['one']
+ #print db['two']
+ #print db['foo']
+ #print db['us']
+ #print db.get('ec')
+ #print db.get('notthere')
+ db = open('test.cdb', 'wb')
+ cdb_make(db,
+ [('one', 'Hello'),
+ ('two', 'Goodbye'),
+ ('foo', 'Bar'),
+ ('us', 'United States'),
+ ])
+ db.close()
+ db = Cdb(open("test.cdb", 'rb'))
+ print db['one']
+ print db['two']
+ print db['foo']
+ print db['us']
+ print db.get('ec')
+ print db.get('notthere')
+
+if __name__ == '__main__':
+ test()
diff --git a/mwlib/cdbwiki.py b/mwlib/cdbwiki.py
new file mode 100755
index 0000000..98bb6a7
--- /dev/null
+++ b/mwlib/cdbwiki.py
@@ -0,0 +1,243 @@
+#! /usr/bin/env python
+
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+
+import sys
+import os
+import zlib
+import re
+
+from mwlib import cdb
+
+try:
+ from xml.etree import cElementTree
+except ImportError:
+ import cElementTree
+
+ns = '{http://www.mediawiki.org/xml/export-0.3/}'
+
+wikiindex = "wikiidx"
+wikidata = "wikidata.bin"
+
+
+
+def normname(name):
+ name = name.strip().replace("_", " ")
+ name = name[:1].upper()+name[1:]
+ return name
+
+class Tags:
+ page = ns + 'page'
+
+ # <title> inside <page>
+ title = ns + 'title'
+
+ # <revision> inside <page>
+ revision = ns + 'revision'
+
+ # <id> inside <revision>
+ revid = ns + 'id'
+
+ # <contributor><username> inside <revision>
+ username = ns + 'contributor/' + ns + 'username'
+
+ # <text> inside <revision>
+ text = ns + 'text'
+
+ # <timestamp> inside <revision>
+ timestamp = ns + 'timestamp'
+
+ # <revision><text> inside <page>
+ revision_text = ns + 'revision/' + ns + 'text'
+
+ siteinfo = ns + "siteinfo"
+
+class DumpParser(object):
+ category_ns = set(['category', 'kategorie'])
+ image_ns = set(['image', 'bild'])
+ template_ns = set(['template', 'vorlage'])
+ wikipedia_ns = set(['wikipedia'])
+
+ tags = Tags()
+
+
+ def __init__(self, xmlfilename):
+ self.xmlfilename = xmlfilename
+
+ def _write(self, msg):
+ sys.stdout.write(msg)
+ sys.stdout.flush()
+
+ def openInputStream(self):
+ if self.xmlfilename.lower().endswith(".bz2"):
+ f = os.popen("bunzip2 -c %s" % self.xmlfilename, "r")
+ elif self.xmlfilename.lower().endswith(".7z"):
+ f = os.popen("7z -so x %s" % self.xmlfilename, "r")
+ else:
+ f = open(self.xmlfilename, "r")
+
+ return f
+
+ def __call__(self):
+ f = self.openInputStream()
+
+ count = 0
+ for event, elem in cElementTree.iterparse(f):
+ if elem.tag != self.tags.page:
+ continue
+ self.handlePageElement(elem)
+ elem.clear()
+ count += 1
+
+ if count % 5000 == 0:
+ self._write(" %s\n" % count)
+ elif count % 100 == 0:
+ self._write(".")
+
+
+ def handlePageElement(self, page):
+ title = page.find(self.tags.title).text
+ revisions = page.findall(self.tags.revision)
+ if not revisions:
+ return
+ revision = revisions[-1]
+
+ texttag = revision.find(self.tags.text)
+ timestamptag = revision.find(self.tags.timestamp)
+ revision.clear()
+
+ if texttag is not None:
+ text = texttag.text
+ texttag.clear()
+ else:
+ text = None
+
+ if timestamptag is not None:
+ timestamp = timestamptag.text
+ timestamptag.clear()
+ else:
+ timestamp = None
+
+ if not text:
+ return
+
+ if isinstance(title, str):
+ title = unicode(title)
+ if isinstance(text, str):
+ text = unicode(text)
+
+
+ if ':' in title:
+ ns, rest = title.split(':', 1)
+ ns = ns.lower()
+ if ns not in self.template_ns:
+ return
+ self.handleTemplate(rest, text, timestamp)
+ else:
+ self.handleArticle(title, text, timestamp)
+
+ def handleArticle(self, title, text, timestamp):
+ print "ART:", repr(title), len(text), timestamp
+
+ def handleTemplate(self, title, text, timestamp):
+ print "TEMPL:", repr(title), len(text), timestamp
+
+class BuildWiki(DumpParser):
+ def __init__(self, xmlfilename, outputdir):
+ DumpParser.__init__(self, xmlfilename)
+ self.outputdir = outputdir
+
+ def __call__(self):
+ if not os.path.exists(self.outputdir):
+ os.makedirs(self.outputdir)
+
+ n = os.path.join(self.outputdir, wikiindex)
+ out = open(os.path.join(self.outputdir, wikidata), "wb")
+ self.out = out
+ f = open(n+'.cdb', 'wb')
+ c = cdb.CdbMake(f)
+ self.cdb = c
+
+ DumpParser.__call__(self)
+ c.finish()
+ f.close()
+
+
+ def _writeobj(self, key, val):
+ key = key.encode("utf-8")
+ val = zlib.compress(val)
+ pos = self.out.tell()
+ self.out.write(val)
+ self.cdb.add(key, "%s %s" % (pos, len(val)))
+
+ def handleArticle(self, title, text, timestamp):
+ self._writeobj(u":"+title, text.encode("utf-8"))
+
+ def handleTemplate(self, title, text, timestamp):
+ self._writeobj(u"T:"+title, text.encode("utf-8"))
+
+
+
+class WikiDB(object):
+ redirect_rex = re.compile(r'^#Redirect:?\s*?\[\[(?P<redirect>.*?)\]\]', re.IGNORECASE)
+
+ def __init__(self, dir):
+ self.dir = dir
+ self.obj2pos_path = os.path.join(self.dir, wikidata)
+ self.cdb = cdb.Cdb(open(os.path.join(self.dir, wikiindex+'.cdb'), 'rb'))
+
+ def _readobj(self, key):
+ key = key.encode("utf-8")
+
+ try:
+ data = self.cdb[key]
+ except KeyError:
+ return None
+
+ pos, len = map(int, data.split())
+
+ f=open(self.obj2pos_path, "rb")
+ f.seek(pos)
+ d=f.read(len)
+ f.close()
+ return zlib.decompress(d)
+
+ def getRawArticle(self, title, raw=None, revision=None):
+ title = normname(title)
+ res = self._readobj(":"+title)
+ if res is None:
+ return None
+
+ res = unicode(res, 'utf-8')
+ mo = self.redirect_rex.search(res)
+ if mo:
+ redirect = mo.group('redirect')
+ redirect = normname(redirect.split("|", 1)[0].split("#", 1)[0])
+
+ return self.getRawArticle(redirect)
+
+ return res
+
+ def getTemplate(self, title, followRedirects=False):
+ if ":" in title:
+ title = title.split(':', 1)[1]
+
+ title = normname(title)
+ res = unicode(self._readobj(u"T:"+title) or "", 'utf-8')
+ if not res:
+ return res
+
+ mo = self.redirect_rex.search(res)
+ if mo:
+ redirect = mo.group('redirect')
+ redirect = normname(redirect.split("|", 1)[0].split("#", 1)[0])
+ return self.getTemplate(redirect)
+ return res
+
+
+ def articles(self):
+ for k, v in self.cdb:
+ if k[0]==':':
+ k = unicode(k[1:], "utf-8")
+ yield k
diff --git a/mwlib/dummydb.py b/mwlib/dummydb.py
new file mode 100644
index 0000000..e17a90f
--- /dev/null
+++ b/mwlib/dummydb.py
@@ -0,0 +1,10 @@
+
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+
+class DummyDB(object):
+ def getRawArticle(self, name):
+ return None
+
+ def getTemplate(self, name, followRedirects=False):
+ return None
diff --git a/mwlib/expander.py b/mwlib/expander.py
new file mode 100755
index 0000000..fe12994
--- /dev/null
+++ b/mwlib/expander.py
@@ -0,0 +1,586 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+
+from __future__ import with_statement
+import sys
+import re
+import os
+from mwlib import magics
+import mwlib.log
+from pylru import lrudecorator
+
+DEBUG = "DEBUG_EXPANDER" in os.environ
+
+
+log = mwlib.log.Log("expander")
+
+splitpattern = """
+({{+) # opening braces
+|(}}+) # closing braces
+|(\[\[|\]\]) # link
+|((?:<noinclude>.*?</noinclude>)|(?:</?includeonly>)) # noinclude, comments: usually ignore
+|(?P<text>(?:<nowiki>.*?</nowiki>) # nowiki
+|(?:<math>.*?</math>)
+|(?:<imagemap[^<>]*>.*?</imagemap>)
+|(?:<gallery[^<>]*>.*?</gallery>)
+|(?:<source[^<>]*>.*?</source>)
+|(?:<pre.*?>.*?</pre>)
+|(?:=)
+|(?:[:\[\]\|{}<]) # all special characters
+|(?:[^=\[\]\|:{}<]*)) # all others
+"""
+
+splitrx = re.compile(splitpattern, re.VERBOSE | re.DOTALL | re.IGNORECASE)
+
+onlyincluderx = re.compile("<onlyinclude>(.*?)</onlyinclude>", re.DOTALL | re.IGNORECASE)
+
+commentrx = re.compile(r"(\n *)?<!--.*?-->( *\n)?", re.DOTALL)
+
+def remove_comments(txt):
+ def repl(m):
+ #print "M:", repr(txt[m.start():m.end()])
+ if txt[m.start()]=='\n' and txt[m.end()-1]=='\n':
+ return '\n'
+ return (m.group(1) or "")+(m.group(2) or "")
+ return commentrx.sub(repl, txt)
+
+def preprocess(txt):
+ txt=txt.replace("\t", " ")
+ txt=remove_comments(txt)
+ return txt
+
+class symbols:
+ bra_open = 1
+ bra_close = 2
+ link = 3
+ noi = 4
+ txt = 5
+
+def old_tokenize(txt):
+ txt = preprocess(txt)
+
+ if "<onlyinclude>" in txt:
+ # if onlyinclude tags are used, only use text between those tags. template 'legend' is a example
+ txt = "".join(onlyincluderx.findall(txt))
+
+
+ tokens = []
+ for (v1, v2, v3, v4, v5) in splitrx.findall(txt):
+ if v5:
+ tokens.append((5, v5))
+ elif v4:
+ tokens.append((4, v4))
+ elif v3:
+ tokens.append((3, v3))
+ elif v2:
+ tokens.append((2, v2))
+ elif v1:
+ tokens.append((1, v1))
+
+ tokens.append((None, ''))
+
+ return tokens
+
+
+def new_tokenize(txt):
+ txt = preprocess(txt)
+
+ import _expander
+
+ if "<onlyinclude>" in txt:
+ # if onlyinclude tags are used, only use text between those tags. template 'legend' is a example
+ txt = "".join(onlyincluderx.findall(txt))
+
+ txt=txt+u'\0'
+ tokens = _expander.scan(txt)
+
+ res = []
+ for t in tokens:
+ type,start,len=t
+ if type:
+ res.append((type, txt[start:start+len]))
+ else:
+ res.append((None, ''))
+
+
+ return res
+
+tokenize = old_tokenize
+
+
+
+class Node(object):
+ def __init__(self):
+ self.children = []
+
+ def __repr__(self):
+ return "<%s %s children>" % (self.__class__.__name__, len(self.children))
+
+ def __iter__(self):
+ for x in self.children:
+ yield x
+
+ def show(self, out=None):
+ show(self, out=out)
+
+class Variable(Node):
+ pass
+
+class Template(Node):
+ pass
+
+def show(node, indent=0, out=None):
+ if out is None:
+ out=sys.stdout
+
+ out.write("%s%r\n" % (" "*indent, node))
+ if isinstance(node, basestring):
+ return
+ for x in node.children:
+ show(x, indent+1, out)
+
+def optimize(node):
+ if isinstance(node, basestring):
+ return node
+
+ if type(node) is Node and len(node.children)==1:
+ return optimize(node.children[0])
+
+ for i, x in enumerate(node.children):
+ node.children[i] = optimize(x)
+ return node
+
+
+class Parser(object):
+
+ def __init__(self, txt):
+ self.txt = txt
+ self.tokens = tokenize(txt)
+ self.pos = 0
+
+ def getToken(self):
+ return self.tokens[self.pos]
+
+ def setToken(self, tok):
+ self.tokens[self.pos] = tok
+
+
+ def variableFromChildren(self, children):
+ v=Variable()
+ name = Node()
+ v.children.append(name)
+
+ try:
+ idx = children.index(u"|")
+ except ValueError:
+ name.children = children
+ else:
+ name.children = children[:idx]
+ v.children.extend(children[idx+1:])
+ return v
+
+ def _eatBrace(self, num):
+ ty, txt = self.getToken()
+ assert ty == symbols.bra_close
+ assert len(txt)>= num
+ newlen = len(txt)-num
+ if newlen==0:
+ self.pos+=1
+ return
+
+ if newlen==1:
+ ty = symbols.txt
+
+ txt = txt[:newlen]
+ self.setToken((ty, txt))
+
+
+ def templateFromChildren(self, children):
+ t=Template()
+ # find the name
+ name = Node()
+ t.children.append(name)
+
+ # empty blocks are a fact of life
+ if len(children) == 0:
+ return t
+
+ for idx, c in enumerate(children):
+ if c==u'|':
+ break
+ name.children.append(c)
+
+
+ # find the arguments
+
+
+ arg = Node()
+
+ linkcount = 0
+ for idx, c in enumerate(children[idx+1:]):
+ if c==u'[[':
+ linkcount += 1
+ elif c==']]':
+ linkcount -= 1
+ elif c==u'|' and linkcount==0:
+ t.children.append(arg)
+ arg = Node()
+ continue
+ arg.children.append(c)
+
+
+ if arg.children:
+ t.children.append(arg)
+
+
+ return t
+
+ def parseOpenBrace(self):
+ ty, txt = self.getToken()
+ n = Node()
+
+ numbraces = len(txt)
+ self.pos += 1
+
+ while 1:
+ ty, txt = self.getToken()
+ if ty==symbols.bra_open:
+ n.children.append(self.parseOpenBrace())
+ elif ty is None:
+ break
+ elif ty==symbols.bra_close:
+ closelen = len(txt)
+ if closelen==2 or numbraces==2:
+ t=self.templateFromChildren(n.children)
+ n=Node()
+ n.children.append(t)
+ self._eatBrace(2)
+ numbraces-=2
+ else:
+ v=self.variableFromChildren(n.children)
+ n=Node()
+ n.children.append(v)
+ self._eatBrace(3)
+ numbraces -= 3
+
+ if numbraces==0:
+ break
+ elif numbraces==1:
+ n.children.insert(0, "{")
+ break
+ elif ty==symbols.noi:
+ self.pos += 1 # ignore <noinclude>
+ else: # link, txt
+ n.children.append(txt)
+ self.pos += 1
+
+ return n
+
+ def parse(self):
+ n = Node()
+ while 1:
+ ty, txt = self.getToken()
+ if ty==symbols.bra_open:
+ n.children.append(self.parseOpenBrace())
+ elif ty is None:
+ break
+ elif ty==symbols.noi:
+ self.pos += 1 # ignore <noinclude>
+ else: # bra_close, link, txt
+ n.children.append(txt)
+ self.pos += 1
+ return n
+
+def parse(txt):
+ return optimize(Parser(txt).parse())
+
+class MemoryLimitError(Exception):
+ pass
+
+class LazyArgument(object):
+ def __init__(self, node, expander, variables):
+ self.node = node
+ self.expander = expander
+ self._flatten = None
+ self.variables = variables
+ self._splitflatten = None
+
+ def _flattennode(self, n):
+ arg=[]
+ self.expander.flatten(n, arg, self.variables)
+ arg = u"".join(arg)
+
+ if len(arg)>256*1024:
+ raise MemoryLimitError("template argument too long: %s bytes" % (len(arg),))
+ return arg
+
+ def splitflatten(self):
+ if self._splitflatten is None:
+ try:
+ idx = self.node.children.index(u'=')
+ except ValueError:
+ name = None
+ val = self.node
+ else:
+ name = self.node
+ val = Node()
+ val.children[:] = self.node.children[idx+1:]
+ oldchildren = self.node.children[:]
+ del self.node.children[idx:]
+
+ name = self._flattennode(name)
+ self.node.children = oldchildren
+
+ val = self._flattennode(val)
+
+ self._splitflatten = name, val
+ return self._splitflatten
+
+ def flatten(self):
+ if self._flatten is None:
+ self._flatten = self._flattennode(self.node).strip()
+ arg=[]
+ self.expander.flatten(self.node, arg, self.variables)
+
+ arg = u"".join(arg).strip()
+ if len(arg)>256*1024:
+ raise MemoryLimitError("template argument too long: %s bytes" % (len(arg),))
+
+ self._flatten = arg
+ return self._flatten
+
+class ArgumentList(object):
+ class notfound: pass
+
+ def __init__(self):
+ self.args = []
+ self.namedargs = {}
+ def __repr__(self):
+ return "<ARGLIST args=%r>" % ([x.flatten() for x in self.args],)
+ def append(self, a):
+ self.args.append(a)
+
+ def get(self, n, default):
+ return self.__getitem__(n) or default
+
+ def __iter__(self):
+ for x in self.args:
+ yield x
+
+ def __getslice__(self, i, j):
+ for x in self.args[i:j]:
+ yield x.flatten()
+
+ def __len__(self):
+ return len(self.args)
+
+ def __getitem__(self, n):
+ if isinstance(n, (int, long)):
+ try:
+ a=self.args[n]
+ except IndexError:
+ return u""
+ return a.flatten()
+
+ assert isinstance(n, basestring), "expected int or string"
+
+ varcount=1
+ if n not in self.namedargs:
+ for x in self.args:
+ name, val = x.splitflatten()
+ if name is not None:
+ name = name.strip()
+ val = val.strip()
+ self.namedargs[name] = val
+ if n==name:
+ return val
+ else:
+ name = str(varcount)
+ varcount+=1
+ self.namedargs[name] = val
+
+ if n==name:
+ return val
+ self.namedargs[n] = u''
+
+ val = self.namedargs[n]
+
+ return val
+
+
+class Expander(object):
+ def __init__(self, txt, pagename="", wikidb=None, templateprefix='Template:', templateblacklist=set(), lang='en'):
+ assert wikidb is not None, "must supply wikidb argument in Expander.__init__"
+ self.db = wikidb
+ self.resolver = magics.MagicResolver(pagename=pagename)
+ self.resolver.wikidb = wikidb
+ self.templateprefix = templateprefix
+ self.templateblacklist = templateblacklist
+ self.lang = lang
+ self.parsed = Parser(txt).parse()
+ #show(self.parsed)
+ self.parsedTemplateCache = {}
+
+ @lrudecorator(100)
+ def getParsedTemplate(self, name):
+ if name.startswith("[["):
+ return None
+
+ if name == '':
+ return ''
+
+ if name.startswith(":"):
+ log.info("including article")
+ raw = self.db.getRawArticle(name[1:])
+ else:
+ if len(name) > 1:
+ name = name[0].capitalize() + name[1:]
+ name = self.templateprefix + name
+
+ # Check to see if this is a template in our blacklist --
+ # one that we don't want to bother rendering.
+ if name in self.templateblacklist:
+ log.info("Skipping template " + name.encode('utf8'))
+ raw = None
+ else:
+ raw = self.db.getTemplate(name, True)
+
+ if raw is None:
+ log.warn("no template", repr(name))
+ res = None
+ else:
+ # add newline to templates starting with a (semi)colon, or tablemarkup
+ # XXX what else? see test_implicit_newline in test_expander
+ if raw.startswith(":") or raw.startswith(";") or raw.startswith("{|"):
+ raw = '\n'+raw
+
+ log.info("parsing template", repr(name))
+ res = Parser(raw).parse()
+ if DEBUG:
+ print "TEMPLATE:", name, repr(raw)
+ res.show()
+
+ return res
+
+
+ def flatten(self, n, res, variables):
+ if isinstance(n, Template):
+ name = []
+ self.flatten(n.children[0], name, variables)
+ name = u"".join(name).strip()
+ if len(name)>256*1024:
+ raise MemoryLimitError("template name too long: %s bytes" % (len(name),))
+
+ remainder = None
+ if ":" in name:
+ try_name, try_remainder = name.split(':', 1)
+ if self.resolver.has_magic(try_name):
+ name=try_name
+ remainder = try_remainder
+
+ var = ArgumentList()
+
+ varcount = 1 #unnamed vars
+
+ def args():
+ if remainder is not None:
+ tmpnode=Node()
+ tmpnode.children.append(remainder)
+ yield tmpnode
+ for x in n.children[1:]:
+ yield x
+
+ for x in args():
+ var.append(LazyArgument(x, self, variables))
+
+ rep = self.resolver(name, var)
+
+ if rep is not None:
+ res.append(rep)
+ else:
+ p = self.getParsedTemplate(name)
+ if p:
+ if DEBUG:
+ msg = "EXPANDING %r %s ===> " % (name, var)
+ oldidx = len(res)
+ self.flatten(p, res, var)
+
+ if DEBUG:
+ msg += "".join(res[oldidx:])
+ print msg
+
+
+ elif isinstance(n, Variable):
+ name = []
+ self.flatten(n.children[0], name, variables)
+ name = u"".join(name).strip()
+ if len(name)>256*1024:
+ raise MemoryLimitError("template name too long: %s bytes" % (len(name),))
+
+ v = variables.get(name, None)
+
+ if v is None:
+ if len(n.children)>1:
+ self.flatten(n.children[1:], res, variables)
+ else:
+ pass
+ # FIXME. breaks If
+ #res.append(u"{{{%s}}}" % (name,))
+ else:
+ res.append(v)
+ else:
+ for x in n:
+ if isinstance(x, basestring):
+ res.append(x)
+ else:
+ self.flatten(x, res, variables)
+
+ def expandTemplates(self):
+ res = []
+ self.flatten(self.parsed, res, ArgumentList())
+ return u"".join(res)
+
+
+class DictDB(object):
+ """wikidb implementation used for testing"""
+ def __init__(self, *args, **kw):
+ if args:
+ self.d, = args
+ else:
+ self.d = {}
+
+ self.d.update(kw)
+
+ normd = {}
+ for k, v in self.d.items():
+ normd[k.lower()] = v
+ self.d = normd
+
+ def getRawArticle(self, title):
+ return self.d[title.lower()]
+
+ def getTemplate(self, title, dummy):
+ return self.d.get(title.lower(), u"")
+
+def expandstr(s, expected=None, wikidb=None):
+ """debug function. expand templates in string s"""
+ if wikidb:
+ db = wikidb
+ else:
+ db = DictDB(dict(a=s))
+
+ te = Expander(s, pagename="thispage", wikidb=db)
+ res = te.expandTemplates()
+ print "EXPAND: %r -> %r" % (s, res)
+ if expected:
+ assert res==expected, "expected %r, got %r" % (expected, res)
+ return res
+
+if __name__=="__main__":
+ #print splitrx.groupindex
+ d=unicode(open(sys.argv[1]).read(), 'utf8')
+ e = Expander(d)
+ print e.expandTemplates()
diff --git a/mwlib/expr.py b/mwlib/expr.py
new file mode 100755
index 0000000..fa11ce9
--- /dev/null
+++ b/mwlib/expr.py
@@ -0,0 +1,222 @@
+#! /usr/bin/env python
+
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+# based on pyparsing example code (SimpleCalc.py)
+
+"""Implementation of mediawiki's #expr template.
+http://meta.wikimedia.org/wiki/ParserFunctions#.23expr:
+"""
+
+from __future__ import division
+
+import re
+import inspect
+import math
+
+class ExprError(Exception):
+ pass
+
+def _myround(a,b):
+ r=round(a, int(b))
+ if int(r)==r:
+ return int(r)
+ return r
+
+
+pattern = """
+(?:\s+)
+|((?:(?:\d+)(?:\.\d+)?
+ |(?:\.\d+)) (?:e(?:\+|-)?\d+)?)
+|(\+|-|\*|/|>=|<=|<>|!=|[a-zA-Z]+|.)
+"""
+
+rxpattern = re.compile(pattern, re.VERBOSE | re.DOTALL | re.IGNORECASE)
+def tokenize(s):
+ res = []
+ for (v1,v2) in rxpattern.findall(s):
+ if not (v1 or v2):
+ continue
+ v2=v2.lower()
+ if v2 in Expr.constants:
+ res.append((v2,""))
+ else:
+ res.append((v1,v2))
+ return res
+
+ return [(v1,v2.lower()) for (v1,v2) in rxpattern.findall(s) if v1 or v2]
+
+class uminus: pass
+class uplus: pass
+
+precedence = {"(":-1, ")":-1}
+functions = {}
+
+def addop(op, prec, fun, numargs=None):
+ precedence[op] = prec
+ if numargs is None:
+ numargs = len(inspect.getargspec(fun)[0])
+
+
+ def wrap(stack):
+ assert len(stack)>=numargs
+ args = tuple(stack[-numargs:])
+ del stack[-numargs:]
+ stack.append(fun(*args))
+
+ functions[op] = wrap
+
+a=addop
+a(uminus, 10, lambda x: -x)
+a(uplus, 10, lambda x: x)
+a("^", 10, math.pow, 2)
+a("not", 9, lambda x:int(not(bool(x))))
+a("abs", 9, abs, 1)
+a("sin", 9, math.sin, 1)
+a("cos", 9, math.cos, 1)
+a("asin", 9, math.asin, 1)
+a("acos", 9, math.acos, 1)
+a("tan", 9, math.tan, 1)
+a("atan", 9, math.atan, 1)
+a("exp", 9, math.exp, 1)
+a("ln", 9, math.log, 1)
+a("ceil", 9, lambda x: int(math.ceil(x)))
+a("floor", 9, lambda x: int(math.floor(x)))
+a("trunc", 9, long, 1)
+
+a("*", 8, lambda x,y: x*y)
+a("/", 8, lambda x,y: x/y)
+a("div", 8, lambda x,y: x/y)
+a("mod", 8, lambda x,y: int(x)%int(y))
+
+
+a("+", 6, lambda x,y: x+y)
+a("-", 6, lambda x,y: x-y)
+
+a("round", 5, _myround)
+
+a("<", 4, lambda x,y: int(x<y))
+a(">", 4, lambda x,y: int(x>y))
+a("<=", 4, lambda x,y: int(x<=y))
+a(">=", 4, lambda x,y: int(x>=y))
+a("!=", 4, lambda x,y: int(x!=y))
+a("<>", 4, lambda x,y: int(x!=y))
+a("=", 4, lambda x,y: int(x==y))
+
+a("and", 3, lambda x,y: int(bool(x) and bool(y)))
+a("or", 2, lambda x,y: int(bool(x) or bool(y)))
+del a
+
+class Expr(object):
+ constants = dict(
+ e=math.e,
+ pi=math.pi)
+
+ def as_float_or_int(self, s):
+ try:
+ return self.constants[s]
+ except KeyError:
+ pass
+
+ if "." in s or "e" in s.lower():
+ return float(s)
+ return long(s)
+
+ def output_operator(self, op):
+ return functions[op](self.operand_stack)
+
+ def output_operand(self, operand):
+ self.operand_stack.append(operand)
+
+ def parse_expr(self, s):
+ tokens = tokenize(s)
+ if not tokens:
+ return ""
+
+ self.operand_stack = []
+ operator_stack = []
+
+ seen_operand=False
+
+ last_operand, last_operator = False, True
+
+ for operand, operator in tokens:
+ if operand:
+ if last_operand:
+ raise ExprError("expected operator")
+ self.output_operand(self.as_float_or_int(operand))
+ elif operator=="(":
+ operator_stack.append("(")
+ elif operator==")":
+ while 1:
+ if not operator_stack:
+ raise ExprError("unbalanced parenthesis")
+ t = operator_stack.pop()
+ if t=="(":
+ break
+ self.output_operator(t)
+ elif operator in precedence:
+ if last_operator and last_operator!=")":
+ if operator=='-':
+ operator = uminus
+ elif operator=='+':
+ operator = uplus
+
+ is_unary = operator in (uplus, uminus)
+ prec = precedence[operator]
+ while not is_unary and operator_stack and prec<=precedence[operator_stack[-1]]:
+ p = operator_stack.pop()
+ self.output_operator(p)
+ operator_stack.append(operator)
+ else:
+ raise ExprError("unknown operator: %r" % (operator,))
+
+ last_operand, last_operator = operand, operator
+
+
+ while operator_stack:
+ p=operator_stack.pop()
+ if p=="(":
+ raise ExprError("unbalanced parenthesis")
+ self.output_operator(p)
+
+ if len(self.operand_stack)!=1:
+ raise ExprError("bad stack: %s" % (self.operand_stack,))
+
+ return self.operand_stack[-1]
+
+def expr(s):
+ return Expr().parse_expr(s)
+
+def main():
+ ParseException = ExprError
+ import time
+ try:
+ import readline # do not remove. makes raw_input use readline
+ readline
+ except ImportError:
+ pass
+
+ ep = expr
+
+ while 1:
+ input_string = raw_input("> ")
+ if not input_string:
+ continue
+
+ stime = time.time()
+ try:
+ res=expr(input_string)
+ except Exception, err:
+ print "ERROR:", err
+ import traceback
+ traceback.print_exc()
+
+ continue
+ print res
+ print time.time()-stime, "s"
+
+if __name__=='__main__':
+ main()
+
+
diff --git a/mwlib/htmlwriter.py b/mwlib/htmlwriter.py
new file mode 100755
index 0000000..6a89157
--- /dev/null
+++ b/mwlib/htmlwriter.py
@@ -0,0 +1,447 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+
+import os
+from mwlib import parser, rendermath, timeline
+
+import urllib
+import cgi
+
+#from PIL import Image
+
+from mwlib.log import Log
+
+log = Log("htmlwriter")
+
+class HTMLWriter(object):
+ imglevel = 0
+ namedLinkCount = 1
+ def __init__(self, out, images=None, math_renderer=None):
+ self.out = out
+ self.level = 0
+ self.images = images
+ # self.images = imgdb.ImageDB(os.path.expanduser("~/images"))
+ self.references = []
+ if math_renderer is None:
+ self.math_renderer = rendermath.Renderer()
+ else:
+ self.math_renderer = math_renderer
+
+ def _write(self, s):
+ self.out.write(cgi.escape(s).encode('utf8'))
+
+ def getCategoryList(self, obj):
+ categories = list(set(c.target for c in obj.find(parser.CategoryLink)))
+ categories.sort()
+ return categories
+
+ def write(self, obj):
+ m = "write" + obj.__class__.__name__
+ m=getattr(self, m)
+ try:
+ m(obj)
+ except:
+ print "Error trying to write %s" % obj
+
+ def ignore(self, obj):
+ pass
+
+ def serializeVList(self,vlist):
+ args = []
+ styleArgs = []
+ gotClass = 0
+ gotExtraClass = 0
+ for (key,value) in vlist.items():
+ if isinstance(value, (basestring, int)):
+ if key=="class":
+ args.append('%s="%s"' % (key, value))
+ gotClass = 1
+ else:
+ args.append('%s="%s"' % (key, value))
+ if isinstance(value, dict) and key=="style":
+ for (_key,_value) in value.items():
+ styleArgs.append("%s:%s" % (_key, _value))
+ args.append(' style="%s"' % ';'.join(styleArgs))
+ gotExtraClass = 1
+ return ' '.join(args)
+
+
+ def writeMagic(self, m):
+ if m.values.get('html'):
+ for x in m.children:
+ self.write(x)
+
+ def writeCaption(self, obj):
+ # todo- A table contained a Caption node, causing an exception in write.
+ # Not sure what the HTML should be, if any.
+ pass
+
+ def writeSection(self, obj):
+ header = "h%s" % (obj.level)
+ self.out.write("<%s>" % header)
+ self.write(obj.children[0])
+ self.out.write("</%s>" % header)
+
+ self.level += 1
+ for x in obj.children[1:]:
+ self.write(x)
+ self.level -= 1
+
+ def writePreFormatted(self, n):
+ self.out.write("<pre>")
+ for x in n:
+ self.write(x)
+ self.out.write("</pre>")
+
+ def writeNode(self, n):
+ for x in n:
+ self.write(x)
+
+ def writeCell(self, cell):
+ svl = ""
+ if cell.vlist:
+ svl = self.serializeVList(cell.vlist)
+
+ self.out.write('<td %s>' % svl)
+ for x in cell:
+ self.write(x)
+ self.out.write("</td>")
+
+ def writeTagNode(self, t):
+ if t.caption == 'ref':
+ if t.children:
+ self.references.append(t)
+ svl = ""
+ if t.vlist:
+ svl = self.serializeVList(t.vlist)
+
+ self.out.write("<sup %s>%s</sup>" % (svl, len(self.references)))
+
+ return
+ elif t.caption == 'references':
+ if not self.references:
+ return
+
+ self.out.write("<ol>")
+ for r in self.references:
+ svl = ""
+ if r.vlist:
+ svl = self.serializeVList(r.vlist)
+ self.out.write("<li %s>" % svl)
+ for x in r:
+ self.write(x)
+ self.out.write("</li>")
+ self.out.write("</ol>")
+
+ self.references = []
+ return
+ elif t.caption=='imagemap':
+ # FIXME. this is not complete. t.imagemap.entries should also be handled.
+ print "WRITEIMAGEMAP:", t.imagemap
+ if t.imagemap.imagelink:
+ self.write(t.imagemap.imagelink)
+ return
+
+
+ self.out.write(t.starttext.encode('utf8'))
+ for x in t:
+ self.write(x)
+ self.out.write(t.endtext.encode('utf8'))
+
+ def writeRow(self, row):
+ svl = ""
+ if row.vlist:
+ svl = self.serializeVList(row.vlist)
+ self.out.write('<tr %s>' % svl)
+ for x in row:
+ self.write(x)
+
+ self.out.write('</tr>')
+
+ def writeTable(self, t):
+ svl = ""
+ if t.vlist:
+ svl = self.serializeVList(t.vlist)
+
+
+
+ self.out.write("<table %s>" % svl)
+ if t.caption:
+ self.out.write("<caption>")
+ self.write(t.caption)
+ self.out.write("<caption>")
+ for x in t:
+ self.write(x)
+ self.out.write("</table>")
+
+ def writeMath(self, obj):
+ latex = obj.caption
+ p = self.math_renderer.render(latex)
+ self.out.write(p)
+
+ def writeURL(self, obj):
+ self.out.write('<a href="%s" class="offsite" ttid="externallink">' % obj.caption)
+ if obj.children:
+ for x in obj.children:
+ self.write(x)
+ else:
+ self.out.write(obj.caption)
+
+ self.out.write('&nbsp;<img src="/static/outgoing_link.gif" /></a>')
+
+ def writeNamedURL(self, obj):
+ self.out.write('<a href="%s" class="offsite" ttid="externallink">' % obj.caption)
+ if obj.children:
+ for x in obj.children:
+ self.write(x)
+ else:
+ name = "[%s]" % self.namedLinkCount
+ self.namedLinkCount += 1
+ self.out.write(name)
+
+ self.out.write('&nbsp;<img src="/static/outgoing_link.gif" /></a>')
+
+
+ def writeParagraph(self, obj):
+ self.out.write("\n<p>")
+ for x in obj:
+ self.write(x)
+ self.out.write("</p>\n")
+
+ def getHREF(self, obj):
+ parts = obj.target.encode('utf-8').split('#')
+ parts[0] = parts[0].replace(" ", "_")
+
+
+ return '../%s/' % ("#".join([urllib.quote(x) for x in parts]))
+
+ writeLangLink = ignore
+
+ def writeLink(self, obj):
+ if obj.target is None:
+ return
+
+ href = self.getHREF(obj)
+ if href is not None:
+ self.out.write('<a href="%s" class="normallink">' % (href,))
+ else:
+ self.out.write('<a class="deadlink">')
+ if obj.children:
+ for x in obj.children:
+ self.write(x)
+ else:
+ self._write(obj.target)
+
+ self.out.write("</a>")
+
+ def writeSpecialLink(self, obj):
+ if obj.children:
+ for x in obj.children:
+ self.write(x)
+ else:
+ self._write(obj.target)
+
+ def writeCategoryLink(self, obj):
+ if obj.colon:
+ if obj.children:
+ for x in obj.children:
+ self.write(x)
+ else:
+ self._write(obj.target)
+
+ def writeTimeline(self, obj):
+ #img = timeline.drawTimeline(obj.caption)
+ img = None
+ if img is None:
+ return
+
+ target = "/timeline/"+os.path.basename(img)
+ width, height = Image.open(img).size
+
+ self.out.write('<img src="%s" width="%s" height="%s" />' % (target, width, height))
+
+ def writeImageLink(self, obj):
+ """
+ <span class='image'>
+ <span class='left'>
+ <img src='bla' />
+ <span class='imagecaption'>bla bla</span>
+ <span/>
+ <span/>
+ """
+
+ if self.images is None:
+ return
+
+ width = obj.width
+ height = obj.height
+
+ #if not width:
+ # width = 400 # what could be a sensible default if no width is given? maybe better 0?
+
+ if width:
+ path = self.images.getPath(obj.target, size=max(width, height))
+ url = self.images.getURL(obj.target, size=max(width, height))
+ else:
+ path = self.images.getPath(obj.target)
+ url = self.images.getURL(obj.target)
+
+ if url is None:
+ return
+
+ if isinstance(path, str):
+ path = unicode(path, 'utf8')
+
+ if self.imglevel==0:
+ self.imglevel += 1
+
+ # WTB: Added the ability to not specify width & height since images may not be found locally.
+ # This may have to be redone eventually, perhaps we need a database of image dimensions,
+ # but I doubt it. Besides, more hardcoded pathnames in 'getimg'?
+ try:
+ def getimg():
+ return Image.open(path)
+ img = None
+
+ if not width:
+ if not img:
+ img = getimg()
+ size = img.size
+ width = min(400, size[0])
+
+ if not height:
+ if not img:
+ img = getimg()
+ size = img.size
+ height = size[1]*width/size[0]
+ except IOError, err:
+ log.warn("Image.open failed:", err, "path=", repr(path))
+ # WTB: Removed following return as images will not always be found locally.
+ #self.imglevel -= 1
+ #return
+
+ attr = ''
+ attr_css = ''
+
+ if width:
+ attr += "width='%d' " % width
+ attr_css += "width:%dpx " % width
+
+ if height:
+ attr += "height='%d' " % height
+ # WTB: Note- height not applied to CSS.
+
+ if obj.isInline():
+ self.out.write('<img src="%s" %s/>' % (url.encode("utf8"), attr.encode("utf8")))
+ else:
+ # WTB: This looked like a mistake to me, it was modifying obj.align instead of align.
+ # This function should not modify obj at all.
+ align = obj.align
+ if obj.thumb == True and not align:
+ align = "clear right"
+ self.out.write('''<div class="bbotstyle image %s" style="%s">'''% (align, attr_css))
+ self.out.write('<img src="%s" %s/>' % (url.encode("utf8"), attr.encode("utf8")))
+
+ self.out.write('<span class="imagecaption">')
+ for x in obj.children:
+ self.write(x)
+ self.out.write('</span></div>')
+ self.imglevel -= 1
+ else:
+ self.out.write('<a href="%s">' % url)
+ for x in obj.children:
+ self.write(x)
+ self.out.write('</a>')
+
+ def writeText(self, t):
+ #self.out.write(cgi.escape(t.caption).encode('ascii', 'xmlcharrefreplace'))
+ self._write(t.caption)
+
+ writeControl = writeText
+
+ def writeArticle(self, a):
+
+ for x in a:
+ self.write(x)
+
+ self.out.write("\n<br/>")
+
+ def writeStyle(self, s):
+ if s.caption == "''":
+ tag = 'em'
+ elif s.caption=="'''''":
+ self.out.write("<strong><em>")
+ for x in s:
+ self.write(x)
+ self.out.write("</em></strong>")
+ return
+ elif s.caption == "'''":
+ tag = 'strong'
+ elif s.caption == ";":
+ self.out.write("<div><strong>")
+ for x in s:
+ self.write(x)
+ self.out.write("</strong></div>")
+ return
+
+ elif s.caption.startswith(":"):
+ self.out.write("<blockquote>"*len(s.caption))
+ for x in s:
+ self.write(x)
+ self.out.write("</blockquote>"*len(s.caption))
+ return
+ elif s.caption == "overline":
+ self.out.write('<u style="text-decoration: overline;">')
+ for x in s:
+ self.write(x)
+ self.out.write('</u>')
+ return
+ else:
+ tag = s.caption
+
+
+ self.out.write("<%s>" % tag)
+ for x in s:
+ self.write(x)
+ self.out.write("</%s>" % tag)
+
+ def writeItem(self, item):
+ svl = ""
+ if item.vlist:
+ svl = self.serializeVList(item.vlist)
+ self.out.write("<li %s>" % svl)
+ for x in item:
+ self.write(x)
+ self.out.write("</li>\n")
+
+ def writeItemList(self, lst):
+ if lst.numbered:
+ tag = "ol"
+ else:
+ tag = "ul"
+
+ self.out.write("<%s>" % tag)
+
+ for x in lst:
+ self.write(x)
+ self.out.write("\n")
+
+ self.out.write("</%s>" % tag)
+
+
+class NoLinksWriter(HTMLWriter):
+ """Subclass that ignores (non-outgoing) links"""
+
+ def writeLink(self, obj):
+ if obj.target is None:
+ return
+
+ if obj.children:
+ for x in obj.children:
+ self.write(x)
+ else:
+ self._write(obj.target)
+
diff --git a/mwlib/imgmap.py b/mwlib/imgmap.py
new file mode 100755
index 0000000..80bb826
--- /dev/null
+++ b/mwlib/imgmap.py
@@ -0,0 +1,122 @@
+#! /usr/bin/env python
+
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+
+from pyparsing import (Literal, restOfLine, Word, nums, Group,
+ ZeroOrMore, OneOrMore, And, Suppress, LineStart,
+ LineEnd, StringEnd, ParseException, Optional, White)
+
+class gob(object):
+ def __init__(self, **kw):
+ self.__dict__.update(kw)
+
+ def __repr__(self):
+ return "<%s %r>" % (self.__class__.__name__, self.__dict__)
+
+class Poly(gob): pass
+class Rect(gob): pass
+class Circle(gob): pass
+class Comment(gob): pass
+class Desc(gob): pass
+class Default(gob): pass
+class ImageMap(gob): pass
+
+def _makepoly(tokens):
+ return Poly(caption=tokens[2].strip(), vertices=list(tokens[1]))
+
+def _makerect(tokens):
+ return Rect(caption=tokens[-1].strip(), top_left=tuple(tokens[1]), bottom_right=tuple(tokens[2]))
+
+def _makecomment(tokens):
+ return Comment(comment=tokens[1])
+
+def _makecircle(tokens):
+ return Circle(caption=tokens[3].strip(), center=tokens[1], radius=tokens[2])
+
+def _makedesc(tokens):
+ return Desc(location=tokens[1])
+
+def _makeimagemap(tokens):
+ image = None
+ for x in tokens:
+ if isinstance(x, basestring):
+ image = x
+ break
+ return ImageMap(entries=list(tokens), image=image)
+
+
+comment = (Literal('#')+restOfLine).setParseAction(_makecomment)
+
+integer = Word(nums).setParseAction(lambda s: int(s[0]))
+integer_pair = (integer+integer).setParseAction(lambda x: tuple(x))
+
+poly = Literal("poly")+Group(ZeroOrMore(integer_pair))+restOfLine
+poly = poly.setParseAction(_makepoly)
+
+rect = Literal("rect")+integer_pair+integer_pair+restOfLine
+rect = rect.setParseAction(_makerect)
+
+circle = Literal("circle")+integer_pair+integer+restOfLine
+circle = circle.setParseAction(_makecircle)
+
+desc = Literal("desc") + (Literal("top-right")
+ |Literal("bottom-right")
+ |Literal("bottom-left")
+ |Literal("top-left")
+ |Literal("none"))
+desc = desc.setParseAction(_makedesc)
+default = Literal("default")+restOfLine
+default.setParseAction(lambda t: Default(caption=t[1].strip()))
+
+
+def _makeother(tokens):
+ if not tokens[0]:
+ return [None]
+ return tokens
+
+# we can't use restOfLine.setParseAction(_makeother) as that sets the
+# parse action for any occurence of restOfLine
+
+other = And([restOfLine]).setParseAction(_makeother)
+line = Suppress(LineStart()) + (comment | poly | rect | circle | desc | default | other) + Suppress(LineEnd())
+imagemap = ZeroOrMore(line) + StringEnd()
+imagemap.setParseAction(_makeimagemap)
+
+def ImageMapFromString(s):
+ # uhh. damn. can't get pyparsing to parse
+ # commands, other lines (i.e. syntax errors strictly speaking)
+ # and lines containing only whitespace...
+ lines = []
+ for x in s.split("\n"):
+ x=x.strip()
+ if x:
+ lines.append(x)
+ s="\n".join(lines)
+
+ try:
+ return imagemap.parseString(s)[0]
+ except ParseException, err:
+ return ImageMap(entries=[], image=None)
+
+def main():
+ ex="""
+
+
+Image:Foo.jpg|200px|picture of a foo
+poly 131 45 213 41 210 110 127 109 [[Display]]
+poly 104 126 105 171 269 162 267 124 [[Keyboard]]
+rect 15 95 94 176 [[Foo type A]]
+# A comment, this line is ignored
+circle 57 57 20 [[Foo type B]]
+desc bottom-left
+default [[Mainz]]
+---dfg-sdfg--sdfg
+blubb
+"""
+ res = ImageMapFromString(ex)
+ for x in res.entries:
+ print x
+
+if __name__=='__main__':
+ main()
diff --git a/mwlib/lang.py b/mwlib/lang.py
new file mode 100755
index 0000000..ca122a0
--- /dev/null
+++ b/mwlib/lang.py
@@ -0,0 +1,10 @@
+#! /usr/bin/env python
+
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+
+import os
+languages = set(open(os.path.join(os.path.dirname(__file__), 'lang.txt')).read().split())
+
+
+
diff --git a/mwlib/lang.txt b/mwlib/lang.txt
new file mode 100644
index 0000000..eaf52e3
--- /dev/null
+++ b/mwlib/lang.txt
@@ -0,0 +1,256 @@
+af
+als
+am
+an
+ang
+ar
+ast
+az
+ba
+bcl
+be
+bg
+bm
+bn
+bo
+br
+bs
+ca
+ceb
+chr
+crh
+co
+cs
+csb
+cv
+cy
+da
+de
+el
+dsb
+en
+eo
+es
+et
+eu
+fa
+fi
+fiu-vro
+fo
+fr
+frp
+fur
+fy
+ga
+gd
+gl
+gn
+gu
+he
+hi
+hr
+ht
+hu
+hy
+ia
+id
+ie
+ilo
+io
+is
+it
+iu
+ja
+jbo
+jv
+ka
+kg
+km
+kn
+ko
+ks
+ksh
+ku
+kw
+ky
+la
+lad
+lb
+li
+ln
+lt
+lv
+mg
+mi
+mk
+ml
+mo
+mr
+ms
+mt
+my
+na
+nah
+nap
+nb
+nds
+nds-nl
+ng
+nl
+nn
+no
+nrm
+nv
+oc
+os
+pam
+pap
+pdc
+pl
+ps
+pt
+rm
+ro
+roa-rup
+ru
+sa
+sc
+scn
+sco
+se
+sh
+si
+simple
+sk
+sl
+sm
+so
+sq
+sr
+st
+su
+sv
+sw
+ta
+te
+th
+tk
+tl
+to
+tpi
+tr
+tt
+ug
+uk
+ur
+vec
+vi
+vo
+wa
+war
+yi
+za
+zh
+zh-min-nan
+zh-yue
+pms
+dv
+got
+haw
+wo
+tet
+qu
+lmo
+be-x-old
+hsb
+pag
+bat-smg
+bpy
+lij
+udm
+nov
+cbk-zam
+arc
+kab
+ru-sib
+diq
+gv
+zea
+wuu
+cdo
+lg
+hak
+ty
+lo
+tn
+ti
+tg
+dk
+yo
+dz
+vls
+bar
+eml
+bxr
+ee
+rmy
+eve
+zu
+rw
+new
+rn
+xal
+bh
+bi
+wp
+om
+glk
+tw
+or
+aa
+xh
+ch
+ce
+cr
+fj
+cu
+zh-tw
+pa
+chy
+pi
+hz
+ho
+bug
+uz
+mn
+ik
+ss
+kj
+bet
+pih
+ab
+ve
+ak
+ii
+as
+av
+ay
+ig
+nan
+zh-min-nan
+ne
+ny
+sn
+ff
+mh
+mzn
+kk
+ki
+kl
+kv
+sg
+sd
+roa-tara
+zh-classical
+zh-cn
+map-bms
diff --git a/mwlib/licenses.py b/mwlib/licenses.py
new file mode 100644
index 0000000..2e96efd
--- /dev/null
+++ b/mwlib/licenses.py
@@ -0,0 +1,185 @@
+#! /usr/bin/env python
+
+"""Mapping of lower-cased template names of licenses to their normalized name.
+This file has been automatically generated with tools/get_license_templates.py
+"""
+
+lower2normal = {u'attr-tartu': u'Attr-Tartu',
+ u'attribution': u'Attribution',
+ u'attribution entomart': u'Attribution Entomart',
+ u'attribution-ubisoft': u'Attribution-Ubisoft',
+ u'attribution-ubisoft/ja': u'Attribution-Ubisoft/ja',
+ u'attribution-ubisoft/ko': u'Attribution-Ubisoft/ko',
+ u'attribution-ubisoft/nl': u'Attribution-Ubisoft/nl',
+ u'attribution/lv': u'Attribution/lv',
+ u'attribution/zh-hant': u'Attribution/zh-hant',
+ u'autotravel': u'Autotravel',
+ u'bsdu': u'BSDu',
+ u'cc-by-1.0': u'Cc-by-1.0',
+ u'cc-by-1.0-nl': u'Cc-by-1.0-nl',
+ u'cc-by-2.0': u'Cc-by-2.0',
+ u'cc-by-2.0-be': u'Cc-by-2.0-be',
+ u'cc-by-2.0-br': u'Cc-by-2.0-br',
+ u'cc-by-2.0-cl': u'Cc-by-2.0-cl',
+ u'cc-by-2.0-es': u'Cc-by-2.0-es',
+ u'cc-by-2.0-fr': u'Cc-by-2.0-fr',
+ u'cc-by-2.0-it': u'Cc-by-2.0-it',
+ u'cc-by-2.0-kr': u'Cc-by-2.0-kr',
+ u'cc-by-2.0-nl': u'Cc-by-2.0-nl',
+ u'cc-by-2.0-uk': u'Cc-by-2.0-uk',
+ u'cc-by-2.1-au': u'Cc-by-2.1-au',
+ u'cc-by-2.1-es': u'Cc-by-2.1-es',
+ u'cc-by-2.1-jp': u'Cc-by-2.1-jp',
+ u'cc-by-2.5': u'Cc-by-2.5',
+ u'cc-by-2.5-bg': u'Cc-by-2.5-bg',
+ u'cc-by-2.5-br': u'Cc-by-2.5-br',
+ u'cc-by-2.5-dk': u'Cc-by-2.5-dk',
+ u'cc-by-2.5-in': u'Cc-by-2.5-in',
+ u'cc-by-2.5-it': u'Cc-by-2.5-it',
+ u'cc-by-2.5-my': u'Cc-by-2.5-my',
+ u'cc-by-2.5-nl': u'Cc-by-2.5-nl',
+ u'cc-by-2.5-pl': u'Cc-by-2.5-pl',
+ u'cc-by-2.5-se': u'Cc-by-2.5-se',
+ u'cc-by-3.0': u'Cc-by-3.0',
+ u'cc-by-3.0-gr': u'Cc-by-3.0-gr',
+ u'cc-by-3.0-indiafm': u'Cc-by-3.0-IndiaFM',
+ u'cc-by-3.0-nl': u'Cc-by-3.0-nl',
+ u'cc-by-3.0-rs': u'Cc-by-3.0-rs',
+ u'cc-by-3.0-us': u'Cc-by-3.0-us',
+ u'cc-by-nc-sa-2.0-dual': u'Cc-by-nc-sa-2.0-dual',
+ u'cc-by-sa-1.0': u'Cc-by-sa-1.0',
+ u'cc-by-sa-1.0-fi': u'Cc-by-sa-1.0-fi',
+ u'cc-by-sa-1.0-tw': u'Cc-by-sa-1.0-tw',
+ u'cc-by-sa-2.0': u'Cc-by-sa-2.0',
+ u'cc-by-sa-2.0-at': u'Cc-by-sa-2.0-at',
+ u'cc-by-sa-2.0-be': u'Cc-by-sa-2.0-be',
+ u'cc-by-sa-2.0-br': u'Cc-by-sa-2.0-br',
+ u'cc-by-sa-2.0-ca': u'Cc-by-sa-2.0-ca',
+ u'cc-by-sa-2.0-cl': u'Cc-by-sa-2.0-cl',
+ u'cc-by-sa-2.0-de': u'Cc-by-sa-2.0-de',
+ u'cc-by-sa-2.0-es': u'Cc-by-sa-2.0-es',
+ u'cc-by-sa-2.0-fr': u'Cc-by-sa-2.0-fr',
+ u'cc-by-sa-2.0-it': u'Cc-by-sa-2.0-it',
+ u'cc-by-sa-2.0-kr': u'Cc-by-sa-2.0-kr',
+ u'cc-by-sa-2.0-nl': u'Cc-by-sa-2.0-nl',
+ u'cc-by-sa-2.0-tw': u'Cc-by-sa-2.0-tw',
+ u'cc-by-sa-2.0-uk': u'Cc-by-sa-2.0-uk',
+ u'cc-by-sa-2.1-au': u'Cc-by-sa-2.1-au',
+ u'cc-by-sa-2.1-es': u'Cc-by-sa-2.1-es',
+ u'cc-by-sa-2.1-jp': u'Cc-by-sa-2.1-jp',
+ u'cc-by-sa-2.5': u'Cc-by-sa-2.5',
+ u'cc-by-sa-2.5,1.0': u'Cc-by-sa-2.5,1.0',
+ u'cc-by-sa-2.5,2.0,1.0': u'Cc-by-sa-2.5,2.0,1.0',
+ u'cc-by-sa-2.5,2.0,1.0-no-link': u'Cc-by-sa-2.5,2.0,1.0-no-link',
+ u'cc-by-sa-2.5-ar': u'Cc-by-sa-2.5-ar',
+ u'cc-by-sa-2.5-au': u'Cc-by-sa-2.5-au',
+ u'cc-by-sa-2.5-bg': u'Cc-by-sa-2.5-bg',
+ u'cc-by-sa-2.5-br': u'Cc-by-sa-2.5-br',
+ u'cc-by-sa-2.5-ca': u'Cc-by-sa-2.5-ca',
+ u'cc-by-sa-2.5-ch': u'Cc-by-sa-2.5-ch',
+ u'cc-by-sa-2.5-cl': u'Cc-by-sa-2.5-cl',
+ u'cc-by-sa-2.5-cn': u'Cc-by-sa-2.5-cn',
+ u'cc-by-sa-2.5-de': u'Cc-by-sa-2.5-de',
+ u'cc-by-sa-2.5-dk': u'Cc-by-sa-2.5-dk',
+ u'cc-by-sa-2.5-es': u'Cc-by-sa-2.5-es',
+ u'cc-by-sa-2.5-hu': u'Cc-by-sa-2.5-hu',
+ u'cc-by-sa-2.5-in': u'Cc-by-sa-2.5-in',
+ u'cc-by-sa-2.5-it': u'Cc-by-sa-2.5-it',
+ u'cc-by-sa-2.5-mx': u'Cc-by-sa-2.5-mx',
+ u'cc-by-sa-2.5-nl': u'Cc-by-sa-2.5-nl',
+ u'cc-by-sa-2.5-pl': u'Cc-by-sa-2.5-pl',
+ u'cc-by-sa-2.5-pt': u'Cc-by-sa-2.5-pt',
+ u'cc-by-sa-2.5-se': u'Cc-by-sa-2.5-se',
+ u'cc-by-sa-2.5-si': u'Cc-by-sa-2.5-si',
+ u'cc-by-sa-2.5-tw': u'Cc-by-sa-2.5-tw',
+ u'cc-by-sa-3.0': u'Cc-by-sa-3.0',
+ u'cc-by-sa-3.0,2.5,2.0,1.0': u'Cc-by-sa-3.0,2.5,2.0,1.0',
+ u'cc-by-sa-3.0,2.5,2.0,1.0-no-link': u'Cc-by-sa-3.0,2.5,2.0,1.0-no-link',
+ u'cc-by-sa-3.0-gr': u'Cc-by-sa-3.0-gr',
+ u'cc-by-sa-3.0-nl': u'Cc-by-sa-3.0-nl',
+ u'cc-by-sa-3.0-rs': u'Cc-by-sa-3.0-rs',
+ u'cc-by-sa-3.0-tw': u'Cc-by-sa-3.0-tw',
+ u'cc-by-sa-3.0-us': u'Cc-by-sa-3.0-us',
+ u'cc-by-sa-jul': u'Cc-by-sa-jul',
+ u'cecill': u'CeCILL',
+ u'cng': u'CNG',
+ u'elephants dream': u'Elephants Dream',
+ u'fal': u'FAL',
+ u'geograph': u'Geograph',
+ u'gfdl': u'GFDL',
+ u'gfdl or cc-by-nc-sa': u'GFDL or cc-by-nc-sa',
+ u'gfdl or cc-by-nc-sa/2.5': u'GFDL or cc-by-nc-sa/2.5',
+ u'gfdl-1.2': u'GFDL-1.2',
+ u'gfdl-1.2-en': u'GFDL-1.2-en',
+ u'gfdl-1.2/es': u'GFDL-1.2/es',
+ u'gfdl-1.2/vi': u'GFDL-1.2/vi',
+ u'gfdl-cc-triple': u'GFDL-CC-triple',
+ u'gfdl-dd': u'GFDL-DD',
+ u'gfdl-en': u'GFDL-en',
+ u'gfdl-en/bg': u'GFDL-en/bg',
+ u'gfdl-en/fr': u'GFDL-en/fr',
+ u'gfdl-en/pl': u'GFDL-en/pl',
+ u'gfdl-gmt': u'GFDL-GMT',
+ u'gfdl-is': u'GFDL-IS',
+ u'gfdl-it': u'GFDL-it',
+ u'gfdl-ja': u'GFDL-ja',
+ u'gfdl-landsat-kashmir3d': u'GFDL-Landsat-Kashmir3d',
+ u'gfdl-opengeodb': u'GFDL-OpenGeoDB',
+ u'gfdl-retouched': u'GFDL-retouched',
+ u'gfdl-samoborac': u'GFDL-Samoborac',
+ u'gfdl-self': u'GFDL-self',
+ u'gfdl-user': u'GFDL-user',
+ u'gfdl-user-als': u'GFDL-user-als',
+ u'gfdl-user-ar': u'GFDL-user-ar',
+ u'gfdl-user-bat-smg': u'GFDL-user-bat-smg',
+ u'gfdl-user-bs': u'GFDL-user-bs',
+ u'gfdl-user-cs': u'GFDL-user-cs',
+ u'gfdl-user-da': u'GFDL-user-da',
+ u'gfdl-user-de': u'GFDL-user-de',
+ u'gfdl-user-el': u'GFDL-user-el',
+ u'gfdl-user-en-no-disclaimers': u'GFDL-user-en-no-disclaimers',
+ u'gfdl-user-en-note': u'GFDL-user-en-note',
+ u'gfdl-user-en-with-disclaimers': u'GFDL-user-en-with-disclaimers',
+ u'gfdl-user-es': u'GFDL-user-es',
+ u'gfdl-user-fa': u'GFDL-user-fa',
+ u'gfdl-user-fi': u'GFDL-user-fi',
+ u'gfdl-user-fr': u'GFDL-user-fr',
+ u'gfdl-user-gl': u'GFDL-user-gl',
+ u'gfdl-user-he': u'GFDL-user-he',
+ u'gfdl-user-hi': u'GFDL-user-hi',
+ u'gfdl-user-hu': u'GFDL-user-hu',
+ u'gfdl-user-id': u'GFDL-user-id',
+ u'gfdl-user-it': u'GFDL-user-it',
+ u'gfdl-user-ja': u'GFDL-user-ja',
+ u'gfdl-user-ko': u'GFDL-user-ko',
+ u'gfdl-user-lt': u'GFDL-user-lt',
+ u'gfdl-user-nl': u'GFDL-user-nl',
+ u'gfdl-user-nn': u'GFDL-user-nn',
+ u'gfdl-user-no': u'GFDL-user-no',
+ u'gfdl-user-pl': u'GFDL-user-pl',
+ u'gfdl-user-pt': u'GFDL-user-pt',
+ u'gfdl-user-ru': u'GFDL-user-ru',
+ u'gfdl-user-sk': u'GFDL-user-sk',
+ u'gfdl-user-sq': u'GFDL-user-sq',
+ u'gfdl-user-tr': u'GFDL-user-tr',
+ u'gfdl-user-uk': u'GFDL-user-uk',
+ u'gfdl-user-vi': u'GFDL-user-vi',
+ u'gfdl-user-vls': u'GFDL-user-vls',
+ u'gfdl-user-w': u'GFDL-user-w',
+ u'gfdl-user-zh': u'GFDL-user-zh',
+ u'gpl': u'GPL',
+ u'gplv2 only': u'GPLv2 only',
+ u'gplv3': u'GPLv3',
+ u'inewton': u'INewton',
+ u'lgpl': u'LGPL',
+ u'mdb': u'MdB',
+ u'met.no': u'Met.no',
+ u'norges golfforbund': u'Norges Golfforbund',
+ u'open font': u'Open Font',
+ u'parlament.ch': u'Parlament.ch',
+ u'picswiss': u'Picswiss',
+ u'polishsenatecopyright': u'PolishSenateCopyright',
+ u'stationsweb': u'Stationsweb',
+ u'statistics netherlands map': u'Statistics Netherlands map',
+ u'swiss government portrait': u'Swiss Government Portrait',
+ u'www.nordenskirker.dk': u'Www.nordenskirker.dk'}
diff --git a/mwlib/log.py b/mwlib/log.py
new file mode 100755
index 0000000..9afef8f
--- /dev/null
+++ b/mwlib/log.py
@@ -0,0 +1,53 @@
+#! /usr/bin/env python
+
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+
+import sys
+
+class Stdout(object):
+ """late-bound sys.stdout"""
+ def write(self, msg):
+ sys.stdout.write(msg)
+
+ def flush(self):
+ sys.stdout.flush()
+
+class Stderr(object):
+ """late-bound sys.stderr"""
+ def write(self, msg):
+ sys.stderr.write(msg)
+
+ def flush(self):
+ sys.stderr.flush()
+
+class Log(object):
+ logfile = Stderr()
+
+ def __init__(self, prefix=None):
+ if prefix is None:
+ self._prefix = []
+ else:
+ if isinstance(prefix, basestring):
+ self._prefix = [prefix]
+ else:
+ self._prefix = prefix
+
+ def __getattr__(self, name):
+ return Log([self, name])
+
+ def __nonzero__(self):
+ return bool(self._prefix)
+
+ def __str__(self):
+ return ".".join(str(x) for x in self._prefix if x)
+
+ def __call__(self, msg, *args):
+ if not self.logfile:
+ return
+
+ if args:
+ msg = " ".join(([msg] + [repr(x) for x in args]))
+
+ s = "%s >> %s\n" % (".".join(str(x) for x in self._prefix if x), msg)
+ self.logfile.write(s)
diff --git a/mwlib/magics.py b/mwlib/magics.py
new file mode 100755
index 0000000..985c321
--- /dev/null
+++ b/mwlib/magics.py
@@ -0,0 +1,472 @@
+#! /usr/bin/env python
+
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+
+"""expand magic variables/colon functions
+http://meta.wikimedia.org/wiki/Help:Colon_function
+http://meta.wikimedia.org/wiki/Help:Magic_words
+http://meta.wikimedia.org/wiki/ParserFunctions
+"""
+
+import datetime
+import urllib
+from mwlib.log import Log
+from mwlib import expr
+
+log = Log("expander")
+
+def singlearg(fun):
+ def wrap(self, args):
+ rl=args
+ if not rl:
+ a=u''
+ else:
+ a=rl[0]
+
+ return fun(self, a)
+
+ return wrap
+
+def noarg(fun):
+ def wrap(self, *args):
+ return fun(self)
+ return wrap
+
+def as_numeric(x):
+ try:
+ return int(x)
+ except ValueError:
+ pass
+ return float(x)
+
+
+def maybe_numeric_compare(a,b):
+ if a==b:
+ return True
+ try:
+ a=as_numeric(a)
+ b=as_numeric(b)
+ except ValueError:
+ return False
+
+ return a==b
+
+
+class OtherMagic(object):
+ def DEFAULTSORT(self, args):
+ """see http://en.wikipedia.org/wiki/Template:DEFAULTSORT"""
+ return u""
+
+
+class TimeMagic(object):
+ now = datetime.datetime.now()
+
+ @noarg
+ def CURRENTDAY(self):
+ """Displays the current day in numeric form."""
+ return "%s" % self.now.day
+
+ @noarg
+ def CURRENTDAY2(self):
+ """[MW1.5+] Ditto with leading zero 01 .. 31)."""
+ return "%02d" % self.now.day
+
+ @noarg
+ def CURRENTDAYNAME(self):
+ """Displays the current day in named form."""
+ return self.now.strftime("%A")
+
+ @noarg
+ def CURRENTDOW(self):
+ """current day as number (0=Sunday, 1=Monday...)."""
+ return str((self.now.weekday()+1) % 7)
+
+ @noarg
+ def CURRENTMONTH(self):
+ """The number 01 .. 12 of the current month."""
+ return "%02d" % self.now.month
+
+ @noarg
+ def CURRENTMONTHABBREV(self):
+ """[MW1.5+] current month abbreviated Jan .. Dec."""
+ return self.now.strftime("%b")
+
+ @noarg
+ def CURRENTMONTHNAME(self):
+ """current month in named form January .. December. """
+ return self.now.strftime("%B")
+
+ @noarg
+ def CURRENTTIME(self):
+ """The current time of day (00:00 .. 23:59)."""
+ return self.now.strftime("%H:%M")
+
+ @noarg
+ def CURRENTWEEK(self):
+ """Number of the current week (1-53) according to ISO 8601 with no leading zero."""
+ return str(self.now.isocalendar()[1])
+
+ @noarg
+ def CURRENTYEAR(self):
+ """Returns the current year."""
+ return str(self.now.year)
+
+ @noarg
+ def CURRENTTIMESTAMP(self):
+ """[MW1.7+] Returns the current time stamp. e.g.: 20060528125203"""
+ return self.now.strftime("%Y%m%d%H%M%S")
+
+ def MONTHNAME(self, args):
+ rl = args
+ if not rl:
+ return u"Missing required parameter 1=month!"
+ try:
+ m=int(rl[0].strip()) % 12
+ except ValueError:
+ return u"month should be an integer"
+ if m==0:
+ m=12
+
+ return datetime.datetime(2000, m, 1).strftime("%B")
+
+class PageMagic(object):
+ def __init__(self, pagename='', server="http://en.wikipedia.org", revisionid=0):
+ self.pagename = pagename
+ self.server = server
+ self.revisionid = revisionid
+
+ def PAGENAME(self, args):
+ """Returns the name of the current page, including all levels (Title/Subtitle/Sub-subtitle)"""
+ return self.pagename
+
+ def PAGENAMEE(self, args):
+ """same as PAGENAME but More URL-friendly percent encoded
+ special characters (To use an articlename in an external link).
+ """
+ return urllib.quote(self.pagename.encode('utf8'))
+
+
+ def SUBPAGENAME(self, args):
+ """[MW1.6+] Returns the name of the current page, excluding parent
+ pages ('Title/Subtitle' becomes 'Subtitle').
+ """
+ return self.pagename.split('/')[-1]
+
+ def SUBPAGENAMEE(self, args):
+ return urllib.quote(self.SUBPAGENAMEE())
+
+ def BASEPAGENAME(self, args):
+ """[MW1.7+] The basename of a subpage ('Title/Subtitle' becomes 'Title')
+ """
+ return self.pagename.rsplit('/', 1)[0]
+
+ def BASEPAGENAMEE(self, args):
+ """[MW1.7+] The basename of a subpage ('Title/Subtitle' becomes 'Title')
+ """
+ return urllib.quote(self.BASEPAGENAME(args))
+
+ def NAMESPACE(self, args):
+ """Returns the name of the namespace the current page resides in."""
+ return u"" # we currently only have articles living in the main/empty namespace
+
+ def NAMESPACEE(self, args):
+ """Returns the name of the namespace the current page resides in. (quoted)"""
+ return urllib.quote(self.NAMESPACE(args))
+
+ def REVISIONID(self, args):
+ """[MW1.5+] The unique identifying number of a page, see Help:Diff."""
+ return str(self.revisionid)
+
+ @noarg
+ def SITENAME(self):
+ """Value of $wgSitename."""
+ return ""
+
+ def NS(self, args):
+ """Returns the name of a given namespace number."""
+ return "++NS not implemented++"
+
+ def LOCALURL(self, args):
+ """Returns the local URL of a given page. The page might not exist."""
+ try:
+ url = "/wiki"+ "".join(args)
+ except:
+ url = '' # FIXME
+ return "/wiki"+url
+
+ def LOCALURLE(self, args):
+ """Returns the local URL of a given page. The page might not exist."""
+ return urllib.quote(self.LOCALURL(args))
+
+ def URLENCODE(self, args):
+ """[MW1.7+] To use a variable (parameter in a template) with spaces in an external link."""
+ try:
+ url = urllib.quote_plus("".join(args[0]))
+ except:
+ url = "".join(args[0])
+ return url
+
+ @noarg
+ def SERVER(self):
+ """Value of $wgServer"""
+ return self.server
+
+ def FULLURL(self, args):
+ return u''
+ u = "".join(args)
+ self.SERVERNAME({})
+
+ @noarg
+ def SERVERNAME(self):
+ return self.SERVER({})[len("http://"):]
+
+
+class NumberMagic(object):
+ def DISPLAYTITLE(self, args):
+ """[MW 1.7+] (unclear)"""
+ return ""
+
+ def NUMBEROFARTICLES(self, args):
+ """A variable which returns the total number of articles on the Wiki."""
+ return "0"
+
+ def NUMBEROFPAGES(self, args):
+ """[MW1.7+] Returns the total number of pages. """
+ return "0"
+
+ def NUMBEROFFILES(self, args):
+ """[MW1.5+] Returns the number of uploaded files (rows in the image table)."""
+ return "0"
+
+ def NUMBEROFUSERS(self, args):
+ """[MW1.7+] Returns the number of registered users (rows in the user table)."""
+ return "0"
+
+ def CURRENTVERSION(self, args):
+ """[MW1.7+] Returns the current version of MediaWiki being run. [5]"""
+ return "1.7alpha"
+
+
+
+class StringMagic(object):
+ @singlearg
+ def LC(self, a):
+ return a.lower()
+
+ @singlearg
+ def UC(self, a):
+ return a.upper()
+
+ @singlearg
+ def LCFIRST(self, a):
+ return a[:1].lower()+a[1:]
+
+ @singlearg
+ def UCFIRST(self, a):
+ return a[:1].upper()+a[1:]
+
+ @singlearg
+ def FORMATNUM(self, a):
+ return a
+
+class ParserFunctions(object):
+ wikidb = None
+ def _error(self,s):
+ return '<strong class="error">%s</strong>' % (s,)
+
+ def TAG(self, args):
+ name = args[0].strip()
+ r= u"<%s>%s</%s>" % (name, args[1], name)
+ return r
+
+
+ def IF(self, rl):
+ if rl[0]:
+ return rl[1]
+ else:
+ return rl[2]
+
+ def IFEXIST(self, args):
+ name = args[0]
+ if not self.wikidb:
+ return args.get(args[2], "")
+
+ # wrong place. FIXME.
+ if ':' in name:
+ ns, name = name.split(':', 1)
+ if ns.lower() in ['vorlage', 'template']:
+ r=self.wikidb.getTemplate(name)
+ else:
+ r=None
+ else:
+ if name == '':
+ r = None
+ else:
+ r=self.wikidb.getRawArticle(name)
+
+ if r:
+ return args[1]
+ else:
+ return args[2]
+
+
+
+ def IFEQ(self, rl):
+ if maybe_numeric_compare(rl[0], rl[1]):
+ return rl[2]
+ else:
+ return rl[3]
+
+ def EXPR(self, rl):
+ if rl:
+ try:
+ r=str(expr.expr(rl[0]))
+ except Exception, err:
+ return self._error(err)
+
+ if "e" in r:
+ f,i = r.split("e")
+ i=int(i)
+ if i<0:
+ sign = ''
+ else:
+ sign = '+'
+ fixed=str(float(f))+"E"+sign+str(int(i))
+ return fixed
+ return r
+ return u"0"
+
+
+ def IFEXPR(self, rl):
+ try:
+ r = expr.expr(rl[0])
+ except Exception, err:
+ return self._error(err)
+
+ if r:
+ return rl[1]
+ else:
+ return rl[2]
+
+ def SWITCH(self, args):
+ """see http://meta.wikimedia.org/wiki/ParserFunctions#.23switch:"""
+ cmpval = args[0].strip()
+ found=False # used for fall through
+ for c in args[1:]:
+ if '=' in c:
+ val, result = c.split('=', 1)
+ val=val.strip()
+ result=result.strip()
+ if found or maybe_numeric_compare(val, cmpval):
+ return result
+ else:
+ if maybe_numeric_compare(cmpval,c.strip()):
+ found=True
+
+ d=args["#default"]
+ if d:
+ return d
+
+
+ last = args[-1]
+
+ if '=' not in last:
+ return last
+ return u''
+
+ def TITLEPARTS(self, args):
+ title = args[0]
+ try:
+ numseg = int(args[1])
+ except ValueError:
+ numseg = 0
+
+ try:
+ start = int(args[2])
+ except ValueError:
+ start = 1
+
+ if start>0:
+ start -= 1
+
+ parts = title.split("/")[start:]
+ if numseg:
+ parts = parts[:numseg]
+ return "/".join(parts)
+
+ def IFERROR(self, args):
+ errmark = '<strong class="error">'
+ val = args[0]
+ bad=args[1]
+ good=args[2] or val
+
+ if errmark in val:
+ return bad
+ else:
+ return good
+
+
+for x in dir(ParserFunctions):
+ if x.startswith("_"):
+ continue
+ setattr(ParserFunctions, "#"+x, getattr(ParserFunctions, x))
+ delattr(ParserFunctions, x)
+
+class DummyResolver(object):
+ pass
+
+class MagicResolver(TimeMagic, PageMagic, NumberMagic, StringMagic, ParserFunctions, OtherMagic, DummyResolver):
+ def __call__(self, name, args):
+ try:
+ name = str(name)
+ except UnicodeEncodeError:
+ return None
+
+
+ m = getattr(self, name.upper(), None)
+ if m is None:
+ return None
+
+ if isinstance(m, basestring):
+ return m
+
+ res = m(args) or '' # FIXME: catch TypeErros
+ assert isinstance(res, basestring), "MAGIC %r returned %r" % (name, res)
+ return res
+
+ def has_magic(self, name):
+ try:
+ name = str(name)
+ except UnicodeEncodeError:
+ return False
+
+
+ m = getattr(self, name.upper(), None)
+ return m is not None
+
+
+
+magic_words = ['basepagename', 'basepagenamee', 'contentlanguage', 'currentday', 'currentday2', 'currentdayname', 'currentdow', 'currenthour', 'currentmonth', 'currentmonthabbrev', 'currentmonthname', 'currentmonthnamegen', 'currenttime', 'currenttimestamp', 'currentversion', 'currentweek', 'currentyear', 'defaultsort', 'directionmark', 'displaytitle', 'fullpagename', 'fullpagenamee', 'language', 'localday', 'localday2', 'localdayname', 'localdow', 'localhour', 'localmonth', 'localmonthabbrev', 'localmonthname', 'localmonthnamegen', 'localtime', 'localtimestamp', 'localweek', 'localyear', 'namespace', 'namespacee', 'newsectionlink', 'numberofadmins', 'numberofarticles', 'numberofedits', 'numberoffiles', 'numberofpages', 'numberofusers', 'pagename', 'pagenamee', 'pagesinnamespace', 'revisionday', 'revisionday2', 'revisionid', 'revisionmonth', 'revisiontimestamp', 'revisionyear', 'scriptpath', 'server', 'servername', 'sitename', 'subjectpagename', 'subjectpagenamee', 'subjectspace', 'subjectspacee', 'subpagename', 'subpagenamee', 'talkpagename', 'talkpagenamee', 'talkspace', 'talkspacee', 'urlencode']
+
+def _populate_dummy():
+ m=MagicResolver()
+
+ def get_dummy(name):
+ def resolve(*args):
+ log.warn("using dummy resolver for %s" % (name,))
+ return u""
+ return resolve
+
+ missing = set()
+ for x in magic_words:
+ if not m.has_magic(x):
+ missing.add(x)
+ setattr(DummyResolver, x.upper(), get_dummy(x))
+
+ if missing:
+ missing = list(missing)
+ missing.sort()
+ #log.info("installed dummy resolvers for %s" % (", ".join(missing),))
+
+_populate_dummy()
diff --git a/mwlib/metabook.py b/mwlib/metabook.py
new file mode 100755
index 0000000..e36e70d
--- /dev/null
+++ b/mwlib/metabook.py
@@ -0,0 +1,119 @@
+#! /usr/bin/env python
+#! -*- coding:utf-8 -*-
+
+import re
+import simplejson
+
+"""
+See METABOOK.txt for description of Metabook data
+"""
+
+class MetaBook(object):
+ """Encapsulate meta information about an article collection"""
+
+ title = u""
+ subtitle = u""
+
+ def __init__(self):
+ self.type = 'collection'
+ self.version = 1
+ self.items = []
+
+ def addArticles(self, articleTitles, chapterTitle=None, contentType='text/x-wiki'):
+ """
+ @param articleTitles: sequence of article titles or dicts containing
+ article title (value for key 'title') and optionally display title
+ (value for key 'displaytitle').
+ @type articleTitles: [unicode|{str: unicode}]
+ """
+
+ articles = []
+ for title in articleTitles:
+ article = {
+ 'type': 'article',
+ 'content-type': contentType,
+ }
+ if isinstance(title, dict):
+ article.update(title)
+ else:
+ article['title'] = title
+ articles.append(article)
+ if chapterTitle:
+ self.items.append({
+ 'type': 'chapter',
+ 'title': chapterTitle,
+ 'items': articles,
+ })
+ else:
+ self.items.extend(articles)
+
+ def dumpJson(self):
+ return simplejson.dumps(vars(self))
+
+ def loadJson(self, jsonStr):
+ for (var, value) in simplejson.loads(jsonStr).items():
+ setattr(self, var, value)
+
+ def readJsonFile(self, filename):
+ self.loadJson(open(filename, 'rb').read())
+
+ def loadCollectionPage(self, mwcollection):
+ """Parse wikitext of a MediaWiki collection page
+
+ @param mwcollection: wikitext of a MediaWiki collection page as created by
+ the Collection extension for MediaWiki
+ @type mwcollection: unicode
+ """
+
+ titleRe = '^==\s+(?P<title>.*?)\s+==$'
+ subtitleRe = '^===\s+(?P<subtitle>.*?)\s+===$'
+ chapterRe = '^;(?P<chapter>.*?)$'
+ articleRe = '^:\[\[:?(?P<article>.*?)(?:\|(?P<displaytitle>.*?))?\]\]$'
+ alltogetherRe = re.compile("(%s)|(%s)|(%s)|(%s)" % (titleRe, subtitleRe, chapterRe, articleRe))
+ gotChapter = False
+ chapter = ''
+ articles = []
+ for line in mwcollection.splitlines():
+ res = alltogetherRe.search(line.strip())
+ if not res:
+ continue
+ if res.group('title'):
+ self.title = res.group('title')
+ elif res.group('subtitle'):
+ self.subtitle = res.group('subtitle')
+ elif res.group('chapter'):
+ self.addArticles(articles, chapter)
+ articles = []
+ chapter = res.group('chapter')
+ elif res.group('article'):
+ d = {'title': res.group('article')}
+ if res.group('displaytitle'):
+ d['displaytitle'] = res.group('displaytitle')
+ articles.append(d)
+
+ if len(articles):
+ self.addArticles(articles, chapter)
+
+ def getArticles(self):
+ """Generator that produces a sequence of (title, revision) pairs for
+ each article contained in this collection. If no revision is specified,
+ None is returned for the revision item.
+ """
+
+ for item in self.getItems():
+ if item['type'] == 'article':
+ yield item['title'], item.get('revision', None)
+
+ def getItems(self):
+ """Generator that produces a flattened list of chapters and articles
+ in this collection.
+ """
+
+ for item in self.items:
+ if item['type'] == 'article':
+ yield item
+ elif item['type'] == 'chapter':
+ yield item
+ for article in item.get('items', []):
+ yield article
+
diff --git a/mwlib/mwapidb.py b/mwlib/mwapidb.py
new file mode 100644
index 0000000..4826ef4
--- /dev/null
+++ b/mwlib/mwapidb.py
@@ -0,0 +1,376 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2008, PediaPress GmbH
+# See README.txt for additional licensing information.
+
+import os
+import re
+import shutil
+import tempfile
+import time
+import urllib
+import urllib2
+import urlparse
+
+import simplejson
+
+from mwlib import uparser, utils
+from mwlib.log import Log
+
+log = Log("mwapidb")
+
+try:
+ from mwlib.licenses import lower2normal
+except ImportError:
+ log.warn('no licenses found')
+ lower2normal = {}
+
+# ==============================================================================
+
+
+def fetch_url(url, ignore_errors=False):
+ log.info("fetching %r" % (url,))
+ opener = urllib2.build_opener()
+ opener.addheaders = [('User-agent', 'mwlib')]
+ try:
+ data = opener.open(url).read()
+ except urllib2.URLError, err:
+ if ignore_errors:
+ log.error("%s - while fetching %r" % (err, url))
+ return None
+ raise RuntimeError('Could not fetch %r: %s' % (url, err))
+ log.info("got %r (%d Bytes)" % (url, len(data)))
+ return data
+
+
+# ==============================================================================
+
+
+class APIHelper(object):
+ def __init__(self, base_url):
+ """
+ @param base_url: base URL (or list of URLs) of a MediaWiki,
+ i.e. URL path to php scripts,
+ e.g. 'http://en.wikipedia.org/w/' for English Wikipedia.
+ @type base_url: basestring or [basestring]
+ """
+
+ if isinstance(base_url, unicode):
+ self.base_url = base_url.encode('utf-8')
+ else:
+ self.base_url = base_url
+ if self.base_url[-1] != '/':
+ self.base_url += '/'
+
+ def query(self, **kwargs):
+ args = {
+ 'action': 'query',
+ 'format': 'json',
+ }
+ args.update(**kwargs)
+ for k, v in args.items():
+ if isinstance(v, unicode):
+ args[k] = v.encode('utf-8')
+ data = fetch_url('%sapi.php?%s' % (self.base_url, urllib.urlencode(args)))
+ if data is None:
+ return None
+ try:
+ return simplejson.loads(unicode(data, 'utf-8'))['query']
+ except KeyError:
+ return None
+ except:
+ raise RuntimeError('api.php query failed. Are you sure you specified the correct baseurl?')
+
+ def page_query(self, **kwargs):
+ q = self.query(**kwargs)
+ if q is None:
+ return None
+ try:
+ page = q['pages'].values()[0]
+ except (KeyError, IndexError):
+ return None
+ if 'missing' in page:
+ return None
+ return page
+
+
+# ==============================================================================
+
+
+class ImageDB(object):
+ def __init__(self, base_url, shared_base_url=None):
+ self.api_helpers = [APIHelper(base_url)]
+ if shared_base_url is not None:
+ self.api_helpers.append(APIHelper(shared_base_url))
+ self.tmpdir = tempfile.mkdtemp()
+
+ def clear(self):
+ shutil.rmtree(self.tmpdir, ignore_errors=True)
+
+ def getURL(self, name, size=None):
+ """Return image URL for image with given name
+
+ @param name: image name (without namespace, i.e. without 'Image:')
+ @type name: unicode
+
+ @returns: URL to original image
+ @rtype: str
+ """
+
+ assert isinstance(name, unicode), 'name must be of type unicode'
+
+ for api_helper in self.api_helpers:
+ if size is None:
+ result = api_helper.page_query(titles='Image:%s' % name, prop='imageinfo', iiprop='url')
+ else:
+ result = api_helper.page_query(titles='Image:%s' % name, prop='imageinfo', iiprop='url', iiurlwidth=str(size))
+ if result is not None:
+ break
+ else:
+ return None
+
+ try:
+ imageinfo = result['imageinfo'][0]
+ if size is not None and 'thumburl' in imageinfo:
+ url = imageinfo['thumburl']
+ else:
+ url = imageinfo['url']
+ if url: # url can be False
+ if url.startswith('/'):
+ url = urlparse.urljoin(self.api_helpers[0].base_url, url)
+ return url
+ return None
+ except (KeyError, IndexError):
+ return None
+
+ def getDiskPath(self, name, size=None):
+ """Return filename for image with given name and size
+
+ @param name: image name (without namespace, i.e. without 'Image:')
+ @type name: unicode
+
+ @param size: if given, the image is converted to the given maximum width
+ @type size: int or NoneType
+
+ @returns: filename of image or None if image could not be found
+ @rtype: basestring
+ """
+
+ assert isinstance(name, unicode), 'name must be of type unicode'
+
+ url = self.getURL(name, size=size)
+ if url is None:
+ return None
+
+ data = fetch_url(url, ignore_errors=True)
+ if not data:
+ return None
+
+ ext = url.rsplit('.')[-1]
+ if size is not None:
+ ext = '%dpx.%s' % (size, ext)
+ else:
+ ext = '.%s' % ext
+ filename = os.path.join(self.tmpdir, utils.fsescape(name + ext))
+ f = open(filename, 'wb')
+ f.write(data)
+ f.close()
+ return filename
+
+ def getLicense(self, name):
+ """Return license of image as stated on image description page
+
+ @param name: image name without namespace (e.g. without "Image:")
+ @type name: unicode
+
+ @returns: license of image of None, if no valid license could be found
+ @rtype: unicode
+ """
+
+ assert isinstance(name, unicode), 'name must be of type unicode'
+
+ for api_helper in self.api_helpers:
+ result = api_helper.page_query(titles='Image:%s' % name, prop='templates')
+ if result is not None:
+ break
+ else:
+ return None
+
+ try:
+ templates = [t['title'] for t in result['templates']]
+ except KeyError:
+ return None
+
+ for t in templates:
+ try:
+ return lower2normal[t.split(':', 1)[-1].lower()]
+ except KeyError:
+ pass
+
+ return None
+
+
+# ==============================================================================
+
+
+class WikiDB(object):
+ print_template = u'Template:Print%s'
+
+ ip_rex = re.compile(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$')
+ bot_rex = re.compile(r'\bbot\b', re.IGNORECASE)
+
+ def __init__(self, base_url, license, template_blacklist=None):
+ """
+ @param base_url: base URL of a MediaWiki,
+ e.g. 'http://en.wikipedia.org/w/'
+ @type base_url: basestring
+
+ @param license: title of an article containing full license text
+ @type license: unicode
+
+ @param template_blacklist: title of an article containing blacklisted
+ templates (optional)
+ @type template_blacklist: unicode
+ """
+
+ self.base_url = base_url
+ self.license = license
+ self.api_helper = APIHelper(self.base_url)
+ self.template_cache = {}
+ self.template_blacklist = []
+ if template_blacklist is not None:
+ raw = self.getRawArticle(template_blacklist)
+ if raw is None:
+ log.error('Could not get template blacklist article %r' % template_blacklist)
+ else:
+ self.template_blacklist = [template.lower().strip()
+ for template in re.findall('\* *\[\[.*?:(.*?)\]\]', raw)]
+
+ def getURL(self, title, revision=None):
+ name = urllib.quote(title.replace(" ", "_").encode('utf-8'))
+ if revision is None:
+ return '%sindex.php?title=%s' % (self.base_url, name)
+ else:
+ return '%sindex.php?title=%s&oldid=%s' % (self.base_url, name, revision)
+
+ def getAuthors(self, title, revision=None, max_num_authors=10):
+ """Return at most max_num_authors names of non-bot, non-anon users for
+ non-minor changes of given article (before given revsion).
+
+ @returns: list of principal authors
+ @rtype: [unicode]
+ """
+
+ result = self.api_helper.page_query(
+ titles=title,
+ redirects=1,
+ prop='revisions',
+ rvprop='user|ids|flags|comment',
+ rvlimit=500,
+ )
+ if result is None:
+ return None
+
+ try:
+ revs = result['revisions']
+ except KeyError:
+ return None
+
+ if revision is not None:
+ revision = int(revision)
+ revs = [r for r in revs if r['revid'] < revision]
+
+ authors = [r['user'] for r in revs
+ if not r.get('anon')
+ and not self.ip_rex.match(r['user'])
+ and not r.get('minor')
+ and not self.bot_rex.search(r.get('comment', ''))
+ and not self.bot_rex.search(r['user'])
+ ]
+ author2count = {}
+ for a in authors:
+ try:
+ author2count[a] += 1
+ except KeyError:
+ author2count[a] = 1
+ author2count = author2count.items()
+ author2count.sort(key=lambda a: -a[1])
+ return [a[0] for a in author2count[:max_num_authors]]
+
+ def getTemplate(self, name, followRedirects=True):
+ """
+ Note: *Not* following redirects is unsupported!
+ """
+
+ try:
+ return self.template_cache[name]
+ except KeyError:
+ pass
+
+ if ":" in name:
+ name = name.split(':', 1)[1]
+
+ if name.lower() in self.template_blacklist:
+ log.info("ignoring blacklisted template:" , repr(name))
+ return None
+
+ for title in (self.print_template % name, 'Template:%s' % name):
+ log.info("Trying template %r" % (title,))
+ c = self.getRawArticle(title)
+ if c is not None:
+ self.template_cache[name] = c
+ return c
+
+ return None
+
+ def getRawArticle(self, title, revision=None):
+ if revision is None:
+ page = self.api_helper.page_query(titles=title, redirects=1, prop='revisions', rvprop='content')
+ else:
+ page = self.api_helper.page_query(revids=revision, prop='revisions', rvprop='content')
+ if page['title'] != title: # given revision could point to another article!
+ return None
+ if page is None:
+ return None
+ try:
+ return page['revisions'][0].values()[0]
+ except KeyError:
+ return None
+
+ def getMetaData(self):
+ result = self.api_helper.query(meta='siteinfo')
+ try:
+ g = result['general']
+ return {
+ 'license': {
+ 'name': g['rights'],
+ 'wikitext': self.getRawArticle(self.license),
+ },
+ 'url': g['base'],
+ 'name': '%s (%s)' % (g['sitename'], g['lang']),
+ }
+ except KeyError:
+ return None
+
+ def getParsedArticle(self, title, revision=None):
+ raw = self.getRawArticle(title, revision=revision)
+ if raw is None:
+ return None
+ a = uparser.parseString(title=title, raw=raw, wikidb=self)
+ return a
+
+
+class Overlay(WikiDB):
+ def __init__(self, wikidb, templates):
+ self.__dict__.update(wikidb.__dict__)
+ self.overlay_templates = templates
+
+ def getTemplate(self, name, followRedirects=False):
+ try:
+ return self.overlay_templates[name]
+ except KeyError:
+ pass
+
+ return super(Overlay, self).getTemplate(name, followRedirects=followRedirects)
+
diff --git a/mwlib/mwscan.py b/mwlib/mwscan.py
new file mode 100755
index 0000000..100ea35
--- /dev/null
+++ b/mwlib/mwscan.py
@@ -0,0 +1,315 @@
+#! /usr/bin/env python
+
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+
+import sys
+import time
+import _mwscan
+import htmlentitydefs
+
+class token(object):
+ t_end = 0
+ t_text = 1
+ t_entity = 2
+ t_special = 3
+ t_magicword = 4
+ t_comment = 5
+ t_2box_open = 6
+ t_2box_close = 7
+ t_http_url = 8
+ t_break = 9
+ t_begin_table = 10
+ t_end_table = 11
+ t_html_tag = 12
+ t_style = 13
+ t_pre = 14
+ t_section = 15
+ t_section_end = 16
+ t_item = 17
+ t_colon = 18
+ t_semicolon = 19
+ t_hrule = 20
+ t_newline = 21
+ t_column = 22
+ t_row = 23
+ t_tablecaption = 24
+ t_urllink = 25
+
+ token2name = {}
+
+for d in dir(token):
+ token2name = token.token2name
+ if d.startswith("t_"):
+ token2name[getattr(token, d)] = d
+del d
+
+
+
+
+def dump_tokens(text, tokens):
+ for type, start, len in tokens:
+ print type, repr(text[start:start+len])
+
+def scan(text):
+ stime=time.time()
+ text += u"\0"*32
+ tokens = _mwscan.scan(text)
+ return scan_result(text, tokens)
+
+def resolve_entity(e):
+ if e[1]=='#':
+ if e[2]=='x' or e[2]=='X':
+ return unichr(int(e[3:-1], 16))
+ else:
+ return unichr(int(e[2:-1]))
+
+ else:
+ try:
+ return unichr(htmlentitydefs.name2codepoint[e[1:-1]])
+ except KeyError:
+ return e
+
+
+class scan_result(object):
+ def __init__(self, source, toks):
+ self.source = source
+ self.toks = toks
+
+ def rawtext(self, (type, start, tlen)):
+ return self.source[start:start+tlen]
+
+ def text(self, t):
+ r=self.rawtext(t)
+ if t[0] == token.t_entity:
+ return resolve_entity(r)
+ else:
+ return r
+
+ def dump(self, out=None):
+ if out is None:
+ out = sys.stdout
+ for x in self:
+ out.write("%s\n" % self.repr(x))
+
+
+
+ def repr(self, t):
+ return "(%s, %r)" % (token.token2name.get(t[0]), self.rawtext(t))
+
+
+ def __len__(self):
+ return len(self.toks)
+
+ def __iter__(self):
+ return iter(self.toks)
+
+ def __getitem__(self, idx):
+ return self.toks[idx]
+
+
+class _compat_scanner(object):
+ class ignore: pass
+ tok2compat = {
+ token.t_text: "TEXT",
+ token.t_special: "SPECIAL",
+ token.t_2box_open: "[[",
+ token.t_2box_close: "]]",
+ token.t_http_url: "URL",
+ token.t_break: "BREAK",
+ token.t_style: "STYLE",
+ token.t_pre: "PRE",
+ token.t_section: "SECTION",
+ token.t_section_end: "ENDSECTION",
+ token.t_magicword: ignore,
+ token.t_comment: ignore,
+ token.t_end: ignore,
+ token.t_item: "ITEM",
+ token.t_colon: "EOLSTYLE",
+ token.t_semicolon: "EOLSTYLE",
+ token.t_newline: "\n",
+ token.t_begin_table: "BEGINTABLE",
+ token.t_end_table: "ENDTABLE",
+ token.t_column: "COLUMN",
+ token.t_row: "ROW",
+ token.t_tablecaption: "TABLECAPTION",
+ token.t_urllink: "URLLINK",
+ }
+
+
+ def __call__(self, text):
+ tokens = scan(text)
+ scanres = scan_result(text, tokens)
+
+
+ res = []
+
+ def g():
+ return text[start:start+tlen]
+ a = lambda x: res.append((x,g()))
+
+
+ ignore = self.ignore
+ tok2compat = self.tok2compat
+
+ i = 0
+ numtokens = len(tokens)
+ while i < numtokens:
+ type, start, tlen = tokens[i]
+ n=tok2compat.get(type)
+ if n is ignore:
+ pass
+ elif n is not None:
+ a(n)
+ elif type==token.t_entity:
+ res.append(("TEXT", resolve_entity(g())))
+ elif type==token.t_hrule:
+ res.append((self.tagtoken("<hr />"), g()))
+ elif type==token.t_html_tag:
+ s = g()
+
+ tt = self.tagtoken(s)
+ isEndToken = isinstance(tt, EndTagToken)
+ closingOrSelfClosing = isEndToken or tt.selfClosing
+
+ if tt.t=="math":
+ if closingOrSelfClosing:
+ i+=1
+ continue
+
+ res.append(("MATH", g()))
+ i+=1
+ while i<numtokens:
+ type, start, tlen = tokens[i]
+ if type==token.t_html_tag:
+ tt = self.tagtoken(g())
+ if tt.t=="math":
+ res.append(("ENDMATH", g()))
+ break
+ res.append(("LATEX", g()))
+ i+=1
+ elif tt.t=="timeline":
+ if closingOrSelfClosing:
+ i+=1
+ continue
+ res.append(("TIMELINE", g()))
+ i+=1
+ while i<numtokens:
+ type, start, tlen = tokens[i]
+ if type==token.t_html_tag:
+ tt = self.tagtoken(g())
+ if tt.t=="timeline":
+ res.append(("TIMELINE", g()))
+ break
+ res.append(("TEXT", g()))
+ i+=1
+ elif tt.t=="nowiki":
+ i+=1
+ if isEndToken or tt.selfClosing:
+ continue
+ while i<numtokens:
+ type, start, tlen = tokens[i]
+ if type==token.t_html_tag:
+ tt = self.tagtoken(g())
+ if tt.t=="nowiki":
+ break
+ res.append(("TEXT", scanres.text((type, start, tlen))))
+ i+=1
+ elif tt.t in ["font", "noinclude", 'p', 'caption']:
+ pass
+ elif tt.t=="table":
+ if isEndToken:
+ res.append(("ENDTABLE", g()))
+ else:
+ res.append(("BEGINTABLE", g()))
+ elif tt.t in ['th', 'td']:
+ if isEndToken:
+ pass
+ else:
+ res.append(("COLUMN", g()))
+ elif tt.t=='tr':
+ if isEndToken:
+ pass
+ else:
+ res.append(("ROW", g()))
+ else:
+ res.append((tt, s))
+ else:
+ a(type)
+ i+=1
+
+
+ return res
+
+ def tagtoken(self, text):
+ selfClosing = False
+ if text.startswith(u"</"):
+ name = text[2:-1]
+ klass = EndTagToken
+ isEndToken = True
+ elif text.endswith("/>"):
+ name = text[1:-2]
+ klass = TagToken
+ selfClosing = True
+ isEndToken = False # ???
+ else:
+ name = text[1:-1]
+ klass = TagToken
+ isEndToken = False
+
+ name, values = (name.split(None, 1)+[u''])[:2]
+ from mwlib.parser import paramrx
+ values = dict(paramrx.findall(values))
+ name = name.lower()
+
+ if name=='br' or name=='references':
+ isEndToken = False
+ klass = TagToken
+
+ r = klass(name, text)
+ r.selfClosing = selfClosing
+ r.values = values
+ return r
+
+
+
+compat_scan = _compat_scanner()
+
+# from plexscanner import _BaseTagToken, TagToken, EndTagToken
+
+class _BaseTagToken(object):
+ def __eq__(self, other):
+ if isinstance(other, basestring):
+ return self.t == other
+ if isinstance(other, self.__class__):
+ return self.t == other.t
+ return False
+
+ def __ne__(self, other):
+ return not(self==other)
+
+ def __hash__(self):
+ return hash(self.t)
+
+class TagToken(_BaseTagToken):
+ values = {}
+ selfClosing=False
+
+ def __init__(self, t, text=''):
+ self.t = t
+ self.text = text
+
+ def __repr__(self):
+ return "<Tag:%s %r>" % (self.t, self.text)
+
+class EndTagToken(_BaseTagToken):
+ def __init__(self, t, text=''):
+ self.t = t
+ self.text = text
+
+ def __repr__(self):
+ return "<EndTag:%s>" % self.t
+
+def tokenize(input, name="unknown"):
+ assert input is not None, "must specify input argument in tokenize"
+ return compat_scan(input)
diff --git a/mwlib/netdb.py b/mwlib/netdb.py
new file mode 100755
index 0000000..ec38ee0
--- /dev/null
+++ b/mwlib/netdb.py
@@ -0,0 +1,529 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2008, PediaPress GmbH
+# See README.txt for additional licensing information.
+
+# An alternative solution to construct the hashpath of images would be to use
+# api.php, e.g.
+# fetch the page http://de.wikipedia.org/w/api.php?action=query&titles=Bild:SomePic.jpg&prop=imageinfo&iiprop=url&format=json
+
+import os
+import sys
+import urllib
+import urllib2
+try:
+ from hashlib import md5
+except ImportError:
+ from md5 import md5
+import shutil
+import sys
+import time
+import tempfile
+import re
+
+from mwlib import uparser, utils
+from mwlib.log import Log
+
+log = Log("netdb")
+
+# ==============================================================================
+
+def hashpath(name):
+ """Compute hashpath for an image in the same way as MediaWiki does
+
+ @param name: name of an image
+ @type name: unicode
+
+ @returns: hashpath to image
+ @type: str
+ """
+
+ name = name.replace(' ', '_')
+ name = name[:1].upper()+name[1:]
+ d = md5(name.encode('utf-8')).hexdigest()
+ return "/".join([d[0], d[:2], name])
+
+class ImageDB(object):
+ convert_command = 'convert' # name of/path to ImageMagick's convert tool
+
+ def __init__(self, baseurl, cachedir=None, wikidb=None, knownLicenses=None):
+ """Init ImageDB with a base URL (or a list of base URLs) and optionally
+ with a cache directory.
+
+ @param baseurl: base URL or sequence containing several base URLs
+ @type baseurl: unicode or (unicode,)
+
+ @param cachedir: image cache directory (optional)
+ @type cachedir: basestring or None
+
+ @param wikidb: WikiDB instance used to fetch image description pages to
+ find out image licenses
+ @type wikidb: object
+
+ @param knownLicenses: list of known license templates (whose name is the
+ name of the license) which may appear on image description pages
+ @type knownLicenses: [unicode]
+ """
+
+ if isinstance(baseurl, unicode):
+ self.baseurls = [baseurl.encode('ascii')]
+ else:
+ self.baseurls = []
+ for bu in baseurl:
+ if isinstance(bu, unicode):
+ bu = bu.encode('ascii')
+ self.baseurls.append(bu)
+
+ if cachedir:
+ self.cachedir = cachedir
+ self.tempcache = False
+ else:
+ self.cachedir = tempfile.mkdtemp()
+ self.tempcache = True
+ if self.cachedir[-1] != '/':
+ self.cachedir += '/' # needed for getPath() to work correctly
+
+ self.wikidb = wikidb
+
+ oredLicenses = '|'.join(['(%s)' % re.escape(license)
+ for license in (knownLicenses or [])])
+ self.licenseRegexp = re.compile(r'{{(?P<license>%s)}}' % oredLicenses)
+
+ self.name2license = {}
+
+ def clear(self):
+ """Delete temporary cache directory (i.e. only if no cachedir has been
+ passed to __init__().
+ """
+
+ if self.tempcache:
+ shutil.rmtree(self.cachedir)
+
+ def getURL(self, name, size=None):
+ """Return image URL for image with given name
+
+ @param name: image name (without namespace, i.e. without 'Image:')
+ @type name: unicode
+
+ @returns: URL to original image
+ @rtype: str
+ """
+
+ assert isinstance(name, unicode), 'name must be of type unicode'
+
+ # use getDiskPath() to fetch and cache (!) image
+ path = self.getDiskPath(name, size=size)
+ if path is None:
+ return None
+
+ # first, look for a cached image with that name (in any size)
+ for baseurl in self.baseurls:
+ urldir = self._getCacheDirForBaseURL(baseurl)
+ if not path.startswith(urldir):
+ continue
+ return self._getImageURLForBaseURL(baseurl, name)
+
+ def getPath(self, name, size=None):
+ """Return path to image with given parameters relative to cachedir"""
+
+ path = self.getDiskPath(name, size=size)
+ if path is None:
+ return None
+ assert path.startswith(self.cachedir), 'invalid path from getDiskPath()'
+ return path[len(self.cachedir):]
+
+ def getDiskPath(self, name, size=None):
+ """Return filename for image with given name. If the image is not found
+ in the cache, it is fetched per HTTP and converted.
+
+ @param name: image name (without namespace, i.e. without 'Image:')
+ @type name: unicode
+
+ @param size: if given, the image is converted to the given maximum size
+ (i.e. the image is scaled so that neither its width nor its height
+ exceed size)
+ @type size: int or NoneType
+
+ @returns: filename of image
+ @rtype: basestring
+ """
+
+ assert isinstance(name, unicode), 'name must be of type unicode'
+
+ path = self._getImageFromCache(name, size=size)
+ if path:
+ return path
+
+ tmpfile, baseurl = self._fetchImage(name)
+ if tmpfile is None:
+ return None
+
+ self.name2license[name] = self._fetchLicense(baseurl, name)
+
+ path = self._convertToCache(tmpfile, baseurl, name, size=size)
+
+ try:
+ os.unlink(tmpfile)
+ except IOError:
+ log.warn('Could not delete temp file %r' % tmpfile)
+
+ return path
+
+ def _fetchLicense(self, baseurl, name):
+ if self.wikidb is None:
+ return None
+
+ raw = self.wikidb.getImageDescription(name,
+ urlIndex=self.baseurls.index(baseurl),
+ )
+ if raw is None:
+ return None
+
+ mo = re.search(self.licenseRegexp, raw)
+ if mo is None:
+ return None
+
+ return mo.group('license')
+
+ def getLicense(self, name):
+ """Return license of image as stated on image description page
+
+ @param name: image name without namespace (e.g. without "Image:")
+ @type name: unicode
+
+ @returns: license of image of None, if no valid license could be found
+ @rtype: str
+ """
+
+ assert isinstance(name, unicode), 'name must be of type unicode'
+ return self.name2license.get(name)
+
+ def _getImageFromCache(self, name, size=None):
+ """Look in cachedir for an image with the given parameters"""
+
+ for baseurl in self.baseurls:
+ path = self._getCachedImagePath(baseurl, name, size=size)
+ if path is not None and os.path.exists(path):
+ return path
+ return None
+
+ def _getCacheDirForBaseURL(self, baseurl):
+ """Construct the path of the cache directory for the given base URL.
+ This directory doesn't need to exist.
+ """
+
+ return os.path.join(self.cachedir,
+ md5(baseurl.encode('utf-8')).hexdigest()[:8])
+
+ def _getCachedImagePath(self, baseurl, name, size=None, makedirs=False):
+ """Construct a filename for an image with the given parameters inside
+ the cache directory. The file doesn't need to exist. If makedirs is True
+ create all directories up to filename.
+ """
+
+ urlpart = self._getCacheDirForBaseURL(baseurl)
+ if size is not None:
+ sizepart = '%dpx' % size
+ else:
+ sizepart = 'orig'
+
+ if name.lower().endswith('.svg'):
+ if size is None:
+ log.warn('Cannot get SVG image when no size is given')
+ return None
+ name += '.png'
+ if name.lower().endswith('.gif'):
+ name += '.png'
+ name = (name[0].upper() + name[1:]).replace(' ', '_').replace("'", "-")
+
+ d = os.path.join(urlpart, sizepart)
+ if makedirs and not os.path.isdir(d):
+ os.makedirs(d)
+ return os.path.join(d, utils.fsescape(name))
+
+ def _fetchImage(self, name):
+ """Fetch image with given name in original (i.e. biggest) size per HTTP.
+
+ @returns: filename of written image and base URL used to retrieve the
+ image or (None, None) if the image could not be fetched
+ @rtype: (basestring, str) or (NoneType, NoneType)
+ """
+
+ for baseurl in self.baseurls:
+ path = self._fetchImageFromBaseURL(baseurl, name)
+ if path:
+ return path, baseurl
+ return None, None
+
+ def _getImageURLForBaseURL(self, baseurl, name):
+ """Construct a URL for the image with given name under given base URL"""
+
+ hp = hashpath(name).encode('utf-8')
+ return urllib.basejoin(baseurl, urllib.quote(hp))
+
+ def _fetchImageFromBaseURL(self, baseurl, name):
+ """Fetch image with given name under given baseurl and write it to a
+ tempfile.
+
+ @returns: filename of written image or None if image could not be fetched
+ @rtype: basestring or NoneType
+ """
+
+ url = self._getImageURLForBaseURL(baseurl, name)
+ log.info("fetching %r" % (url,))
+ opener = urllib2.build_opener()
+ opener.addheaders = [('User-agent', 'mwlib')]
+ try:
+ data = opener.open(url).read()
+ log.info("got image: %r" % url)
+ fd, filename = tempfile.mkstemp()
+ os.write(fd, data)
+ os.close(fd)
+ return filename
+ except urllib2.URLError, err:
+ log.error("%s - while fetching %r" % (err, url))
+ return None
+
+ def _convertToCache(self, srcfile, baseurl, name, size=None):
+ """Convert image in file named srcfile to have the given maximum size.
+ Save the converted image in the cache directory for the given baseurl.
+
+ @returns: filename of converted image
+ @rtype: basestring
+ """
+ destfile = self._getCachedImagePath(baseurl, name, size=size, makedirs=True)
+ if size is not None:
+ thumbnail = '-thumbnail "%dx%d>"' % (size, size)
+ else:
+ thumbnail = '-strip'
+
+ opts = '-background white -density 100 -flatten -coalesce %(thumbnail)s' % {
+ 'thumbnail': thumbnail,
+ }
+ cmd = "%(convert)s %(opts)s '%(src)s[0]' '%(dest)s'" % {
+ 'convert': self.convert_command,
+ 'opts': opts,
+ 'src': srcfile,
+ 'dest': destfile,
+ }
+ log.info('executing %r' % cmd)
+ rc = utils.shell_exec(cmd)
+ if rc != 0:
+ log.error('Could not convert %r: convert returned %d' % (name, rc))
+ return None
+
+ return destfile
+
+
+# ==============================================================================
+
+def normname(name):
+ name = name.strip().replace("_", " ")
+ name = name[:1].upper()+name[1:]
+ return name
+
+
+class NetDB(object):
+ redirect_rex = re.compile(r'^#Redirect:?\s*?\[\[(?P<redirect>.*?)\]\]', re.IGNORECASE)
+
+ def __init__(self, pagename,
+ imagedescriptionurls=None,
+ templateurls=None,
+ templateblacklist=None,
+ defaultauthors=None,
+ ):
+ """
+ @param pagename: URL to page in wikitext format. @TITLE@ gets replaced
+ with the page name and @REVISION@ gets replaced with the requested
+ revision/oldid. E.g.
+
+ "http://mw/index.php?title=@TITLE@&action=raw&oldid=@TITLE@"
+
+ @type pagename: str
+
+ @param imagedescriptionurls: list of URLs to image description pages in
+ wikitext format. @TITLE@ gets replaced with the image title w/out
+ its prefix. E.g.
+
+ ["http://mw/index.php?title=Image:@TITLE@s&action=raw"]
+
+ The list must be of the same length as the baseurl list of the
+ accompanying ImageDB, and the URL with the corresponding position
+ in the list is used to retrieve the description page.
+ @type imagedescriptionurls: [str]
+
+ @param templateurls: list of URLs to template pages in wikitext format.
+ @TITLE@ gets replaced with the template title. E.g.
+
+ ["http://mw/index.php?title=Template:@TITLE@s&action=raw"]
+
+ If more than one URL is specified, URLs are tried in given order.
+ @type templateurls: [str]
+
+ @param defaultauthors: list of default (principal) authors for articles
+ @type defaultauthors: [unicode]
+ """
+
+ self.pagename = pagename.replace("%", "%%").replace("@TITLE@", "%(NAME)s").replace("@REVISION@", "%(REVISION)s")
+
+ if templateurls is None:
+ templateurls = []
+ self.templateurls = [x.replace("%", "%%").replace("@TITLE@", "%(NAME)s")
+ for x in templateurls]
+
+ if imagedescriptionurls is None:
+ imagedescriptionurls = []
+ self.imagedescriptionurls = [x.replace("%", "%%").replace("@TITLE@", "%(NAME)s")
+ for x in imagedescriptionurls]
+
+ if templateblacklist:
+ self.templateblacklist = self._readTemplateBlacklist(templateblacklist)
+ else:
+ self.templateblacklist = []
+
+ if defaultauthors:
+ self.defaultauthors = defaultauthors
+ else:
+ self.defaultauthors = []
+
+ self.pages = {}
+
+ def _getpage(self, url, expectedContentType='text/x-wiki'):
+ try:
+ return self.pages[url]
+ except KeyError:
+ pass
+
+ stime=time.time()
+ response = urllib.urlopen(url)
+ data = response.read()
+ log.info('fetched %r in %ss' % (url, time.time()-stime))
+
+ if expectedContentType:
+ ct = response.info().gettype()
+ if ct != expectedContentType:
+ log.warn('Skipping page %r with content-type %r (%r was expected). Skipping.'\
+ % (url, ct, expectedContentType))
+ return None
+
+ self.pages[url] = data
+ return data
+
+ def _readTemplateBlacklist(self,templateblacklist):
+ if not templateblacklist:
+ return []
+ try:
+ content = urllib.urlopen(templateblacklist).read()
+ return [template.lower().strip() for template in re.findall('\* *\[\[.*?:(.*?)\]\]', content)]
+ except: # fixme: more sensible error handling...
+ log.error('Error fetching template blacklist from url:', templateblacklist)
+ return []
+
+ def _dummy(self, *args, **kwargs):
+ pass
+
+ startCache = _dummy
+
+ def getURL(self, title, revision=None):
+ name = urllib.quote(title.replace(" ", "_").encode('utf8'))
+ if revision is None:
+ return self.pagename % dict(NAME=name, REVISION='0')
+ else:
+ return self.pagename % dict(NAME=name, REVISION=revision)
+
+ def getAuthors(self, title, revision=None):
+ return list(self.defaultauthors)
+
+ def title2db(self, title):
+ assert isinstance(title, unicode), 'title must be of type unicode'
+ return title.encode('utf-8')
+
+ def db2title(self, dbtitle):
+ assert isinstance(dbtitle, str), 'dbtitle must be of type str'
+ return unicode(dbtitle, 'utf-8')
+
+ def getImageDescription(self, title, urlIndex=0):
+ """Fetch the image description page for the image with the given title.
+ If baseurl and self.imagedescriptions contains more than one URL, use
+ the one which starts with baseurl.
+
+ @param title: title of the image w/out prefix (like Image:)
+ @type title: unicode
+
+ @param urlIndex: index for imagedescriptionurls
+ @type urlIndex: int
+
+ @returns: wikitext of image description page or None
+ @rtype: unicode or None
+ """
+
+ if not self.imagedescriptionurls:
+ return None
+
+ raw = self._getpage(self.imagedescriptionurls[urlIndex] % {
+ 'NAME': urllib.quote(title.replace(" ", "_").encode('utf8')),
+ })
+ if raw is None:
+ return None
+
+ return unicode(raw, 'utf-8')
+
+ def getTemplate(self, name, followRedirects=False):
+ if ":" in name:
+ name = name.split(':', 1)[1]
+
+
+ if name.lower() in self.templateblacklist:
+ log.info("ignoring blacklisted template:" , repr(name))
+ return None
+ name = urllib.quote(name.replace(" ", "_").encode('utf8'))
+ for u in self.templateurls:
+ url = u % dict(NAME=name)
+ log.info("Trying %r" %(url,))
+ c=self._getpage(url)
+ if c:
+ log.info("got content from", url)
+ res=unicode(c, 'utf8')
+ mo = self.redirect_rex.search(res)
+ if mo:
+ redirect = mo.group('redirect')
+ redirect = normname(redirect.split("|", 1)[0].split("#", 1)[0])
+ return self.getTemplate(redirect)
+ return res
+
+
+
+
+ #return self.getRawArticle(u'Template:%s' % name)
+
+ def getRawArticle(self, title, revision=None):
+ r = self._getpage(self.getURL(title, revision=revision))
+ if r is None:
+ return None
+ return unicode(r, 'utf8')
+
+ def getRedirect(self, title):
+ return u""
+
+ def getParsedArticle(self, title, revision=None):
+ raw = self.getRawArticle(title, revision=revision)
+ if raw is None:
+ return None
+ a = uparser.parseString(title=title, raw=raw, wikidb=self)
+ return a
+
+
+class Overlay(NetDB):
+ def __init__(self, wikidb, templates):
+ self.__dict__.update(wikidb.__dict__)
+ self.overlay_templates = templates
+
+ def getTemplate(self, name, followRedirects=False):
+ try:
+ return self.overlay_templates[name]
+ except KeyError:
+ pass
+
+ return super(Overlay, self).getTemplate(name, followRedirects=followRedirects)
+
diff --git a/mwlib/overlay.py b/mwlib/overlay.py
new file mode 100644
index 0000000..68c4774
--- /dev/null
+++ b/mwlib/overlay.py
@@ -0,0 +1,22 @@
+
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+
+import os
+
+class OverlayDB(object):
+ def __init__(self, db, basedir):
+ self.db = db
+ self.basedir = basedir
+
+ def getRawArticle(self, title):
+ p = os.path.join(self.basedir, title)
+ if os.path.isfile(p):
+ return unicode(open(p, 'rb').read(), 'utf-8')
+ return self.db.getRawArticle(title)
+
+ def getTemplate(self, title, followRedirects=False):
+ p = os.path.join(self.basedir, title)
+ if os.path.isfile(p):
+ return unicode(open(p, 'rb').read(), 'utf-8')
+ return self.db.getTemplate(title, followRedirects=followRedirects)
diff --git a/mwlib/parser.py b/mwlib/parser.py
new file mode 100755
index 0000000..dcdca94
--- /dev/null
+++ b/mwlib/parser.py
@@ -0,0 +1,1424 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+
+import sys
+import os
+import re
+
+from mwlib.scanner import tokenize, TagToken, EndTagToken
+from mwlib.log import Log
+
+log = Log("parser")
+
+
+tag_li = TagToken("li")
+tag_div = TagToken("div")
+
+class TokenSet(object):
+ def __init__(self, lst):
+ self.types = set()
+ self.values = set()
+
+ for x in lst:
+ if isinstance(x, type):
+ self.types.add(x)
+ else:
+ self.values.add(x)
+
+ def __contains__(self, x):
+ return x in self.values or type(x) in self.types
+
+FirstAtom = TokenSet(['TEXT', 'URL', 'SPECIAL', '[[', 'MATH', '\n',
+ 'BEGINTABLE', 'STYLE', 'TIMELINE', 'ITEM', 'URLLINK',
+ TagToken])
+
+FirstParagraph = TokenSet(['SPECIAL', 'URL', 'TEXT', 'TIMELINE', '[[', 'STYLE', 'BEGINTABLE', 'ITEM',
+ 'PRE', 'MATH', '\n', 'PRE', 'EOLSTYLE', 'URLLINK',
+ TagToken])
+
+
+def show(out, node, indent=0):
+ print >>out, " "*indent, node
+ for x in node:
+ show(out, x, indent+1)
+
+
+paramrx = re.compile("(?P<name>\w+) *= *(?P<value>(?:(?:\".*?\")|(?:(?:\w|[%:])+)))")
+def parseParams(s):
+ def style2dict(s):
+ res = {}
+ for x in s.split(';'):
+ if ':' in x:
+ var, value = x.split(':', 1)
+ var=var.strip()
+ value = value.strip()
+ res[var] = value
+
+ return res
+
+ def maybeInt(v):
+ try:
+ return int(v)
+ except:
+ return v
+
+ r = {}
+ for name, value in paramrx.findall(s):
+ if value.startswith('"'):
+ value = value[1:-1]
+
+ if name=='style':
+ value = style2dict(value)
+ r['style'] = value
+ else:
+ r[name] = maybeInt(value)
+ return r
+
+
+
+
+class Node(object):
+ caption = ''
+
+ def __init__(self, caption=''):
+ self.children = []
+ self.caption = caption
+
+ def hasContent(self):
+ for x in self.children:
+ if x.hasContent():
+ return True
+ return False
+
+ def append(self, c, merge=False):
+ if c is None:
+ return
+
+ if merge and type(c)==Text and self.children and type(self.children[-1])==Text:
+ self.children[-1].caption += c.caption
+ else:
+ self.children.append(c)
+
+ def __iter__(self):
+ for x in self.children:
+ yield x
+
+ def __repr__(self):
+ return "%s %r: %s children" % (self.__class__.__name__, self.caption, len(self.children))
+
+ def __eq__(self, other):
+ return (isinstance(other, self.__class__)
+ and self.caption == other.caption
+ and self.children == other.children)
+
+ def __ne__(self, other):
+ return not(self==other)
+
+ def allchildren(self): # name is broken, returns self, which is not a child
+ yield self
+ for c in self.children:
+ for x in c.allchildren():
+ yield x
+
+ def find(self, tp):
+ """find instances of type tp in self.allchildren()"""
+ return [x for x in self.allchildren() if isinstance(x, tp)]
+
+
+ def filter(self, fun):
+ for x in self.allchildren():
+ if fun(x):
+ yield x
+
+ def _asText(self, out):
+ out.write(self.caption)
+ for x in self.children:
+ x._asText(out)
+
+ def asText(self, ):
+ from StringIO import StringIO
+ out = StringIO()
+ self._asText(out)
+ return out.getvalue()
+
+class Math(Node): pass
+class Ref(Node): pass
+class Item(Node): pass
+class ItemList(Node):
+ numbered = False
+ def append(self, node, merge=False):
+ if not isinstance(node, Item):
+ c=Item()
+ c.append(node)
+ self.children.append(c)
+ else:
+ self.children.append(node)
+
+class Style(Node): pass
+class Book(Node): pass
+class Magic(Node): pass
+class Chapter(Node): pass
+class Article(Node): pass
+class Paragraph(Node): pass
+class Section(Node): pass
+class Timeline(Node): pass
+class TagNode(Node): pass
+class PreFormatted(TagNode): pass
+class URL(Node): pass
+class NamedURL(Node): pass
+
+
+
+class _VListNode(Node):
+ def __init__(self, caption=''):
+ Node.__init__(self, caption)
+ self.vlist = {}
+
+ def __repr__(self):
+ return "%s %r %s: %s children" % (self.__class__.__name__, self.caption, self.vlist, len(self.children))
+
+class Table(_VListNode):
+ pass
+
+class Row(_VListNode):
+ pass
+
+class Cell(_VListNode):
+ pass
+
+class Caption(_VListNode):
+ pass
+
+class Link(Node):
+ target = None
+
+ specialPrefixes = set([
+ # English
+ "wikipedia", "wiktionary", "wikibooks", "wikisource", "wikiquote", "meta", "talk",
+ "commons", "wikinews", "template", "wikitravel", "help",
+ # German
+ "vorlage",
+ # Spanish
+ ])
+
+ imageKeywords = set([
+ "image", "imagen", "bild", "archivo", "rikcha", "plik", "fichier", "file",
+ u"ta'ãnga"
+ ])
+
+ categoryKeywords = set([
+ "category", "kategorie", "categor\\xeda", u"\\xf1emohenda"
+ ])
+
+ from mwlib.lang import languages
+ colon = False
+
+ def hasContent(self):
+ if self.target:
+ return True
+ return False
+
+ def _specialize(self):
+ if not self.children:
+ return
+
+ if type(self.children[0]) != Text:
+ return
+
+ self.target = target = self.children[0].caption.strip()
+ del self.children[0]
+ if self.children and self.children[0] == Control("|"):
+ del self.children[0]
+
+ pic = self.target
+ if pic.startswith(':'):
+ self.colon = True
+
+
+
+ # pic == "Bild:Wappen_von_Budenheim.png"
+
+ pic = pic.strip(': ')
+ if ':' not in pic:
+ return
+
+ linktype, pic = pic.split(':', 1)
+ linktype = linktype.lower().strip(" :")
+
+ if linktype in self.categoryKeywords:
+ self.__class__ = CategoryLink
+ self.target = pic.strip()
+ return
+
+ if linktype in self.specialPrefixes:
+ self.__class__ = SpecialLink
+ self.target = pic.strip()
+ self.ns = linktype
+
+ return
+
+ if linktype in self.languages:
+ self.__class__ = LangLink
+ return
+
+
+ if linktype not in self.imageKeywords:
+ # assume a LangLink
+ log.info("Unknown linktype:", repr(linktype))
+ if len(linktype) in [2, 3]:
+ self.__class__ = LangLink
+ return
+
+
+ # pic == "Wappen_von_Budenheim.png"
+
+ # WTB: See es.wikipedia.org/wiki/Provincia_de_Lima
+ #try:
+ # prefix, suffix = pic.rsplit('.', 1)
+ #except ValueError:
+ # return
+ #if suffix.lower() in ['jpg', 'jpeg', 'gif', 'png', 'svg']:
+
+ self.__class__ = ImageLink
+ self.target = pic.strip()
+
+
+
+ idx = 0
+ last = []
+
+ while idx<len(self.children):
+ x = self.children[idx]
+ if x == Control("|"):
+ if idx:
+ last = self.children[:idx]
+
+ del self.children[:idx+1]
+ idx = 0
+ continue
+
+ if not type(x)==Text:
+ idx += 1
+ continue
+
+ x = x.caption.lower()
+
+ if x == 'thumb' or x=='thumbnail':
+ self.thumb = True
+ del self.children[idx]
+ continue
+
+ if x in ['left', 'right', 'center', 'none']:
+ self.align = x
+ del self.children[idx]
+ continue
+
+ if x == 'frame' or x=='framed' or x=='enframed':
+ self.frame = True
+ del self.children[idx]
+ continue
+
+
+ if x.endswith('px'):
+ # x200px
+ # 100x200px
+ # 200px
+ x = x[:-2]
+ width, height = (x.split('x')+['0'])[:2]
+ try:
+ width = int(width)
+ except ValueError:
+ width = 0
+
+ try:
+ height = int(height)
+ except ValueError:
+ height = 0
+
+ self.width = width
+ self.height = height
+ del self.children[idx]
+ continue
+
+ idx += 1
+
+ if not self.children:
+ self.children = last
+
+class ImageLink(Link):
+ target = None
+ width = None
+ height = None
+ align = ''
+ thumb = False
+ frame = False
+
+ def isInline(self):
+ return not bool(self.align or self.thumb or self.frame)
+
+class LangLink(Link):
+ pass
+
+class CategoryLink(Link):
+ pass
+
+class SpecialLink(Link):
+ pass
+
+
+class Text(Node):
+ def __repr__(self):
+ return repr(self.caption)
+
+ def __init__(self, txt):
+ self.caption = txt
+ self.children = []
+
+ def hasContent(self):
+ if self.caption.strip():
+ return True
+ return False
+
+class Control(Text):
+ pass
+
+def _parseAtomFromString(s):
+ from mwlib import scanner
+ tokens = scanner.tokenize(s)
+ p=Parser(tokens)
+ try:
+ return p.parseAtom()
+ except Exception, err:
+ log.error("exception while parsing %r: %r" % (s, err))
+ return None
+
+
+
+def parse_fields_in_imagemap(imap):
+
+ if imap.image:
+ imap.imagelink = _parseAtomFromString(u'[['+imap.image+']]')
+ if not isinstance(imap.imagelink, ImageLink):
+ imap.imagelink = None
+
+ # FIXME: the links of objects inside 'entries' array should also be parsed
+
+
+def append_br_tag(node):
+ """append a self-closing 'br' TagNode"""
+ br = TagNode("br")
+ br.starttext = '<br />'
+ br.endtext = ''
+ node.append(br)
+
+class Parser(object):
+ def __init__(self, tokens, name=''):
+ self.tokens = tokens
+ self.pos = 0
+ self.name = name
+ self.lastpos = 0
+ self.count = 0
+
+ @property
+ def token(self):
+ t=self.tokens[self.pos]
+ if self.pos == self.lastpos:
+ self.count += 1
+ if self.count > 500:
+ from mwlib.caller import caller
+
+ raise RuntimeError("internal parser error: %s" % ((self.pos, t, caller()), ))
+ else:
+ self.count = 0
+ self.lastpos = self.pos
+
+
+ return t
+
+
+
+ @property
+ def left(self):
+ return self.pos < len(self.tokens)
+
+ def next(self):
+ self.pos += 1
+
+ def parseAtom(self):
+ token = self.token
+
+ if token[0]=='TEXT':
+ self.next()
+ return Text(token[1])
+ elif token[0]=='URL':
+ self.next()
+ return URL(token[1])
+ elif token[0]=='URLLINK':
+ return self.parseUrlLink()
+ elif token[0]=='SPECIAL':
+ self.next()
+ return Text(token[1])
+ elif token[0]=='[[':
+ return self.parseLink()
+ elif token[0]=='MATH':
+ return self.parseMath()
+ elif token[0]=='\n':
+ self.next()
+ return Text(token[1])
+ elif token[0]=='BEGINTABLE':
+ return self.parseTable()
+ elif token[0]=='STYLE':
+ return self.parseStyle()
+ elif token[0]=='TIMELINE':
+ return self.parseTimeline()
+ elif token[0]=='ITEM':
+ return self.parseItemList()
+ elif isinstance(token[0], TagToken):
+ return self.parseTagToken()
+ else:
+ raise RuntimeError("not handled: %s" % (token,))
+
+ def parseUrlLink(self):
+ u = self.token[1][1:]
+ n = Node()
+ n.append(Text("["))
+ n.append(URL(u))
+
+ self.next()
+
+ while self.left:
+ if self.tokens[self.pos:self.pos+2] == [(']]', ']]'), ('SPECIAL', u']')]:
+ self.tokens[self.pos:self.pos+2] = [('SPECIAL', ']'), (']]', ']]')]
+
+ token = self.token
+
+
+ if token[0] == 'SPECIAL' and token[1]==']':
+ self.next()
+ n.__class__ = NamedURL
+ n.caption = u
+ del n.children[:2]
+ break
+ elif token[0] in FirstAtom:
+ n.append(self.parseAtom())
+ else:
+ break
+
+ return n
+
+
+ def parseArticle(self):
+ a=Article(self.name)
+
+ while self.left:
+ token = self.token
+ if token[0] == 'SECTION':
+ a.append(self.parseSection())
+ elif token[0]=='BREAK':
+ self.next()
+ elif token[0] in FirstParagraph:
+ a.append(self.parseParagraph())
+ else:
+ log.info("in parseArticle: skipping", token)
+ self.next()
+
+ return a
+
+ def parseLink(self):
+ break_at = TokenSet(['BREAK', EndTagToken, 'SECTION'])
+
+ obj = Link()
+ self.next()
+ while self.left:
+ token = self.token
+ if token[0] == ']]':
+ self.next()
+ break
+ elif token[0]=='SPECIAL' and token[1]==']':
+ self.next()
+ break
+ elif token[1] == '|' or token[1]=="||":
+ obj.append(Control('|'))
+ self.next()
+ elif token[0]=='TEXT' or token[0]=='SPECIAL' or token[0]=='\n':
+ obj.append(Text(token[1]), merge=True)
+ self.next()
+ elif token[0] in break_at:
+ break
+ elif token[0] in FirstAtom:
+ obj.append(self.parseAtom())
+ elif token[1].startswith("|"):
+ obj.append(Control("|"))
+ obj.append(Text(token[1][1:]))
+ self.next()
+ else:
+ log.info("assuming text in parseLink", token)
+ obj.append(Text(token[1]), merge=True)
+ self.next()
+
+ obj._specialize()
+
+ return obj
+
+ def parseTag(self):
+ token = self.token[0]
+
+ n = TagNode(token.t)
+ if token.values:
+ n.values = token.values
+ n.vlist = parseParams(self.token[1])
+
+ n.starttext = token.text
+ n.endtext = u'</%s>' % token.t
+ self.next()
+
+ if token.selfClosing:
+ return n
+
+
+ end = EndTagToken(token.t)
+
+ while self.left:
+ token = self.token
+ if token[0]==end:
+ n.endtext = token[0].text
+ self.next()
+ break
+ elif token[0]=='BREAK':
+ self.next()
+ else:
+ if token[0] not in FirstParagraph:
+ log.warn("tag not closed", n, token)
+ break
+ n.append(self.parseParagraph())
+
+ return n
+
+ def parsePRETag(self):
+ token = self.token[0]
+ if token.t.lower()=='pre':
+ n=PreFormatted()
+ else:
+ n=TagNode(token.t)
+ n.starttext = ''
+ n.endtext = ''
+
+ n.vlist = parseParams(self.token[1])
+
+ end = EndTagToken(self.token[0].t)
+ self.next()
+
+ txt = []
+ while self.left:
+ token = self.token
+ if token[0]==end:
+ self.next()
+ break
+ txt.append(token[1])
+ self.next()
+
+ n.append(Text("".join(txt)))
+ return n
+
+ parseCODETag = parsePRETag
+ parseSOURCETag = parsePRETag
+ def parseA7831D532A30DF0CD772BBC895944EC1Tag(self):
+ p = self.parseTag()
+ p.__class__ = Magic
+ return p
+
+ parseREFTag = parseTag
+ parseREFERENCESTag = parseTag
+
+ parseDIVTag = parseTag
+ parseSPANTag = parseTag
+ parseSUPTag = parseTag
+ parseINDEXTag = parseTag
+ parseTTTag = parseTag
+
+ parseH1Tag = parseTag
+ parseH2Tag = parseTag
+ parseH3Tag = parseTag
+ parseH4Tag = parseTag
+ parseH5Tag = parseTag
+ parseH6Tag = parseTag
+
+ parseINPUTBOXTag = parseTag
+
+ parseRSSTag = parseTag
+
+ parseSTRIKETag = parseTag
+ parseCODETag = parseTag
+ parseDELTag = parseTag
+ parseINSTag = parseTag
+ parseCENTERTag = parseTag
+ parseSTARTFEEDTag = parseTag
+ parseENDFEEDTag = parseTag
+ parseCENTERTag = parseTag
+
+ def parseGALLERYTag(self):
+ node = self.parseTag()
+ txt = "".join(x.caption for x in node.find(Text))
+ #print "GALLERY:", repr(txt)
+
+ children=[]
+
+ lines = [x.strip() for x in txt.split("\n")]
+ for x in lines:
+ if not x:
+ continue
+
+ # either image link or text inside
+ # FIXME: Styles and links in text are ignored!
+ n=_parseAtomFromString(u'[['+x+']]')
+
+ if isinstance(n, ImageLink):
+ children.append(n)
+ else:
+ children.append(Text(x))
+
+ node.children=children
+
+ return node
+
+ def parseIMAGEMAPTag(self):
+ node = self.parseTag()
+ txt = "".join(x.caption for x in node.find(Text))
+ #from mwlib import imgmap
+ #node.imagemap = imgmap.ImageMapFromString(txt)
+
+ class FakeImageMap(object):
+ pass
+
+ node.imagemap = FakeImageMap()
+ node.imagemap.entries = []
+ node.imagemap.imagelink = None
+ match = re.search('Image:.*', txt)
+
+ if match:
+ node.imagemap.image = match.group(0)
+ else:
+ node.imagemap.image = None
+
+ parse_fields_in_imagemap(node.imagemap)
+
+ #print node.imagemap
+ return node
+
+ def parseSection(self):
+ s = Section()
+
+ level = self.token[1].count('=')
+ s.level = level
+ closelevel = 0
+
+ self.next()
+
+ title = Node()
+ while self.left:
+ token = self.token
+
+ if token[0] == 'ENDSECTION':
+ closelevel = self.token[1].count('=')
+ self.next()
+ break
+ elif token[0] == '[[':
+ title.append(self.parseLink())
+ elif token[0] == "STYLE":
+ title.append(self.parseStyle())
+ elif token[0] == 'TEXT':
+ self.next()
+ title.append(Text(token[1]))
+ elif isinstance(token[0], TagToken):
+ title.append(self.parseTagToken())
+ elif token[0] == 'URLLINK':
+ title.append(self.parseUrlLink())
+ elif token[0] == 'MATH':
+ title.append(self.parseMath())
+ else:
+ self.next()
+ title.append(Text(token[1]))
+
+ s.level = min(level, closelevel)
+ if s.level==0:
+ title.children.insert(0, Text("="*level))
+ s.__class__ = Node
+ else:
+ diff = closelevel-level
+ if diff>0:
+ title.append(Text("="*diff))
+ elif diff<0:
+ title.children.insert(0, Text("="*(-diff)))
+
+ s.append(title)
+
+
+ while self.left:
+ token = self.token
+ if token[0] == 'SECTION':
+ if token[1].count('=') <= level:
+ return s
+
+ s.append(self.parseSection())
+ elif token[0] in FirstParagraph:
+ s.append(self.parseParagraph())
+ else:
+ log.info("in parseSection: skipping", token)
+ break
+
+ return s
+
+ def parseStyle(self):
+ end = self.token[1]
+ b = Style(self.token[1])
+ self.next()
+
+ break_at = TokenSet(['BREAK', '\n', 'ENDEOLSTYLE', 'SECTION', 'ENDSECTION',
+ 'BEGINTABLE', ']]', 'ROW', 'COLUMN', 'ENDTABLE', EndTagToken])
+
+ while self.left:
+ token = self.token
+ if token[0]=="STYLE":
+ if token[1]==end:
+ self.next()
+ break
+ else:
+ new = token[1]
+ if end=="'''''":
+ if token[1]=="''":
+ new = "'''"
+ else:
+ new = "''"
+ elif end=="''":
+ if token[1]=="'''":
+ new = "'''''"
+ elif token[1]=="'''''":
+ new = "'''"
+ elif end=="'''":
+ if token[1]=="''":
+ new = "'''''"
+ elif token[1]=="'''''":
+ new = "''"
+
+ self.tokens[self.pos] = ("STYLE", new)
+ break
+ elif token[0] in break_at:
+ break
+ elif token[0] in FirstAtom:
+ b.append(self.parseAtom())
+ else:
+ log.info("assuming text in parseStyle", token)
+ b.append(Text(token[1]))
+ self.next()
+
+ return b
+
+
+ def parseColumn(self):
+ token = self.token
+ c = Cell()
+
+ params = ''
+ if "|" in token[1] or "!" in token[1]: # not a html cell
+ # search for the first occurence of "||", "|", "\n" in the next tokens
+ # if it's a "|" we have a parameter list
+ self.next()
+ savepos = self.pos
+
+ while self.left:
+ token = self.token
+ self.next()
+ if token[0] in ("\n", "BREAK", "[[", "ROW", "ENDTABLE"):
+ params = ''
+ self.pos = savepos
+ break
+ elif (token[0]=='SPECIAL' or token[0]=='COLUMN') and token[1]=='|':
+ break
+ params += token[1]
+
+ c.vlist = parseParams(params)
+
+ elif token[0]=='COLUMN': # html cell
+ params=parseParams(token[1])
+ #print "CELLTOKEN:", token
+ #print "PARAMS:", params
+ c.vlist = params
+ self.next()
+
+
+
+ while self.left:
+ token = self.token
+ if token[0] in ("COLUMN", "ENDTABLE", "ROW"):
+ break
+
+ if token[0] == 'BEGINTABLE':
+ c.append(self.parseTable())
+ elif token[0]=='SPECIAL' and token[1] == '|':
+ self.next()
+ elif token[0] == 'SECTION':
+ c.append(self.parseSection())
+ elif token[0] in FirstParagraph:
+ c.append(self.parseParagraph())
+ elif isinstance(token[0], EndTagToken):
+ log.info("ignoring %r in parseColumn" % (token,))
+ self.next()
+ else:
+ log.info("assuming text in parseColumn", token)
+ c.append(Text(token[1]))
+ self.next()
+
+ return c
+
+
+ def parseRow(self):
+ r = Row()
+ r.vlist={}
+
+ token = self.token
+ params = ''
+ if token[0]=='ROW':
+ self.next()
+ if "|-" in token[1]:
+ # everything till the next newline/break is a parameter list
+ while self.left:
+ token = self.token
+ if token[0]=='\n' or token[0]=='BREAK':
+ break
+ else:
+ params += token[1]
+ self.next()
+ r.vlist = parseParams(params)
+
+ else:
+ # html row
+ r.vlist = parseParams(token[1])
+
+
+ while self.left:
+ token = self.token
+ if token[0] == 'COLUMN':
+ r.append(self.parseColumn())
+ elif token[0] == 'ENDTABLE':
+ return r
+ elif token[0] == 'ROW':
+ return r
+ elif token[0] == 'BREAK':
+ self.next()
+ elif token[0]=='\n':
+ self.next()
+ else:
+ log.warn("skipping in parseRow: %r" % (token,))
+ self.next()
+ return r
+
+ def parseCaption(self):
+ token = self.token
+ self.next()
+ n = Caption()
+ params = ""
+ if token[1].strip().startswith("|+"):
+ # search for the first occurence of "||", "|", "\n" in the next tokens
+ # if it's a "|" we have a parameter list
+ savepos = self.pos
+ while self.left:
+ token = self.token
+ self.next()
+ if token[0] in ("\n", "BREAK", "[[", "ROW", "COLUMN", "ENDTABLE"):
+ params = ''
+ self.pos = savepos
+ break
+ elif token[0]=='SPECIAL' and token[1]=='|':
+ break
+ params += token[1]
+
+ n.vlist = parseParams(params)
+
+ while self.left:
+ token = self.token
+ if token[0] in ('TEXT' , 'SPECIAL', '\n'):
+ if token[1]!='|':
+ n.append(Text(token[1]))
+ self.next()
+ elif token[0] == 'STYLE':
+ n.append(self.parseStyle())
+ elif isinstance(token[0], TagToken):
+ n.append(self.parseTagToken())
+ elif token[0] == '[[':
+ n.append(self.parseLink())
+ else:
+ break
+ return n
+
+ def parseTable(self):
+ token = self.token
+ self.next()
+ t = Table()
+
+ params = ""
+ if "{|" in token[1]: # not a <table> tag
+ # everything till the next newline/break is a parameter list
+ while self.left:
+ token = self.token
+ if token[0]=='\n' or token[0]=='BREAK':
+ break
+ else:
+ params += token[1]
+ self.next()
+ t.vlist = parseParams(params)
+ else:
+ t.vlist = parseParams(token[1])
+
+ while self.left:
+ token = self.token
+ if token[0]=='ROW' or token[0]=='COLUMN':
+ t.append(self.parseRow())
+ elif token[0]=='TABLECAPTION':
+ t.append(self.parseCaption())
+ elif token[0]=='ENDTABLE':
+ self.next()
+ break
+ elif token[0]=='\n':
+ self.next()
+ else:
+ log.warn("skipping in parseTable", token)
+ self.next()
+ #t.append(self.parseRow())
+
+ return t
+
+ def parseMath(self):
+ self.next()
+ caption = u''
+ while self.left:
+ token = self.token
+ self.next()
+ if token[0]=='ENDMATH':
+ break
+ caption += token[1]
+ return Math(caption)
+
+ def parseTimeline(self):
+ t=Timeline()
+ self.next()
+ snippets = []
+ while self.left:
+ token = self.token
+ self.next()
+ if token[0]=='TIMELINE':
+ break
+ snippets.append(token[1])
+ t.caption = "".join(snippets)
+ return t
+
+ def parseEOLStyle(self):
+ token = self.token
+ maybe_definition = False
+ if token[1]==';':
+ p=Style(";")
+ maybe_definition = True
+ elif token[1].startswith(':'):
+ p=Style(token[1])
+ else:
+ p=Style(":")
+
+ assert p
+ retval = p
+
+ self.next()
+
+ last = None
+ # search for the newline and replace it with ENDEOLSTYLE
+ for idx in range(self.pos, len(self.tokens)-1):
+ if self.tokens[idx][0]=='BREAK' or self.tokens[idx][0]=='\n':
+ last = idx, self.tokens[idx]
+ self.tokens[idx] = ("ENDEOLSTYLE", self.tokens[idx][1])
+ break
+
+ break_at = TokenSet(['ENDEOLSTYLE', 'BEGINTABLE', 'BREAK', EndTagToken])
+
+ while self.left:
+ token = self.token
+ if token[0] in break_at:
+ break
+ elif maybe_definition and token[1]==':':
+ self.next()
+ maybe_definition = False
+ retval = Node()
+ retval.append(p)
+ p = Style(":")
+ retval.append(p)
+
+ elif token[0] in FirstAtom:
+ p.append(self.parseAtom())
+ else:
+ log.info("in parseEOLStyle: assuming text", token)
+ p.append(Text(token[1]))
+ self.next()
+
+ if last:
+ self.tokens[last[0]] = last[1]
+
+ return retval
+
+ def parseParagraph(self):
+ p = Node()
+
+ while self.left:
+ token = self.token
+ if token[0]=='EOLSTYLE':
+ p.append(self.parseEOLStyle())
+ elif token[0]=='PRE':
+ pre = self.parsePre()
+ if pre is None:
+ # empty line with spaces. handle like BREAK
+ p.__class__ = Paragraph
+ break
+ p.append(pre)
+ elif token[0] == 'BREAK':
+ self.next()
+ p.__class__ = Paragraph
+ break
+ elif token[0] == 'SECTION':
+ p.__class__ = Paragraph
+ break
+ elif token[0] == 'ENDSECTION':
+ p.append(Text(token[1]))
+ self.next()
+ elif token[0] in FirstAtom:
+ p.append(self.parseAtom())
+ else:
+ break
+
+ if not self.left:
+ p.__class__ = Paragraph
+
+ if p.children:
+ return p
+ else:
+ return None
+
+ def parseTagToken(self):
+ tag = self.token[0].t
+ try:
+ m=getattr(self, 'parse'+tag.upper()+'Tag')
+ except (AttributeError, UnicodeEncodeError):
+ t=Text(self.token[1])
+ self.next()
+ return t
+ else:
+ return m()
+
+ def parseEMTag(self):
+ return self._parseStyledTag(Style("''"))
+
+ def parseITag(self):
+ return self._parseStyledTag(Style("''"))
+
+ def parseBTag(self):
+ return self._parseStyledTag(Style("'''"))
+
+ def parseSTRONGTag(self):
+ return self._parseStyledTag(Style("'''"))
+
+ def parseBLOCKQUOTETag(self):
+ return self._parseStyledTag(Style(":"))
+
+ def _parseStyledTag(self, style=None):
+
+ token = self.token[0]
+ if style is None:
+ style = Style(token.t)
+
+ b = style
+ end = EndTagToken(token.t)
+ start = TagToken(token.t)
+ self.next()
+
+
+ if token.selfClosing:
+ return style
+
+ break_at = set(["ENDTABLE", "ROW", "COLUMN", "ITEM", "BREAK", "SECTION", "BEGINTABLE"])
+
+ while self.left:
+ token = self.token
+ if token[0] in break_at:
+ break
+ elif token[0]=='\n':
+ b.append(Text(token[1]))
+ self.next()
+ elif token[0]==end:
+ self.next()
+ break
+ elif isinstance(token[0], EndTagToken):
+ break
+ elif isinstance(token[0], TagToken):
+ if token[0]==start:
+ self.next() # 'Nuclear fuel' looks strange otherwise
+ break
+ b.append(self.parseTagToken())
+ elif token[0] in FirstAtom:
+ b.append(self.parseAtom())
+ else:
+ log.info("_parseStyledTag: assuming text", token)
+ b.append(Text(token[1]))
+ self.next()
+
+ return b
+
+ parseVARTag = parseCITETag = parseSTag = parseSUBTag = parseBIGTag = parseSMALLTag = _parseStyledTag
+
+ def parseBRTag(self):
+ token = self.token[0]
+ n = TagNode(token.t)
+ n.starttext = token.text
+ n.endtext = u''
+ self.next()
+ return n
+
+ parseHRTag = parseBRTag
+
+ def parseUTag(self):
+ token = self.token
+ if "overline" in self.token[1].lower():
+ s = Style("overline")
+ else:
+ s = None
+
+ return self._parseStyledTag(s)
+
+ def parsePre(self):
+ p = n = PreFormatted()
+ token = self.token
+ p.append(Text(token[1]))
+
+ self.next()
+
+ # find first '\n' not followed by a 'PRE' token
+ last = None
+ for idx in range(self.pos, len(self.tokens)-1):
+ if self.tokens[idx][0] in ['ROW', 'COLUMN', 'BEGINTABLE', 'ENDTABLE', 'TIMELINE', 'MATH']:
+ return None
+
+ if self.tokens[idx][0]=='BREAK':
+ break
+
+ if self.tokens[idx][0]=='\n' and self.tokens[idx+1][0]!='PRE':
+ last = idx, self.tokens[idx]
+ self.tokens[idx]=('ENDPRE', '\n')
+ break
+
+
+ while self.left:
+ token = self.token
+ if token[0] == 'ENDPRE' or token[0]=='BREAK':
+ break
+ if token[0]=='\n' or token[0]=='PRE' or token[0]=='TEXT':
+ p.append(Text(token[1]))
+ self.next()
+ elif token[0] == 'SPECIAL':
+ p.append(Text(token[1]))
+ self.next()
+ elif isinstance(token[0], EndTagToken):
+ break
+ elif isinstance(token[0], TagToken):
+ if token[0] == tag_div:
+ break
+
+ p.append(self.parseTagToken())
+ elif token[0] in FirstAtom:
+ p.append(self.parseAtom())
+ else:
+ log.info("in parsePre: assuming text", token)
+ p.append(Text(token[1]))
+ self.next()
+
+ if last:
+ self.tokens[last[0]] = last[1]
+
+ for x in p:
+ if not isinstance(x, Text):
+ return p
+ if x.caption.strip():
+ return p
+
+ return None
+
+
+
+ def parseOLTag(self):
+ numbered = parseParams(self.token[1]).get('type', '1')
+ return self._parseHTMLList(numbered)
+
+ def parseULTag(self):
+ return self._parseHTMLList(False)
+
+ def parseLITag(self):
+
+ p = item = Item()
+
+ p.vlist = parseParams(self.token[1])
+
+ self.next()
+ break_at = TokenSet([EndTagToken, 'ENDTABLE', 'SECTION'])
+ while self.left:
+ token = self.token
+ if token[0] == '\n':
+ p.append(Text(token[1]))
+ self.next()
+ elif token[0] == 'EOLSTYLE':
+ p.append(self.parseEOLStyle())
+ elif token[0]=='BREAK':
+ append_br_tag(p)
+ self.next()
+ elif token[0]==tag_li:
+ break
+ elif token[0]==EndTagToken("li"):
+ self.next()
+ break
+ elif token[0] in break_at:
+ break
+ elif token[0] in FirstAtom:
+ p.append(self.parseAtom())
+ else:
+ log.info("in parseLITag: assuming text", token)
+ p.append(Text(token[1]))
+ self.next()
+
+ return item
+
+
+ def _parseHTMLList(self, numbered):
+ lst = ItemList()
+ lst.numbered = numbered
+
+ end = EndTagToken(self.token[0].t)
+
+ self.next()
+ while self.left:
+ token = self.token
+ if token[0]==end:
+ self.next()
+ break
+ elif isinstance(token[0], TagToken):
+ lst.append(self.parseTagToken())
+ elif token[0]=='ITEM':
+ lst.append(self.parseItemList())
+ elif token[0] in FirstAtom:
+ lst.append(self.parseAtom())
+ else:
+ log.info("assuming text in _parseHTMLList", token)
+ lst.append(Text(token[1]))
+ self.next()
+
+ return lst
+
+
+ def parseItemList(self):
+ # actually this parses multiple nested item lists..
+ items = []
+ while self.left:
+ token = self.token
+ if token[0]=='ITEM':
+ items.append(self.parseItem())
+ else:
+ break
+
+ # hack
+ commonprefix = lambda x,y : os.path.commonprefix([x,y])
+
+ current_prefix = u''
+ stack = [Node()]
+
+ def append_item(parent, node):
+ if parent is stack[0]:
+ parent.append(node)
+ return
+
+ if not parent.children:
+ parent.children.append(Item())
+
+ parent.children[-1].append(node)
+
+ for item in items:
+ prefix = item.prefix.strip(":")
+ common = commonprefix(current_prefix, item.prefix)
+
+ stack = stack[:len(common)+1]
+
+ create = prefix[len(common):]
+ for x in create:
+ itemlist = ItemList()
+ itemlist.numbered = (x=='#')
+ append_item(stack[-1], itemlist)
+ stack.append(itemlist)
+ stack[-1].append(item)
+ current_prefix = prefix
+
+ return stack[0]
+
+ def parseItem(self):
+ p = item = Item()
+ p.prefix = self.token[1]
+
+ self.token[1]
+ break_at = TokenSet(["ENDTABLE", "COLUMN", "ROW"])
+
+ self.next()
+ while self.left:
+ token = self.token
+
+ if token[0] == '\n':
+ self.next()
+ break
+ elif token[0]=='BREAK':
+ break
+ elif token[0]=='SECTION':
+ break
+ elif isinstance(token[0], EndTagToken):
+ break
+ elif token[0] in break_at:
+ break
+ elif token[0] in FirstAtom:
+ p.append(self.parseAtom())
+ else:
+ log.info("in parseItem: assuming text", token)
+ p.append(Text(token[1]))
+ self.next()
+ return item
+
+
+ def parse(self):
+ log.info("Parsing", repr(self.name))
+ try:
+ return self.parseArticle()
+ except Exception, err:
+ log.error("error while parsing article", repr(self.name), repr(err))
+ raise
+
+def main():
+ #import htmlwriter
+ from mwlib.dummydb import DummyDB
+ db = DummyDB()
+
+ for x in sys.argv[1:]:
+ input = unicode(open(x).read(), 'utf8')
+ from mwlib import expander
+ te = expander.Expander(input, pagename=x, wikidb=db)
+ input = te.expandTemplates()
+
+
+ tokens = tokenize(input, x)
+
+ p=Parser(tokens, os.path.basename(x))
+ r = p.parse()
+
+ show(sys.stdout, r, 0)
+
+ #hw = htmlwriter.HTMLWriter(htmlout)
+
+if __name__=="__main__":
+ main()
diff --git a/mwlib/recorddb.py b/mwlib/recorddb.py
new file mode 100755
index 0000000..fe895cf
--- /dev/null
+++ b/mwlib/recorddb.py
@@ -0,0 +1,83 @@
+#! /usr/bin/env python
+
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+
+import simplejson
+import zipfile
+from mwlib import uparser, parser
+import mwlib.log
+log = mwlib.log.Log("zip")
+
+
+class RecordDB(object):
+ def __init__(self, db):
+ assert db is not None, "db must not be None"
+ self.db = db
+ self.articles = {}
+ self.templates = {}
+
+ def getRawArticle(self, name, revision=None):
+ r = self.db.getRawArticle(name, revision=revision)
+ self.articles[name] = {
+ 'revision': revision,
+ 'content-type': 'text/x-wiki',
+ 'content': r,
+ 'url': self.db.getURL(name, revision=revision),
+ 'authors': self.db.getAuthors(name, revision=revision),
+ }
+ return r
+
+ def getTemplate(self, name, followRedirects=False):
+ r = self.db.getTemplate(name, followRedirects=followRedirects)
+ self.templates[name] = {
+ 'content-type': 'text/x-wiki',
+ 'content': r,
+ }
+ return r
+
+
+class ZipfileCreator(object):
+ def __init__(self, zf, wikidb=None, imgdb=None):
+ self.zf = zf
+ self.db = RecordDB(wikidb)
+ self.images = {}
+ self.imgdb = imgdb
+
+ def addObject(self, name, value):
+ """
+ @type name: unicode
+
+ @type value: str
+ """
+
+ self.zf.writestr(name.encode('utf-8'), value)
+
+ def addArticle(self, title, revision=None):
+ a = uparser.parseString(title, revision=revision, wikidb=self.db)
+ for x in a.allchildren():
+ if isinstance(x, parser.ImageLink):
+ name = x.target
+ self.images[name] = {}
+
+ def writeImages(self, size=None):
+ if self.imgdb is None:
+ return
+
+ for name in sorted(self.images.keys()):
+ dp = self.imgdb.getDiskPath(name, size=size)
+ if dp is None:
+ continue
+ self.zf.write(dp, (u"images/%s" % name.replace("'", '-')).encode("utf-8"))
+ self.images[name]['url'] = self.imgdb.getURL(name, size=size)
+ license = self.imgdb.getLicense(name)
+ if license:
+ self.images[name]['license'] = license
+
+ def writeContent(self):
+ self.addObject('content.json', simplejson.dumps(dict(
+ articles=self.db.articles,
+ templates=self.db.templates,
+ images=self.images,
+ )))
+
diff --git a/mwlib/rendermath.py b/mwlib/rendermath.py
new file mode 100755
index 0000000..10d6cdd
--- /dev/null
+++ b/mwlib/rendermath.py
@@ -0,0 +1,144 @@
+#! /usr/bin/env python
+
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+
+import os
+import re
+try:
+ from hashlib import md5
+except ImportError:
+ from md5 import md5
+
+from mwlib import texmap
+import mwlib.log
+
+log = mwlib.log.Log("rendermath")
+
+latex = r"""
+%% %(ident)s
+\documentclass[%(fontsize)spt]{article}
+%(extra_header)s
+\usepackage{ucs}
+\usepackage{amsmath}
+\usepackage{amsfonts}
+\usepackage{amssymb}
+
+%% \newcommand{\R}[0]{\mathbb{R}}
+
+\def\Alpha{{A{}}}
+\def\Beta{{B{}}}
+\def\Epsilon{{E{}}}
+\def\Zeta{{Z{}}}
+\def\Eta{{H{}}}
+\def\Iota{{I{}}}
+\def\Kappa{{K{}}}
+\def\Mu{{M{}}}
+\def\Nu{{N{}}}
+\def\Rho{{P{}}}
+\def\Tau{{T{}}}
+\def\Chi{{C{}}}
+
+\usepackage[utf8x]{inputenc}
+\usepackage[dvips]{graphicx}
+\pagestyle{empty}
+\begin{document}
+%(source)s
+\end{document}
+"""
+
+
+
+
+
+
+def mysystem(cmd):
+ err=os.system(cmd)
+ if err:
+ raise RuntimeError("exit code %s while running %r" % (err, cmd))
+
+class Renderer(object):
+ basedir = os.path.expanduser("~/pngmath/")
+
+ def __init__(self, basedir=None, lazy=True):
+ if basedir:
+ self.basedir = os.path.realpath(os.path.join(basedir, 'pngmath/'))
+ if not os.path.exists(self.basedir):
+ #os.makedirs(self.basedir)
+ pass
+ self.lazy = lazy
+
+ def _render_file(self, name, format):
+ assert format in ('pdf', 'png', 'eps'), "rendermath: format %r not supported" % format
+
+ texfile = os.path.join(self.basedir, name+'.tex')
+ srcbase = os.path.join(self.basedir, name)
+
+ cwd = os.getcwd()
+ os.chdir(self.basedir)
+ try:
+ mysystem("latex -interaction=batchmode %s" % texfile)
+ mysystem("dvips -E %s.dvi -o %s.ps" % (srcbase, srcbase))
+ if format=='png':
+ mysystem("convert +adjoin -transparent white -density 300x300 %s.ps %s.png" % (srcbase, srcbase))
+ elif format=='pdf':
+ mysystem("epstopdf %s.ps" % srcbase)
+ elif format=='eps':
+ os.rename("%s.ps" % srcbase, "%s.eps" % srcbase)
+ finally:
+ for x in ['.dvi', '.aux', '.log', '.ps']:
+ p = os.path.join(self.basedir, name+x)
+ try:
+ os.unlink(p)
+ except OSError, err:
+ pass
+
+ os.chdir(cwd)
+
+ def _normalizeLatex(self, latexsource):
+ latexsource = re.compile("\n+").sub("\n", latexsource)
+ return latexsource
+
+ def convert(self, latexsource, lazy=True, format='pdf', addMathEnv=True):
+ assert format in ('pdf', 'png', 'eps'), "rendermath: format %r not supported" % format
+ latexsource = self._normalizeLatex(latexsource)
+ if addMathEnv:
+ latexsource = '$' + latexsource + '$'
+ if format in ('pdf', 'eps'):
+ extra_header = '\usepackage{geometry}\n\geometry{textwidth=3.0in}\n'
+ fontsize = 10
+ else:
+ fontsize = 12
+ extra_header = ''
+
+ latexsource = texmap.convertSymbols(latexsource)
+
+ source = latex % dict(source=latexsource,
+ ident=format,
+ fontsize=fontsize,
+ extra_header=extra_header)
+
+ m=md5()
+ m.update(source)
+ name = m.hexdigest()
+
+ srcbase = os.path.join(self.basedir, name)
+ texfile = os.path.join(self.basedir, name+'.tex')
+ outfile = os.path.join(self.basedir, name+'.'+format)
+
+ if os.path.exists(outfile):
+ return outfile # FIXME
+
+ open(texfile, 'w').write(source)
+
+ if not lazy:
+ self._render_file(name, format)
+
+
+ return outfile
+
+ def render(self, latexsource, lazy=None, addMathEnv=True):
+ if lazy is None:
+ lazy = self.lazy
+ return self.convert(latexsource, lazy=lazy, format='png', addMathEnv=addMathEnv)
+
diff --git a/mwlib/resources/__init__.py b/mwlib/resources/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/mwlib/resources/__init__.py
diff --git a/mwlib/resources/outgoing_link.gif b/mwlib/resources/outgoing_link.gif
new file mode 100644
index 0000000..d508fc4
--- /dev/null
+++ b/mwlib/resources/outgoing_link.gif
Binary files differ
diff --git a/mwlib/resources/pedia.css b/mwlib/resources/pedia.css
new file mode 100644
index 0000000..3e814ef
--- /dev/null
+++ b/mwlib/resources/pedia.css
@@ -0,0 +1,1250 @@
+/* ############# misc #################*/
+body, p, li, ul, a {
+ margin:0px;
+ padding:0px;
+}
+
+body {
+ background-color:#F4F5E7;
+ font-family:arial;
+ font-size:10pt;
+}
+
+img {
+ border:0;
+ }
+
+* {
+ font-size:10pt;
+ }
+
+h1, h1 * {
+ font-size:20pt;
+ }
+
+h2, h2 * {
+ font-size:14pt;
+ }
+
+h3, h3 * {
+ font-size:13pt;
+ }
+
+.invisible {
+ display: none;
+}
+
+/* ############### base ########### */
+
+* a, * a:hover, * a:visited, * a:active {
+ color:rgb(29,48,161);
+ }
+
+
+
+#header {
+ text-align:right;
+ height:74px;
+ padding:0px;
+ margin:0px;
+ table-layout:fixed;
+ overflow:hidden;
+}
+
+#main_nav {
+ padding-top:5px;
+ margin-right:20px;
+ height:47px !important;
+ /* height:50px !important; */
+ height:54px;
+ /* height:57px; */
+}
+
+#main_nav a {
+ font-size:10pt;
+ font-weight:bold;
+ color: black;
+ text-decoration:none;
+}
+
+#main_nav ul {
+ line-height:12pt;
+}
+
+#main_nav li {
+ display:inline;
+}
+
+#tab_nav {
+ position:absolute;
+ /* top:60px !important;
+ top:57px; */
+
+ top:66px !important;
+ top:63px;
+ right:30px;
+ border:0px;
+ }
+
+
+#errorarea, #busyarea {
+ position:absolute;
+ top:40%;
+ left:30%;
+ width:40%;
+ height:10%;
+ border:2px solid rgb(196,196,196);
+ background-color: rgb(255,136,0);
+ text-align:center;
+ }
+
+head:first-child+body #busyarea { /* this is a hack to prevent IE to read this*/
+ position:fixed;
+ }
+
+#busyarea {
+ /* background-color:#F4F5E7; */
+ background-color:white;
+ }
+
+#errorarea {
+ background-color: rgb(255,136,0);
+ }
+
+a#errorclose {
+ color:black;
+ font-weight:bold;
+ }
+
+/* ######### misc table formatting ################*/
+
+/*
+#managebook table {
+ padding:0px;
+ margin:0px;
+ border-collapse:collapse;
+ border-spacing:0px;
+ }
+*/
+
+.roundbox, .roundbox tr, .roundbox td, .roundbox img, .clean, #tab_nav img, .snippet img {
+ padding:0px;
+ margin:0px;
+ border:0px;
+ border-collapse:collapse;
+ border-spacing:0px;
+ /* border-style:hidden; */
+}
+
+.tablefull {
+ margin:0px;
+ border:0px;
+ border-spacing:0px;
+ width:100%;
+ padding:5px;
+}
+
+/*
+.roundbox td {
+ background-color:white;
+}
+*/
+
+.roundboxContent {
+ background-color:white;
+ }
+
+/* ################## managebook ################## */
+
+#book_nav {
+ line-height:16pt;
+ font-size:10pt;
+}
+
+#book_nav input {
+ margin:0px;
+ vertical-align:bottom;
+ font-size:10pt;
+ width:220px;
+}
+
+ .link {
+ color:black;
+ margin-right:15px;
+}
+#book_nav img {
+ border:0px;
+ padding:0px;
+ margin:0px;
+ margin-left:10px;
+ margin-right:10px;
+ vertical-align:bottom;
+}
+.info li {
+ list-style-type:square;
+}
+
+#info li {
+ list-style-type:square;
+ margin-left:35px;
+}
+
+#info h2 {
+ margin:10px;
+ margin-top:15px;
+ }
+
+#info h2 a {
+ color:black;
+ }
+
+#info h3 {
+ margin-bottom:5px;
+ }
+
+#info p {
+ margin:10px;
+ }
+
+#tab_nav .info {
+ border:1px solid rgb(128,128,128);
+ font-size:8pt;
+ padding-left:20px;
+}
+
+.no_list_style li{
+ list-style-type:none !important;
+}
+
+#info h3 {
+ margin-left:10px;
+ }
+
+/* ################## main ################### */
+
+#main {
+ margin-top:0px;
+ margin-right:0px;
+}
+
+#main_content {
+ padding-left:10px;
+ padding-right:0px;
+ padding-top:5px;
+}
+
+#fromsearch {
+ margin-right:350px;
+ margin-bottom:10px;
+ margin-left:10px;
+ /* background-color: rgb(200, 220, 255); */
+ background-color:rgb(240,240,240);
+ border:2px solid rgb(251,88,33);
+ padding:5px;
+ }
+
+#wikipagecontent {
+ padding: 0px 10px;
+ }
+
+#add_pages {
+ float:right;
+ margin:0px;
+ background-color:white;
+ border:0px;
+}
+
+#add_pages img {
+ border:0px;
+ margin:5px 10px;
+}
+
+/* ******************** wikipedia article formatting ******************* */
+
+#main {
+ font-family: "Trebuchet MS", Trebuchet, Verdana, sans-serif;
+ /* font-family: Palatino Linotype, Book Antiqua, Palatino; */
+ font-size:10pt;
+ overflow:hidden;
+}
+
+#main h1 {
+ font-size:20pt;
+ margin-bottom:30px;
+ margin-right:10px;
+ border-bottom:1px solid rgb(128,128,128);
+}
+
+#main h2 {
+ z-index:-1;
+ font-size:14pt;
+ margin-right:20px;
+ border-bottom:1px solid rgb(128,128,128);
+}
+
+#main h3 {
+ margin-top:10px;
+ margin-bottom:5px;
+ font-size:13pt;
+}
+
+
+#main p {
+ margin-top:5px;
+}
+
+#main a {
+ text-decoration:none;
+}
+
+#main a:hover {
+ text-decoration:underline;
+}
+
+#main ul {
+ margin: 5px 15px;
+}
+#main ul li {
+ list-style-type:square;
+ margin-left:20px;
+}
+
+
+#main table {
+ empty-cells:show;
+ background-color:white;
+ margin:10px;
+}
+
+
+
+#main th {
+ font-weight:bold;
+ }
+
+
+#main .deadlink, #main .deadlink:hover {
+ text-decoration:none;
+ color:black;
+ }
+
+
+#main .infobox {
+ float:right;
+ border:1px solid grey;
+ padding:2px;
+ }
+
+#main .infobox td {
+ padding:2px 4px;
+ }
+
+#main .bordered {
+ border-collapse:collapse;
+ }
+
+#main .bordered td {
+ border:1px solid grey;
+ }
+
+#main .borderless *, #main .borderless {
+ border:0 !important;
+ }
+
+
+#main .infobox * {
+ font-size: 8pt;
+ }
+
+#main sub, #main sup {
+ font-size: 8pt;
+ margin-right:3px;
+ }
+
+
+#main .small * {
+ font-size:8pt;
+ }
+
+
+.border {
+ border:1px solid rgb(128,128,128);
+ border-collapse:collapse;
+}
+
+.image {
+ margin:10px;
+ padding:2px;
+ border:1px solid rgb(128,128,128);
+ background:white;
+}
+
+.clear {
+ clear:both;
+ }
+
+.right {
+ clear:right;
+ float:right;
+}
+
+/*
+.right + .right {
+ clear:right;
+ }
+*/
+
+.left {
+ clear:left;
+ float:left;
+}
+
+/*
+.left + .left {
+ clear:left;
+ }
+*/
+
+#main .formula {
+ vertical-align:middle;
+ }
+
+
+.imagecaption {
+ display:block;
+ font-size:8pt;
+ padding:2px;
+}
+
+.imagecaption *{
+ font-size:8pt;
+}
+
+/* .wikitable, .wikitable tr, */
+
+.wikitable {
+ border-collapse:collapse;
+}
+
+.wikitable td {
+ border:1px solid black;
+ border-spacing:0px;
+ padding:0px 2px;
+ }
+
+.toccolours {
+ border:1px solid black;
+ }
+
+
+/* ###### misc... ##### */
+
+.addButton img {
+ width:12px;
+ height:12px;
+ border:0;
+ margin-right:10px;
+ }
+
+.addButton div {
+ margin-right:10px;
+ width:12px;
+ display:inline;
+ }
+
+
+.addButton a {
+ margin-left:0px;
+ }
+
+
+/* ############## pagelist ####################### */
+
+#pagelist {
+ padding:10px;
+ }
+
+#collTitle {
+ /* margin-left:10px; */
+ font-size:12pt;
+ font-weight:bold;
+ border-bottom:1px solid rgb(128,128,128);
+ }
+
+#collEditTable {
+ margin:10px 0px;
+ }
+
+.box_content {
+ margin:10px 0px;
+ font-size:9pt;
+}
+
+#collInfo {
+ margin-top:10px;
+ font-size:10pt;
+ }
+
+.del_col {
+ /* width:2em; */
+ width:21px;
+ padding:0px 2px;
+ }
+
+.priceInfo {
+ margin-bottom:10px;
+ font-size:8pt;
+ }
+
+#collNumPages {
+ margin-top:10px;
+}
+
+#collNumPages, #collPrice {
+ font-weight:bold;
+ }
+
+#clearbook {
+ margin-top:10px;
+ }
+
+
+div.uitable table{
+ border-collapse: collapse;
+ /* border:1px solid rgb(196,196,196); */
+ cursor:pointer;
+}
+
+div.uitable table tbody tr {
+ padding:3px;
+ margin:3px;
+}
+
+/*
+div.uitable table tbody tr.ui_hover td{
+ background-color:#BACFE4;
+}
+*/
+
+div.uitable table tbody tr.ui_active td {
+ /* background-color:#F4F5E7; */
+ font-weight:bold;
+
+}
+
+div.uitable td {
+ padding:0px 2px;
+ }
+
+div.uitable td:hover {
+ text-decoration:underline;
+ background-color:#BACFE4;
+ }
+
+
+/* ############################# index.html ########################### */
+
+#home_left, #home_right {
+ padding:0px 10px;
+ }
+
+#home_right span {
+ /* font-style:italic; */
+ border-bottom:1px solid rgb(128,128,128);
+
+}
+
+#home_right .heading {
+ width:450px;
+ border-bottom:1px solid rgb(128,128,128);
+ }
+
+
+#home_right li {
+ margin-left:20px;
+ font-style:normal;
+ font-weight: normal;
+ }
+
+#home_left p, #home_right p {
+ margin:0px 0px;
+ }
+
+#home_right h1 {
+ font-size:14pt;
+ /* color:rgb(64,64,64); */
+ color:rgb(32,32,32);
+ margin-right:15px;
+ margin-top:0px;
+ text-decoration:underline;
+ }
+
+#home_right h2 {
+ font-size:14pt;
+ color:rgb(64,64,64);
+ color:rgb(32,32,32);
+ margin-right:15px;
+ display:inline;
+ }
+
+#home_right ul {
+ margin-bottom:10px;
+ list-style-type:square;
+ }
+
+
+#home_left h2 {
+ font-size:14pt;
+ color:rgb(64,64,64);
+ color:rgb(32,32,32);
+ margin-top:5px;
+ margin-bottom:5px;
+ }
+
+#home_left li {
+ list-style-type:none;
+ margin-bottom:5px;
+ margin-left:0px;
+ padding-left:0px;
+ }
+
+#home_left .title {
+ font-weight:bold;
+ font-style:italic;
+ }
+
+#home_left td {
+ padding:3px 2px;
+ }
+
+
+
+#finish_book {
+ line-height:18pt;
+ }
+
+#finish_book .label {
+ font-weight:bold;
+ vertical-align:bottom;
+ text-align:right;
+ padding-right:5px;
+ }
+
+#finish_book .input {
+ vertical-align:bottom;
+ text-align:left;
+ padding-left:5px;
+ }
+
+#finish_book input {
+ padding: 0px 5px;
+ margin:2px 0px;
+ width:400px;
+ }
+
+#booktitle {
+ font-size:14pt;
+}
+
+#bookeditor {
+ font-size:12pt;
+ }
+
+
+#finish_book table {
+ margin-bottom:5px;
+}
+
+#wp_footer {
+ clear:both;
+ float:right;
+ margin-top:10px;
+ margin-bottom:10px;
+ padding:5px;
+ /* border:2px solid rgb(230,230,230); */
+ border:2px solid rgb(251,88,33);
+ background-color:rgb(240,240,240);
+ }
+
+/* ++++++++++++++++++ order ++++++++++++++ */
+
+#order_pay h2 {
+ margin-top:0px;
+ }
+
+#order_content h2, #order_content h3, #showbook_content h2, #showbook_content h3 {
+ margin:5px 0px;
+ }
+
+#order_content h3, #showbook_content h3 {
+ margin-top:15px;
+ }
+
+
+#order_content li, #showbook_content li {
+ margin-right:10px;
+ list-style-type:none;
+ border-bottom:1px dotted grey;
+ }
+
+#order_content, #order_pay, #showbook_content {
+ margin:10px;
+ }
+
+#order_content a, #showbook_content a {
+ text-decoration:none;
+ }
+
+#order_content a:hover, #showbook_content a:hover {
+ text-decoration:underline;
+ }
+
+#cost .label, #ship .label, #contact_form .label {
+ text-align:right;
+ vertical-align:top;
+ }
+#cost .value #ship .value, #contact_form .value {
+ text-align:left;
+ }
+
+#cost td, #ship td, #contact_form td {
+ padding:2px 5px;
+ }
+
+#cost {
+ border:1px solid grey;
+ }
+
+#ship input, #ship textarea, #ship select {
+ width:250px;
+ }
+
+#terms_ok {
+ margin-left:10px;
+ }
+
+#terms_ok input {
+ margin-left:0px;
+
+ }
+
+#contact_form input, #contact_form select {
+ width: 250px;
+ }
+
+ #contact_form textarea {
+ width:400px;
+ }
+
+#contact h2 {
+ margin-top:0px;
+ }
+
+
+.tooltip {
+ background-color: rgb(255, 250, 200);
+ border: 1px solid black;
+ position: absolute;
+ z-index: 10000;
+ width: 200px;
+ padding:2px;
+ text-align:center;
+}
+
+.snippet {
+ background-color: rgb(200, 220, 255);
+ border: 1px solid black;
+ padding: 5px;
+ z-index: 10000;
+ position: absolute;
+ font-size: 10px;
+}
+
+#snippetid, #snippetid * {
+ font-size: 10pt;
+ font-style:normal;
+ font-weight:normal;
+}
+
+#snippetid em {
+ font-style:italic;
+ }
+
+#snippetid strong {
+ font-weight:bold;
+ }
+
+
+.hasborder {
+ border: 2px solid rgb(220,220,220);
+}
+
+.noborder {
+ border-width: 0px;
+ border: 2px solid white;
+}
+
+.greyedout {
+ color: rgb(127, 127, 127);
+}
+
+.notgreyedout {
+ color: black;
+}
+
+#terms dt {
+ margin-top:10px;
+ font-weight:bold;
+ }
+
+#terms .toc li {
+ margin-left:15px;
+ list-style-type:none;
+ }
+
+#terms p {
+ margin-top:10px;
+
+ }
+
+
+#terms p, #terms dt, #terms dd, #terms li, #terms a, #terms strong{
+ font-size:8pt;
+ }
+
+#terms h2, #terms h2 a {
+ font-size:12pt;
+ color:black;
+ }
+
+#terms h3 {
+ font-size:10pt;
+ }
+
+#terms li {
+ list-style-type:square;
+ }
+
+#refreshproposals {
+ padding:5px;
+ margin:5px;
+ margin-right:0px;
+ }
+
+
+.site_link {
+ border-bottom:1px dotted black;
+ color:black;
+ text-decoration:none;
+}
+
+.site_link:hover {
+ text-decoration:none !important;
+ }
+
+
+.topcats, .topcats * {
+ font-weight:bold;
+ list-style-type:none !important;
+ margin:0px;
+ padding:0px;
+ font-size:12pt;
+ border-bottom:1px solid rgb(128,128,128);
+ margin-top:5px;
+ }
+
+.topcats {
+ margin-right:5px;
+}
+
+.subcats {
+ margin-right:0px;
+ }
+
+
+#preview {
+ margin:10px;
+ }
+
+#preview h1 {
+ margin-top:0px;
+ margin-bottom:10px;
+ }
+
+#adobe_info {
+ float:right;
+ width:33%;
+ border:1px solid rgb(128,128,128);
+ border:1px solid rgb(196,196,196);
+ margin:10px;
+ margin-right:0px;
+ margin-top:0px;
+ padding:5px;
+
+ }
+
+#generating {
+ margin:0px;
+ }
+
+#finished p {
+ margin-bottom:10px;
+ }
+
+#affiliate {
+ padding:5px;
+ padding-top:0px;
+ }
+#affiliate p{
+ margin-bottom:10px;
+ }
+
+#affiliate li {
+ list-style-type:square;
+ margin-left:25px;
+ }
+#affiliate ul {
+ margin-bottom:10px;
+}
+
+#affiliatetable td{
+ padding:10px;
+ }
+
+#affiliatetable li {
+ list-style-type:none;
+ }
+
+#affiliatetable input {
+ margin-left:0px;
+ }
+
+.affiliatebox {
+ float:left;
+ width:45%;
+ margin:10px;
+ /* padding:10px; */
+ /* border:2px solid rgb(210,210,210); */
+ /* border:2px solid rgb(251,88,33); */
+ }
+
+.affiliateboxcontent {
+ margin:10px;
+ }
+
+.affiliatebox h2 {
+ margin:0px;
+ margin-bottom:10px;
+ }
+
+.affiliatebox ul li {
+ list-style-type:square;
+ margin-left:15px;
+ }
+
+.affiliatebox .nobullets li {
+ list-style-type:none;
+ margin-left:0px;
+ }
+
+
+
+#welcome {
+ padding:10px;
+ padding-top:5px;
+ margin:0px;
+ }
+
+#welcome h1 {
+ margin:0px;
+ margin-bottom:10px;
+ font-size:16pt;
+ color:rgb(32,32,32);
+ }
+
+
+#home_howto td{
+ padding:5px;
+ vertical-align:top;
+ }
+
+#home_howto .step_num {
+ font-size:20pt;
+ color:rgb(128,128,128);
+ float:left;
+ margin:5px;
+ }
+
+#home_howto li {
+ list-style-type:square;
+ margin-left:20px;
+ }
+
+#news .newsitem {
+ margin: 10px;
+ max-width:500px;
+ }
+
+#news .newsitem h3 {
+ font-size:12pt;
+ margin-bottom:5px;
+ margin-top:10px;
+ }
+
+.newsitem + .newsitem {
+ border-top:1px dotted rgb(128,128,128);
+ }
+
+#news .date {
+ float:right;
+ margin-top:5px;
+ margin-left:10px;
+ font-size:8pt;
+ }
+
+.deadlink {
+ color:black;
+}
+
+.smalltext, .smalltext em, .smalltext * {
+ font-size:8pt !important;
+ }
+
+.template_warningsmart {
+ border:3px solid red;
+}
+.template_warningmanual{
+ border:3px solid orange;
+ }
+
+.template_warningsmart * {
+ background-color:rgb(210,210,210);
+ }
+
+.template_warningmanual * {
+ background-color:rgb(230,230,230);
+ }
+
+
+ #startcats {
+ padding:5px;
+ }
+
+ #startcats h2, #startcats h3 {
+ margin:5px 0px;
+ }
+
+#startcats .topcats {
+ margin-bottom:5px;
+}
+
+#startcats .topcats *, #startcats .subcats * {
+ text-decoration:none;
+ }
+
+#startcats .topcats a {
+ border-bottom:0;
+ }
+
+.startcatbox {
+ width:30%;
+ float:left;
+ padding:10px;
+ padding-bottom:0px;
+ }
+
+.startcatbox h3 {
+ border-bottom:1px solid rgb(128,128,128);
+ }
+
+
+#lowpagecount, #highpagecount {
+ margin:10px 0px;
+ padding:10px;
+ border:2px solid rgb(251,88,33);
+ background-color:rgb(240,240,240);
+ }
+
+#highpagecount {
+ margin-left:10px;
+ }
+
+
+#examplebook {
+ padding:10px;
+ }
+
+#examplebook li {
+ list-style-type: none;
+ text-align:center;
+ margin-bottom:5px;
+ }
+
+#examplebook .book_img img {
+ border:1px dotted rgb(128,128,128);
+ padding:2px;
+ }
+
+#examplebook .info {
+ float:right;
+ border:1px dotted rgb(128,128,128);
+ padding:5px;
+ }
+
+#examplebook .navigation {
+ position:absolute;
+ margin:15px 0px;
+ border:1px dotted rgb(128,128,128);
+ padding:5px 15px;
+ }
+
+#examplebook .navigation li {
+ text-align:left;
+ }
+
+#examplebook .navigation a {
+ text-decoration:none;
+ }
+
+#examplebook .navigation a:hover {
+ text-decoration:underline;
+ }
+
+
+
+
+
+
+/* ######## pssearch */
+
+
+
+.pssnippet strong {
+ font-weight:normal;
+ }
+
+.pssnippet li {
+ margin-left:15px;
+ }
+
+.pssnippethl {
+ background-color: rgb(196, 224, 255);
+}
+
+
+#pssearch a {
+ color:rgb(28,53,110);
+ }
+
+/*
+#pssearch li {
+ margin-bottom:10px;
+ list-style-type:square;
+ }
+*/
+
+li.result {
+ margin-bottom:10px;
+ list-style-type:square;
+ }
+
+#pssearch .details, #pssearch .details * {
+ font-size:8pt;
+ }
+
+.marginbox {
+ padding:5px 10px;
+ }
+
+#searchresultlist .result {
+ margin: 0px 5px;
+ padding: 8px 0px;
+ list-style-type:none;
+ border-bottom:1px dotted rgb(128,128,128);
+ /* border-top:1px dotted rgb(128,128,128);*/
+ /*background:rgb(245, 250, 250);*/
+}
+
+/*
+.alternate {
+ background: rgb(234, 238, 245);
+}
+*/
+
+.clustered {
+ margin-left: 40px;
+}
+
+.resultdetails * {
+ text-align:middle;
+ }
+
+/* display styles for snippets search result snippet*/
+.pssnippet hr {
+ display:none;
+}
+
+.pssnippet li {
+ margin-left:15px;
+}
+
+/* end filter */
+
+#categories li {
+ list-style-type: none;
+}
+
+#categories h2 {
+ margin:0px;
+ font-size: 12pt;
+ }
+
+#categories a:hover {
+ background-color:rgb(1,160,199);
+ color:white;
+ text-decoration:none;
+}
+
+#pssearch .subcats {
+ margin-bottom:0px;
+ margin-left:15px;
+ list-style-type:none;
+}
+
+#searchselection {
+ margin-left:10px;
+ vertical-align:middle;
+}
+
+#searchselection input {
+ color:green;
+ margin-left:10px;
+ margin-right:5px;
+ vertical-align:middle;
+}
+
+.searchresulturl {
+ color: rgb(0, 96, 120);
+}
+
+.psformat {
+ font-size: 8pt;
+}
+
+.psrf {
+ float: right;
+}
+
+.pscategorylink, .psarticlelink {
+ white-space: nowrap;
+}
+
+.matchedcategories {
+ border: 1px dotted grey;
+ /*background-color: rgb(245, 245, 245);*/
+ margin-left: 10px;
+ margin-right: 10px;
+ margin-bottom: 15px;
+ padding: 4px;
+}
+
diff --git a/mwlib/sanitychecker.py b/mwlib/sanitychecker.py
new file mode 100644
index 0000000..78d25b8
--- /dev/null
+++ b/mwlib/sanitychecker.py
@@ -0,0 +1,205 @@
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+"""
+class for defining DTD-Like Rules for the tree
+"""
+from advtree import Article
+
+from mwlib.log import Log
+log = Log("sanitychecker")
+
+# -----------------------------------------------------------
+# Constraints
+# -----------------------------------------------------------
+
+class ConstraintBase(object):
+ def __init__(self, *klasses):
+ self.klasses = klasses
+
+ def test(self, nodes):
+ return True,None # passed
+
+ def __repr__(self):
+ return "%s(%s)" %(self.__class__.__name__, ", ".join(k.__name__ for k in self.klasses))
+
+
+class Forbid(ConstraintBase):
+ "forbid any of the classes"
+ def test(self, nodes):
+ for n in nodes:
+ if n.__class__ in self.klasses:
+ return False, n
+ return True, None
+
+
+class Allow(ConstraintBase):
+ "allow only these classes"
+ def test(self, nodes):
+ for n in nodes:
+ if not n.__class__ in self.klasses:
+ return False, n
+ return True, None
+
+
+class Require(ConstraintBase):
+ "require any of these classes"
+ def test(self, nodes):
+ for n in nodes:
+ if n.__class__ in self.klasses:
+ return True, n
+ return False, None
+
+class Equal(ConstraintBase):
+ "node classes and their order must be equal to these klasses"
+ def test(self, nodes):
+ if len(nodes) != len(self.klasses):
+ return False, None # FIXME what could we report?
+ for i,n in enumerate(nodes):
+ if n.__class__ != self.klasses[i]:
+ return False, n
+ return True, None
+
+
+# -----------------------------------------------------------
+# Rules regarding [Children, AllChildren, Parents, ...]
+# -----------------------------------------------------------
+
+class RuleBase:
+ def __init__(self, klass, constraint):
+ self.klass = klass
+ self.constraint = constraint
+
+ def _tocheck(self, node):
+ return []
+
+ def test(self, node):
+ if node.__class__ == self.klass:
+ return self.constraint.test( self._tocheck(node) )
+ return True, None
+
+ def __repr__(self):
+ return "%s(%s, %r)" %(self.__class__.__name__, self.klass.__name__, self.constraint)
+
+class ChildrenOf(RuleBase):
+ def _tocheck(self, node):
+ return node.children
+
+class AllChildrenOf(RuleBase):
+ def _tocheck(self, node):
+ return node.getAllChildren()
+
+class ParentsOf(RuleBase):
+ def _tocheck(self, node):
+ return node.parents
+
+class ParentOf(RuleBase):
+ def _tocheck(self, node):
+ if node.parent:
+ return [node.parent]
+ return []
+
+class SiblingsOf(RuleBase):
+ def _tocheck(self, node):
+ return node.siblings
+
+
+
+# example custom rules
+
+class RequireChild(RuleBase):
+
+ def __init__(self, klass):
+ self.klass = klass
+
+ def __repr__(self):
+ return "%s(%s)" %(self.__class__.__name__, self.klass.__name__)
+
+ def test(self, node):
+ if node.__class__ == self.klass:
+ if not len(node.children):
+ return False, node
+ return True, None
+
+
+
+
+# -----------------------------------------------------------
+# Callbacks
+# -----------------------------------------------------------
+"""
+callbacks get called if added to rules
+callback return values should be:
+ * True if it modified the tree and the sanity check needs to restart
+ * False if the tree is left unmodified
+"""
+class SanityException(Exception):
+ pass
+
+def exceptioncb(rule, node=None, parentnode=None):
+ raise SanityException("%r err:%r" %(rule, node or parentnode) )
+
+def warncb(rule, node=None, parentnode=None):
+ log.warn("%r node:%r parent:%r" %(rule, node, parentnode))
+ return False
+
+def removecb(rule, node=None, parentnode=None):
+ assert node and node.parent
+ node.parent.removeChild(node)
+ return True
+
+
+
+# -----------------------------------------------------------
+# Container for sanity rules
+# -----------------------------------------------------------
+
+class SanityChecker(object):
+
+ def __init__(self):
+ self.rules = []
+
+ def addRule(self, rule, actioncb=exceptioncb):
+ self.rules.append((rule, actioncb))
+
+ def check(self, tree):
+ """
+ check each node with each rule
+ on failure call callback
+ """
+ modified = True
+ while modified:
+ modified = False
+ for node in tree.allchildren():
+ #if node.__class__ == Article:
+ # log.info("checking article:", node.caption.encode('utf-8'))
+ for r,cb in self.rules:
+ passed, errnode = r.test(node)
+ if not passed and cb:
+ if cb(r, errnode or node):
+ modified = True
+ break
+ if modified:
+ break
+
+def demo(tree):
+ "for documentation only, see tests for more demos"
+ from mwlib.advtree import Table, Row, Cell, Text, ImageLink, PreFormatted
+
+ sc = SanityChecker()
+ rules = [ChildrenOf(Table, Allow(Row)),
+ ChildrenOf(Row, Allow(Cell)),
+ AllChildrenOf(Cell, Require(Text, ImageLink)),
+ AllChildrenOf(Cell, Forbid(PreFormatted)),
+ ChildrenOf(PreFormatted, Equal(Text)),
+ ]
+
+ def mycb(rule, node=None, parentnode=None):
+ print "failed", rule, node or parentnode
+ modifiedtree = False
+ return modifiedtree
+
+ for r in rules:
+ sc.addRule( r, mycb)
+ #sc.check(anytree)
+
+
diff --git a/mwlib/scanfile.py b/mwlib/scanfile.py
new file mode 100755
index 0000000..96519d2
--- /dev/null
+++ b/mwlib/scanfile.py
@@ -0,0 +1,29 @@
+#! /usr/bin/env python
+
+"""used for debugging/testing"""
+
+import sys
+import time
+import mwscan
+
+d=unicode(open(sys.argv[1]).read(), 'utf-8')
+
+stime=time.time()
+r=mwscan.scan(d)
+needed = time.time()-stime
+for x in r:
+ print r.repr(x)
+
+print needed, len(d), len(r)
+
+
+
+# stime=time.time()
+# r=mwscan.compat_scan(d)
+# needed = time.time()-stime
+
+# print "COMPAT:", needed, len(d), len(r)
+
+
+# #mwscan.dump_tokens(d,r)
+# #print needed, len(d), len(r)
diff --git a/mwlib/scanner.py b/mwlib/scanner.py
new file mode 100755
index 0000000..d4d7167
--- /dev/null
+++ b/mwlib/scanner.py
@@ -0,0 +1,6 @@
+#! /usr/bin/env python
+
+if 0:
+ from plexscanner import TagToken, EndTagToken, tokenize
+else:
+ from mwscan import TagToken, EndTagToken, tokenize
diff --git a/mwlib/texmap.py b/mwlib/texmap.py
new file mode 100755
index 0000000..f3071e6
--- /dev/null
+++ b/mwlib/texmap.py
@@ -0,0 +1,95 @@
+#! /usr/bin/env python
+
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+
+import re
+
+def convertSymbols(latexsource):
+ def repl(mo):
+ name=mo.group(0)
+ return symbolMap.get(name, name)
+
+ latexsource = texcmd.sub(repl, latexsource)
+ return latexsource
+
+texcmd = re.compile(r"\\[a-zA-Z]+")
+
+symbolMap = {'\\Bbb': '\\mathbb',
+ '\\Complex': '\\mathbb{C}',
+ '\\Dagger': '\\ddagger',
+ '\\Darr': '\\Downarrow',
+ '\\Harr': '\\Leftrightarrow',
+ '\\Larr': '\\Leftarrow',
+ '\\Lrarr': '\\Leftrightarrow',
+ '\\N': '\\mathbb{N}',
+ '\\O': '\\emptyset',
+ '\\R': '\\mathbb{R}',
+ '\\Rarr': '\\Rightarrow',
+ '\\Reals': '\\mathbb{R}',
+ '\\Uarr': '\\Uparrow',
+ '\\Z': '\\mathbb{Z}',
+ '\\alef': '\\aleph',
+ '\\alefsym': '\\aleph',
+ '\\and': '\\land',
+ '\\ang': '\\angle',
+ '\\arccos': '\\mathop{\\mathrm{arccos}}',
+ '\\arccot': '\\mathop{\\mathrm{arccot}}',
+ '\\arccsc': '\\mathop{\\mathrm{arccsc}}',
+ '\\arcsec': '\\mathop{\\mathrm{arcsec}}',
+ '\\bold': '\\mathbf',
+ '\\bull': '\\bullet',
+ '\\clubs': '\\clubsuit',
+ '\\cnums': '\\mathbb{C}',
+ '\\dArr': '\\Downarrow',
+ '\\darr': '\\downarrow',
+ '\\diamonds': '\\diamondsuit',
+ '\\empty': '\\emptyset',
+ '\\exist': '\\exists',
+ '\\ge': '\\geq',
+ '\\hAar': '\\Leftrightarrow',
+ '\\harr': '\\leftrightarrow',
+ '\\hearts': '\\heartsuit',
+ '\\image': '\\Im',
+ '\\infin': '\\infty',
+ '\\isin': '\\in',
+ '\\lArr': '\\Leftarrow',
+ '\\lang': '\\langle',
+ '\\larr': '\\leftarrow',
+ '\\le': '\\leq',
+ '\\lrArr': '\\Leftrightarrow',
+ '\\lrarr': '\\leftrightarrow',
+ '\\natnums': '\\mathbb{N}',
+ '\\ne': '\\neq',
+ '\\or': '\\lor',
+ '\\part': '\\partial',
+ '\\plusmn': '\\pm',
+ '\\rArr': '\\Rightarrow',
+ '\\rang': '\\rangle',
+ '\\rarr': '\\rightarrow',
+ '\\real': '\\Re',
+ '\\reals': '\\mathbb{R}',
+ '\\sdot': '\\cdot',
+ '\\sect': '\\S',
+ '\\sgn': '\\mathop{\\mathrm{sgn}}',
+ '\\spades': '\\spadesuit',
+ '\\sub': '\\subset',
+ '\\sube': '\\subseteq',
+ '\\supe': '\\supseteq',
+ '\\thetasym': '\\vartheta',
+ '\\uArr': '\\Uparrow',
+ '\\uarr': '\\uparrow',
+ '\\weierp': '\\wp',
+ '\\Alpha': 'A{}',
+ '\\Beta': 'B{}',
+ '\\Epsilon': 'E{}',
+ '\\Zeta': 'Z{}',
+ '\\Eta': 'H{}',
+ '\\Iota': 'I{}',
+ '\\Kappa' : 'K{}',
+ '\\Mu': 'M{}',
+ '\\Nu': 'N{}',
+ '\\Rho': 'P{}',
+ '\\Tau': 'T{}',
+ '\\Chi': 'C{}',
+ }
diff --git a/mwlib/timeline.py b/mwlib/timeline.py
new file mode 100755
index 0000000..e85dd84
--- /dev/null
+++ b/mwlib/timeline.py
@@ -0,0 +1,52 @@
+#! /usr/bin/env python
+
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+
+"""implement http://meta.wikimedia.org/wiki/EasyTimeline
+"""
+
+import os
+import tempfile
+try:
+ from hashlib import md5
+except ImportError:
+ from md5 import md5
+
+
+def drawTimeline(script, basedir=None):
+ if isinstance(script, unicode):
+ script = script.encode('utf8')
+ if basedir is None:
+ basedir = os.path.join(tempfile.gettempdir(), "timeline-%s" % (os.getuid(),))
+ if not os.path.exists(basedir):
+ os.mkdir(basedir)
+
+ m=md5()
+ m.update(script)
+ ident = m.hexdigest()
+
+ pngfile = os.path.join(basedir, ident+'.png')
+
+ if os.path.exists(pngfile):
+ return pngfile
+
+ scriptfile = os.path.join(basedir, ident+'.txt')
+ open(scriptfile, 'w').write(script)
+ et = os.path.join(os.path.dirname(__file__), "EasyTimeline.pl")
+
+ err = os.system("perl %s -P /usr/bin/ploticus -T /tmp/ -i %s" % (et, scriptfile))
+ if err != 0:
+ return None
+
+ svgfile = os.path.join(basedir, ident+'.svg')
+
+ if os.path.exists(svgfile):
+ os.unlink(svgfile)
+
+ if os.path.exists(pngfile):
+ return pngfile
+
+ return None
+
+
diff --git a/mwlib/uparser.py b/mwlib/uparser.py
new file mode 100755
index 0000000..8565c74
--- /dev/null
+++ b/mwlib/uparser.py
@@ -0,0 +1,126 @@
+#! /usr/bin/env python
+
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+
+"""usable/user parser"""
+
+from mwlib import parser, scanner, expander
+
+def simplify(node):
+ "concatenates textnodes in order to reduce the number of objects"
+ Text = parser.Text
+
+ last = None
+ toremove = []
+ for i,c in enumerate(node.children):
+ if c.__class__ == Text: # would isinstance be safe?
+ if last:
+ last.caption += c.caption
+ toremove.append(i)
+ else:
+ last = c
+ else:
+ simplify(c)
+ last = None
+
+ for i,ii in enumerate(toremove):
+ del node.children[ii-i]
+
+def fixlitags(node):
+ Text = parser.Text
+
+ if not isinstance(node, parser.ItemList):
+ idx = 0
+ while idx < len(node.children):
+ if isinstance(node.children[idx], parser.Item):
+ lst = parser.ItemList()
+ lst.append(node.children[idx])
+ node.children[idx] = lst
+ idx += 1
+ while idx<len(node.children):
+ if isinstance(node.children[idx], parser.Item):
+ lst.append(node.children[idx])
+ del node.children[idx]
+ elif node.children[idx]==Text("\n"):
+ del node.children[idx]
+ else:
+ break
+ else:
+ idx += 1
+
+ for x in node.children:
+ fixlitags(x)
+
+def removeBoilerplate(node):
+ i = 0
+ while i < len(node.children):
+ x = node.children[i]
+ if isinstance(x, parser.TagNode) and x.caption=='div':
+ try:
+ klass = x.values.get('class', '')
+ except AttributeError:
+ klass = ''
+
+ if 'boilerplate' in klass:
+ del node.children[i]
+ continue
+
+ i += 1
+
+ for x in node.children:
+ removeBoilerplate(x)
+
+
+
+
+postprocessors = [removeBoilerplate, simplify, fixlitags]
+
+def parseString(title=None, raw=None, wikidb=None, revision=None):
+ """parse article with title from raw mediawiki text"""
+ assert title is not None
+
+ if raw is None:
+ raw = wikidb.getRawArticle(title, revision=revision)
+ assert raw is not None, "cannot get article %r" % (title,)
+ if wikidb:
+ te = expander.Expander(raw, pagename=title, wikidb=wikidb)
+ input = te.expandTemplates()
+ else:
+ input = raw
+
+ tokens = scanner.tokenize(input, title)
+
+ a = parser.Parser(tokens, title).parse()
+ a.caption = title
+ for x in postprocessors:
+ x(a)
+ return a
+
+
+def simpleparse(raw): # !!! USE FOR DEBUGGING ONLY !!! does not use post processors
+ import sys
+ from mwlib import dummydb
+ db = dummydb.DummyDB()
+
+ tokens = scanner.tokenize(raw)
+ r=parser.Parser(tokens, "unknown").parse()
+ parser.show(sys.stdout, r, 0)
+ return r
+
+def main():
+ from mwlib.dummydb import DummyDB
+
+ import os
+ import sys
+
+ db = DummyDB()
+
+ for x in sys.argv[1:]:
+ input = unicode(open(x).read(), 'utf8')
+ title = unicode(os.path.basename(x))
+ parseString(title, input, db)
+
+if __name__=="__main__":
+ main()
+
diff --git a/mwlib/utils.py b/mwlib/utils.py
new file mode 100644
index 0000000..4fd6b55
--- /dev/null
+++ b/mwlib/utils.py
@@ -0,0 +1,112 @@
+import os
+import sys
+import errno
+import time
+
+# provide all for python 2.4
+try:
+ from __builtin__ import all
+except ImportError:
+ def all(items):
+ for x in items:
+ if not x:
+ return False
+ return True
+
+def fsescape(s):
+ res = []
+ for x in s:
+ c = ord(x)
+ if c>127:
+ res.append("~%s~" % c)
+ elif c==126: # ord("~")==126
+ res.append("~~")
+ else:
+ res.append(x)
+ return "".join(res)
+
+def start_logging(path):
+ sys.stderr.flush()
+ sys.stdout.flush()
+
+ f = open(path, "a")
+ fd = f.fileno()
+ os.dup2(fd, 1)
+ os.dup2(fd, 2)
+
+ null=os.open('/dev/null', os.O_RDWR)
+ os.dup2(null, 0)
+ os.close(null)
+
+def daemonize(dev_null=False):
+ # See http://www.erlenstar.demon.co.uk/unix/faq_toc.html#TOC16
+ if os.fork(): # launch child and...
+ os._exit(0) # kill off parent
+ os.setsid()
+ if os.fork(): # launch child and...
+ os._exit(0) # kill off parent again.
+ os.umask(077)
+ if dev_null:
+ null=os.open('/dev/null', os.O_RDWR)
+ for i in range(3):
+ try:
+ os.dup2(null, i)
+ except OSError, e:
+ if e.errno != errno.EBADF:
+ raise
+ os.close(null)
+
+def shell_exec(cmd):
+ """Execute cmd in a subshell
+
+ @param cmd: command to execute with os.system(), if given as unicode its
+ converted to str using sys.getfilesystemencoding()
+ @type cmd: basestring
+
+ @returns: exit code of command
+ @rtype: int
+ """
+ if isinstance(cmd, unicode):
+ enc = sys.getfilesystemencoding()
+ assert enc is not None, 'no filesystem encoding (set LANG)'
+ cmd = cmd.encode(enc, 'ignore')
+ return os.system(cmd)
+
+
+def get_multipart(filename, data, name):
+ """Build data in format multipart/form-data to be used to POST binary data.
+
+ @param filename: filename to be used in multipart request
+ @type filenaem: basestring
+
+ @param data: binary data to include
+ @type data: str
+
+ @param name: name to be used in multipart request
+ @type name: basestring
+
+ @returns: tuple containing content-type and body for the request
+ @rtype: (str, str)
+ """
+
+ if isinstance(filename, unicode):
+ filename = filename.encode('utf-8', 'ignore')
+ if isinstance(name, unicode):
+ name = name.encode('utf-8', 'ignore')
+
+ boundary = "-"*20 + ("%f" % time.time()) + "-"*20
+
+ items = []
+ items.append("--" + boundary)
+ items.append('Content-Disposition: form-data; name="%(name)s"; filename="%(filename)s"'\
+ % {'name': name, 'filename': filename})
+ items.append('Content-Type: application/octet-stream')
+ items.append('')
+ items.append(data)
+ items.append('--' + boundary + '--')
+ items.append('')
+
+ body = "\r\n".join(items)
+ content_type = 'multipart/form-data; boundary=%s' % boundary
+
+ return content_type, body
diff --git a/mwlib/web.py b/mwlib/web.py
new file mode 100755
index 0000000..5e32fb8
--- /dev/null
+++ b/mwlib/web.py
@@ -0,0 +1,122 @@
+#! /usr/bin/env python
+
+"""simple wsgi app for serving mediawiki content
+"""
+
+import os
+import mimetypes
+import StringIO
+from mwlib import uparser, htmlwriter, rendermath
+
+class Pngmath(object):
+ def __init__(self, basedir):
+ self.basedir = basedir
+
+ def __call__(self, env, start_response):
+ pi = env['PATH_INFO']
+ path = pi.split('/', 2)[-1]
+ path = path.strip("/")
+ path = path[:-len(".png")]
+
+ pngfile = os.path.join(self.basedir, path+'.png')
+ if not os.path.exists(pngfile):
+ texfile = os.path.join(self.basedir, path+'.tex')
+ if not os.path.exists(texfile):
+ start_response('404 Not found', [('Content-Type', 'text/plain')])
+ return ["404 not found"]
+
+ r = rendermath.Renderer()
+ r._render_file(path, 'png')
+
+
+ d=open(pngfile, 'rb').read()
+
+
+ start_response('200 Ok', [('Content-Type', 'image/png')])
+ return [d]
+
+class Files(object):
+ def __init__(self, basedir):
+ self.basedir = basedir
+
+ def __call__(self, env, start_response):
+ pi = env['PATH_INFO']
+ path = pi.split('/', 2)[-1]
+ path = path.strip("/")
+ assert ".." not in path, "path must not contain '..'"
+
+ mt, enc = mimetypes.guess_type(path)
+
+ try:
+ f=open(os.path.join(self.basedir, path), 'rb')
+ except (IOError, OSError), err:
+ print "ERROR:", err
+ start_response('404 Not found', [('Content-Type', 'text/plain')])
+ return ["404 not found"]
+
+ send = start_response('200 OK', [('Content-type', mt or 'text/plain; charset=utf-8')])
+ while 1:
+ data=f.read(0x20000)
+ if not data:
+ break
+ send(data)
+ return []
+
+
+class Serve(object):
+ head = """<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="content-type" content="text/html; charset="utf-8"></meta>
+<link rel="stylesheet" href="/resources/pedia.css" />
+</head>
+<body>
+"""
+ def __init__(self, db, images):
+ self.db = db
+ self.images = images
+ from mwlib import resources
+ self.resources = Files(os.path.dirname(resources.__file__)) # FIXME
+ self.image_files = Files(os.path.expanduser("~/images")) # FIXME
+ self.pngmath = Pngmath(os.path.expanduser("~/pngmath")) # FIXME
+ self.timeline = Files(os.path.expanduser("~/timeline")) # FIXME
+
+ def show(self, env, start_response):
+ article = unicode(env['PATH_INFO'], 'utf-8').strip('/').replace("_", " ")
+ article = article[:1].upper()+article[1:] # FIXME: we should redirect instead.
+
+ raw=self.db.getRawArticle(article)
+ if not raw:
+ start_response('404 Not found', [('Content-Type', 'text/plain')])
+ return ["Article %r not found" % (article,)]
+
+ send = start_response('200 OK', [('Content-type', 'text/html; charset=utf-8')])
+ send(self.head)
+
+ out=StringIO.StringIO(u"")
+
+ a=uparser.parseString(article, raw=raw, wikidb=self.db)
+ w=htmlwriter.HTMLWriter(out, self.images)
+ w.write(a)
+
+ return [out.getvalue().encode('utf-8')]
+
+ def __call__(self, env, start_response):
+ path = env['PATH_INFO']
+
+
+ if path.startswith("/resources/"):
+ return self.resources(env, start_response)
+ if path.startswith("/images"):
+ return self.image_files(env, start_response)
+ if path.startswith("/pngmath/"):
+ return self.pngmath(env, start_response)
+ if path.startswith("/timeline/"):
+ return self.timeline(env, start_response)
+
+ return self.show(env, start_response)
+
+
+ start_response('404 Not found', [('Content-Type', 'text/plain')])
+ return ["404 Not found"]
diff --git a/mwlib/wiki.py b/mwlib/wiki.py
new file mode 100755
index 0000000..96378ed
--- /dev/null
+++ b/mwlib/wiki.py
@@ -0,0 +1,135 @@
+#! /usr/bin/env python
+
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+
+import os
+from ConfigParser import ConfigParser
+
+def wiki_mwapi(base_url=None, license=None, template_blacklist=None):
+ from mwlib import mwapidb
+ return mwapidb.WikiDB(base_url, license, template_blacklist)
+
+def wiki_zip(path=None, url=None, name=None):
+ from mwlib import zipwiki
+ return zipwiki.Wiki(path)
+
+def wiki_net(articleurl=None, url=None, name=None, imagedescriptionurls=None,
+ templateurls=None, templateblacklist=None, defaultarticlelicense=None,
+ defaultauthors=None, **kwargs):
+ from mwlib import netdb
+
+ if templateurls:
+ templateurls = [x for x in templateurls.split() if x]
+ else:
+ raise RuntimeError("templateurls parameter for netdb not set in [wiki] section")
+
+ if imagedescriptionurls:
+ imagedescriptionurls = [x for x in imagedescriptionurls.split() if x]
+ else:
+ raise RuntimeError("imagedescriptionurls parameter for netdb not set in [wiki] section")
+
+ if defaultauthors:
+ defaultauthors = [a.strip() for a in defaultauthors.split(',')]
+
+ return netdb.NetDB(articleurl,
+ imagedescriptionurls=imagedescriptionurls,
+ templateurls=templateurls,
+ templateblacklist=templateblacklist,
+ defaultauthors=defaultauthors,
+ )
+
+def wiki_cdb(path=None, **kwargs):
+ from mwlib import cdbwiki
+ path = os.path.expanduser(path)
+ db=cdbwiki.WikiDB(path)
+ return db
+
+def image_mwapi(base_url=None, shared_base_url=None):
+ from mwlib import mwapidb
+ return mwapidb.ImageDB(base_url, shared_base_url)
+
+def image_download(url=None, localpath=None, knownlicenses=None):
+ assert url, "must supply url in [images] section"
+ from mwlib import netdb
+
+ if localpath:
+ localpath = os.path.expanduser(localpath)
+ urls = [x for x in url.split() if x]
+ assert urls
+
+ if knownlicenses:
+ knownlicenses = [x for x in knownlicenses.split() if x]
+ else:
+ knownlicenses = None
+
+ imgdb = netdb.ImageDB(urls, cachedir=localpath, knownLicenses=knownlicenses)
+ return imgdb
+
+def image_zip(path=None):
+ from mwlib import zipwiki
+ return zipwiki.ImageDB(path)
+
+
+
+dispatch = dict(
+ images = dict(mwapi=image_mwapi, download=image_download, zip=image_zip),
+ wiki = dict(mwapi=wiki_mwapi, cdb=wiki_cdb, net=wiki_net, zip=wiki_zip)
+)
+
+def _makewiki(conf):
+ res = {}
+
+ # yes, I really don't want to type this everytime
+ wc = os.path.join(conf, "wikiconf.txt")
+ if os.path.exists(wc):
+ conf = wc
+
+ if conf.startswith("http://") or conf.startswith("https://"):
+ res['wiki'] = wiki_mwapi(conf)
+ res['images'] = image_mwapi(conf)
+ return res
+
+
+ if conf.lower().endswith(".zip"):
+ from mwlib import zipwiki
+ res['wiki'] = zipwiki.Wiki(conf)
+ res['images'] = zipwiki.ImageDB(conf)
+ return res
+
+ cp=ConfigParser()
+
+ if not cp.read(conf):
+ raise RuntimeError("could not read config file %r" % (conf,))
+
+
+ for s in ['images', 'wiki']:
+ if not cp.has_section(s):
+ continue
+
+ args = dict(cp.items(s))
+ if "type" not in args:
+ raise RuntimeError("section %r does not have key 'type'" % s)
+ t = args['type']
+ del args['type']
+ try:
+ m = dispatch[s][t]
+ except KeyError:
+ raise RuntimeError("cannot handle type %r in section %r" % (t, s))
+
+ res[s] = m(**args)
+
+ assert "wiki" in res
+ return res
+
+def makewiki(conf):
+ res = _makewiki(conf)
+
+ try:
+ overlaydir = os.environ['MWOVERLAY']
+ assert os.path.isdir(overlaydir)
+ import mwlib.overlay
+ res['wiki'] = mwlib.overlay.OverlayDB(res['wiki'], overlaydir)
+ except:
+ pass
+ return res
diff --git a/mwlib/zipwiki.py b/mwlib/zipwiki.py
new file mode 100755
index 0000000..c6893b8
--- /dev/null
+++ b/mwlib/zipwiki.py
@@ -0,0 +1,167 @@
+#! /usr/bin/env python
+
+# Copyright (c) 2008, PediaPress GmbH
+# See README.txt for additional licensing information.
+
+import os
+import shutil
+import simplejson
+import tempfile
+from zipfile import ZipFile
+
+from mwlib.metabook import MetaBook
+from mwlib import uparser
+
+class Wiki(object):
+ def __init__(self, zipfile):
+ """
+ @type zipfile: basestring or ZipFile
+ """
+
+ if isinstance(zipfile, ZipFile):
+ self.zf = zipfile
+ else:
+ self.zf = ZipFile(zipfile)
+ self.metabook = MetaBook()
+ self.metabook.loadJson(self.zf.read("metabook.json"))
+ content = simplejson.loads(self.zf.read('content.json'))
+ self.articles = content['articles']
+ self.templates = content['templates']
+
+ def _getArticle(self, title, revision=None):
+ try:
+ article = self.articles[title]
+ if revision is None or article['revision'] == revision:
+ return article
+ except KeyError:
+ pass
+ return None
+
+ def getRawArticle(self, title, revision=None):
+ article = self._getArticle(title, revision=revision)
+ if article:
+ return article['content']
+ return None
+
+ def getParsedArticle(self, title, revision=None):
+ raw = self.getRawArticle(title, revision=revision)
+ if raw is None:
+ return None
+ a = uparser.parseString(title=title, raw=raw, wikidb=self)
+ return a
+
+ def getURL(self, title, revision=None):
+ article = self._getArticle(title, revision=revision)
+ if article:
+ return article['url']
+ return None
+
+ def getAuthors(self, title, revision=None):
+ article = self._getArticle(title, revision=revision)
+ if article:
+ return article.get('authors', [])
+ return None
+
+ def getTemplate(self, name, followRedirects=True):
+ try:
+ return self.templates[name]['content']
+ except KeyError:
+ pass
+ return None
+
+
+class ImageDB(object):
+ def __init__(self, zipfile, tmpdir=None):
+ """
+ @type zipfile: basestring or ZipFile
+ """
+
+ if isinstance(zipfile, ZipFile):
+ self.zf = zipfile
+ else:
+ self.zf = ZipFile(zipfile)
+ content = simplejson.loads(self.zf.read('content.json'))
+ self.images = content['images']
+ self._tmpdir = tmpdir
+ self.diskpaths = {}
+
+ @property
+ def tmpdir(self):
+ if self._tmpdir is None:
+ self._tmpdir = unicode(tempfile.mkdtemp())
+ return self._tmpdir
+
+ def getDiskPath(self, name, size=None):
+ try:
+ return self.diskpaths[name]
+ except KeyError:
+ pass
+ try:
+ data = self.zf.read('images/%s' % name.replace("'", '-').encode('utf-8'))
+ except KeyError: # no such file
+ return None
+
+ try:
+ ext = '.' + name.rsplit('.', 1)[1]
+ except IndexError:
+ ext = ''
+ if ext.lower() == '.svg':
+ ext = '.svg.png'
+ elif ext.lower() == '.gif':
+ ext = '.gif.png'
+ res = os.path.join(self.tmpdir, 'image%04d%s' % (len(self.diskpaths), ext))
+ self.diskpaths[name] = res
+ f=open(res, "wb")
+ f.write(data)
+ f.close()
+ return res
+
+ def getLicense(self, name):
+ try:
+ return self.images[name]['license']
+ except KeyError:
+ return None
+
+ def getPath(self):
+ raise NotImplemented('getPath() does not work with zipwiki.ImageDB!')
+
+ def getURL(self, name):
+ try:
+ return self.images[name]['url']
+ except KeyError:
+ return None
+
+ def clean(self):
+ if self._tmpdir:
+ shutil.rmtree(self._tmpdir, ignore_errors=True)
+
+
+
+
+class FakeImageDB(ImageDB):
+
+ imagedata = '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x03 \x00\x00\x01\xe0\x01\x03\x00\x00\x00g\xc9\x9b\xb6\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\x06PLTE\xff\xff\xff\x00\x00\x00U\xc2\xd3~\x00\x00\x00\tpHYs\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00EIDATx\xda\xed\xc1\x01\x01\x00\x00\x00\x82 \xff\xafnH@\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/\x06\xbd`\x00\x01`<5\x84\x00\x00\x00\x00IEND\xaeB`\x82'
+
+ def __init__(self, tmpdir=None):
+ """
+ @type zipfile: basestring or ZipFile
+ """
+ self._tmpdir = tmpdir
+
+ def getDiskPath(self, name, size=None):
+ res = os.path.join(self.tmpdir, 'blank.png')
+ if not os.path.exists(res):
+ open(res, "w").write(self.imagedata)
+ return res
+
+ def getPath(self):
+ raise NotImplemented('getPath() does not work with zipwiki.FakeImageDB!')
+
+ def getURL(self, name):
+ raise NotImplemented('getURL() does not work with zipwiki.FakeImageDB!')
+
+ def getLicense(self, name):
+ raise NotImplemented('getLicense() does not work with zipwiki.FakeImageDB!')
+
+
+
diff --git a/po/Browse.pot b/po/Browse.pot
new file mode 100644
index 0000000..82bbcda
--- /dev/null
+++ b/po/Browse.pot
@@ -0,0 +1,156 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-08-08 11:21-0500\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+
+#: activity/activity.info:2 webactivity.py:274
+msgid "Browse"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: webactivity.py:271
+msgid "Edit"
+msgstr ""
+
+#: webactivity.py:277
+msgid "View"
+msgstr ""
+
+#: webactivity.py:655
+msgid "Download in progress"
+msgid_plural "Downloads in progress"
+msgstr[0] ""
+msgstr[1] ""
+
+#: webactivity.py:658
+msgid "Stopping now will erase your download"
+msgid_plural "Stopping now will erase your downloads"
+msgstr[0] ""
+msgstr[1] ""
+
+#: webactivity.py:663
+msgid "Continue download"
+msgid_plural "Continue downloads"
+msgstr[0] ""
+msgstr[1] ""
+
+#: webactivity.py:667 webtoolbar.py:450
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:259
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:281
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:288
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:296
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:303
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:453
+msgid "Reload"
+msgstr ""
+
+#: palettes.py:143
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:151
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:159
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:209
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:217
+msgid "Copy image"
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: downloadmanager.py:175
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:190
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:194
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:197
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:204
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:346
+msgid ""
+"Downloading %2$s from \n"
+"%1$s."
+msgstr ""
diff --git a/po/Web.pot b/po/Web.pot
new file mode 100644
index 0000000..f381951
--- /dev/null
+++ b/po/Web.pot
@@ -0,0 +1,156 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-06-13 00:32-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+
+#: activity/activity.info:2 webactivity.py:267
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:164
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:179
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:183
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:186
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:193
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:335
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:143
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:151
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:159
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:209
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:217
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:264
+msgid "Edit"
+msgstr ""
+
+#: webactivity.py:270
+msgid "View"
+msgstr ""
+
+#: webactivity.py:654
+msgid "Download in progress"
+msgid_plural "Downloads in progress"
+msgstr[0] ""
+msgstr[1] ""
+
+#: webactivity.py:657
+msgid "Stopping now will erase your download"
+msgid_plural "Stopping now will erase your downloads"
+msgstr[0] ""
+msgstr[1] ""
+
+#: webactivity.py:662
+msgid "Continue download"
+msgid_plural "Continue downloads"
+msgstr[0] ""
+msgstr[1] ""
+
+#: webactivity.py:666 webtoolbar.py:449
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:259
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:281
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:288
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:296
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:303
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:452
+msgid "Reload"
+msgstr ""
diff --git a/po/af.po b/po/af.po
new file mode 100644
index 0000000..02369ea
--- /dev/null
+++ b/po/af.po
@@ -0,0 +1,150 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2011-03-31 15:45+0200\n"
+"Last-Translator: Chris <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: af\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "Reg"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Zoem uit"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Zoem in"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/am.po b/po/am.po
new file mode 100644
index 0000000..aec85fb
--- /dev/null
+++ b/po/am.po
@@ -0,0 +1,162 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2011-04-13 02:49+0200\n"
+"Last-Translator: Chris <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: am\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "እሺ"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr "ከᦠ%s "
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "ቀድሞ"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "ቀጥáˆ"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "አስወáŒá‹°á‹"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "ከርቀት ዕይታ"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "ከቅርበት ዕይታ"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "ሙሉ እስክሪን"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "ተወዠሻር"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "á‰áˆ á‰áˆš አá‰áˆ አá‰áˆš"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "ኋላ"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "መለያ áˆáˆáŠ­á‰µ"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/ar.po b/po/ar.po
new file mode 100644
index 0000000..7490448
--- /dev/null
+++ b/po/ar.po
@@ -0,0 +1,222 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# translation of web-activity.po to Arabic
+# Khaled Hosny <khaledhosny@eglug.org>, 2007, 2011.
+# Ahmed Mansour <atphalix@users.arabeyes.org>, 2008.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+msgid ""
+msgstr ""
+"Project-Id-Version: web-activity\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-08-09 00:31-0400\n"
+"PO-Revision-Date: 2011-08-24 08:27+0200\n"
+"Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
+"Language-Team: Arabic <doc@arabeyes.org>\n"
+"Language: ar\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
+"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
+"X-Generator: Virtaal 0.7.0\n"
+
+#: activity/activity.info:2 webactivity.py:274
+msgid "Browse"
+msgstr "تصÙّح"
+
+#: downloadmanager.py:175
+msgid "Download started"
+msgstr "بدأ التنزيل"
+
+#: downloadmanager.py:190
+msgid "Download completed"
+msgstr "اكتمل التنزيل"
+
+#: downloadmanager.py:194
+msgid "Show in Journal"
+msgstr "اعرض ÙÙŠ اليوميات"
+
+#: downloadmanager.py:197
+msgid "Ok"
+msgstr "حسنا"
+
+#: downloadmanager.py:204
+#, python-format
+msgid "From: %s"
+msgstr "من: %s"
+
+#: downloadmanager.py:346
+msgid ""
+"Downloading %2$s from \n"
+"%1$s."
+msgstr ""
+"ÙŠÙنزّÙÙ„ %2$s من \n"
+"%1$s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "السابق"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "التالي"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "أزÙÙ„"
+
+#: palettes.py:143
+msgid "Keep link"
+msgstr "احÙظ الوصلة"
+
+#: palettes.py:151
+msgid "Copy link"
+msgstr "انسخ الوصلة"
+
+#: palettes.py:159
+msgid "Follow link"
+msgstr "اتبع الوصلة"
+
+#: palettes.py:209
+msgid "Keep image"
+msgstr "احÙظ الصورة"
+
+#: palettes.py:217
+msgid "Copy image"
+msgstr "انسخ الصورة"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "بعّد"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "قرّب"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "ملء الشاشة"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "أظهر الطبق"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "اخÙ٠الطبق"
+
+#: webactivity.py:271
+msgid "Edit"
+msgstr "تحرير"
+
+#: webactivity.py:277
+msgid "View"
+msgstr "عرض"
+
+#: webactivity.py:655
+msgid "Download in progress"
+msgid_plural "Downloads in progress"
+msgstr[0] "يجري التنزيل"
+msgstr[1] "يجري التنزيل"
+msgstr[2] "يجري التنزيل"
+msgstr[3] "يجري التنزيل"
+msgstr[4] "يجري التنزيل"
+msgstr[5] "يجري التنزيل"
+
+#: webactivity.py:658
+msgid "Stopping now will erase your download"
+msgid_plural "Stopping now will erase your downloads"
+msgstr[0] "التوق٠الآن سيلغي تنزيلك"
+msgstr[1] "التوق٠الآن سيلغي تنزيلك"
+msgstr[2] "التوق٠الآن سيلغي تنزيلاتك"
+msgstr[3] "التوق٠الآن سيلغي تنزيلاتك"
+msgstr[4] "التوق٠الآن سيلغي تنزيلاتك"
+msgstr[5] "التوق٠الآن سيلغي تنزيلاتك"
+
+#: webactivity.py:663
+msgid "Continue download"
+msgid_plural "Continue downloads"
+msgstr[0] "أكمÙÙ„ التنزيل"
+msgstr[1] "أكمÙÙ„ التنزيل"
+msgstr[2] "أكمÙÙ„ التنزيلات"
+msgstr[3] "أكمÙÙ„ التنزيلات"
+msgstr[4] "أكمÙÙ„ التنزيلات"
+msgstr[5] "أكمÙÙ„ التنزيلات"
+
+#: webactivity.py:667 webtoolbar.py:450
+msgid "Stop"
+msgstr "Ù‚Ù"
+
+#: webtoolbar.py:259
+msgid "Home page"
+msgstr "الصÙحة الرئيسية"
+
+#: webtoolbar.py:281
+msgid "Back"
+msgstr "للخلÙ"
+
+#: webtoolbar.py:288
+msgid "Forward"
+msgstr "للأمام"
+
+#: webtoolbar.py:296
+msgid "Add a tab"
+msgstr "أضÙ٠لسانا"
+
+#: webtoolbar.py:303
+msgid "Bookmark"
+msgstr "علّÙÙ…"
+
+#: webtoolbar.py:453
+msgid "Reload"
+msgstr "أعد التحميل"
+
+#~ msgid "Cancel"
+#~ msgstr "ألغÙ"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "مل٠%s Ù…ÙÙ† %s."
+
+#~ msgid "Copy"
+#~ msgstr "انسخ"
+
+#~ msgid "Download link"
+#~ msgstr "تحميل الوصلة"
+
+#~ msgid "Download image"
+#~ msgstr "تحميل الصورة"
+
+#~ msgid "blank"
+#~ msgstr "Ùارغ"
+
+#~ msgid "Source"
+#~ msgstr "المصدر"
+
+#~ msgid "Open"
+#~ msgstr "اÙتح"
+
+#, python-format
+#~ msgid ""
+#~ "File %s downloaded from\n"
+#~ "%s."
+#~ msgstr ""
+#~ "Ù†ÙزّÙÙ„ المل٠%s من\n"
+#~ "%s."
+
+#~ msgid ""
+#~ "Downloading %s from\n"
+#~ "%s. Progress %i%%."
+#~ msgstr ""
+#~ "يجري تنزيل %s من\n"
+#~ "%s. التقدم %i%%."
+
+#, python-format
+#~ msgid "Web Activity"
+#~ msgstr "نشاط الوÙب"
diff --git a/po/ay.po b/po/ay.po
new file mode 100644
index 0000000..886a3b6
--- /dev/null
+++ b/po/ay.po
@@ -0,0 +1,149 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/bg.po b/po/bg.po
new file mode 100644
index 0000000..84b4867
--- /dev/null
+++ b/po/bg.po
@@ -0,0 +1,170 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2008-02-07 08:24-0500\n"
+"Last-Translator: Alexander Todorov <atodorov@redhat.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.0.2\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "Разглеждане"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "ИзтеглÑнето е Ñтартирано"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "ИзтеглÑнето е завършено"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "Показване в Дневник"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "Ок"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"ИзтеглÑне на %s от\n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Премахване"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "ÐамалÑване"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Увеличаване"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "ЦÑл екран"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Показване на таблото"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Скриване на таблото"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "ИзтеглÑнето протича"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "Ðко Ñпрете Ñега, ще прекъÑнете изтеглÑнето"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "Отказ"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Стоп"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Ðазад"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Ðапред"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "Отметка"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Презареждане"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "Файл %s от %s."
+
+#~ msgid "View"
+#~ msgstr "Изглед"
+
+#~ msgid "blank"
+#~ msgstr "празно"
+
+#~ msgid "Source"
+#~ msgstr "Изходен код"
+
+#~ msgid "Open"
+#~ msgstr "ОтварÑне"
diff --git a/po/bi.po b/po/bi.po
new file mode 100644
index 0000000..e83884a
--- /dev/null
+++ b/po/bi.po
@@ -0,0 +1,149 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/bn.po b/po/bn.po
new file mode 100644
index 0000000..82401bb
--- /dev/null
+++ b/po/bn.po
@@ -0,0 +1,180 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2009-08-28 20:20+0000\n"
+"Last-Translator: Nasir Khan Saikat <nasir8891@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: bn\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 1.2.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "বà§à¦°à¦¾à¦‰à¦œ করো"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "ডাউনলোড শà§à¦°à§ হয়েছে"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "ডাউনলোড শেষ হয়েছে"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "জারà§à¦¨à¦¾à¦² ঠদেখাও"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "ঠিক আছে"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr "হইতে: %s"
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"%s টি %s থেকে ডাউনলোড করা\n"
+"হচà§à¦›à§‡à¥¤"
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "পà§à¦°à§à¦¬à¦¬à¦°à§à¦¤à§€"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "পরবরà§à¦¤à§€"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "মà§à¦›à§‡ ফেলো"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr "লিংক রাখো"
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr "লিংক কপি করো"
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "লিংক দেখো"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr "ছবি রাখো"
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr "ছবি কপি করো"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "ছোট করো"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "বড় করো"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "সমà§à¦ªà§à¦°à§à¦¨ সà§à¦•à§à¦°à¦¿à¦¨à¦œà§à§œà§‡"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "টà§à¦°à§‡ পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করো"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "টà§à¦°à§‡ আড়াল করো"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "ডাউনলোড চলছে"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "à¦à¦–ন থামালে তোমার ডাউনলোড বাতিল হয়ে যাবে।"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "বাতিল করো"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "থামাও"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "পেছনে"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "সামনে"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "বà§à¦•à¦®à¦¾à¦°à§à¦•"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "আবার লোড করো"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "%s ফাইল, %s থেকে।"
+
+#~ msgid "View"
+#~ msgstr "দেখা"
+
+#~ msgid "blank"
+#~ msgstr "খালি"
+
+#~ msgid "Source"
+#~ msgstr "উৎস"
+
+#~ msgid "Open"
+#~ msgstr "খোলো"
+
+#, python-format
+#~ msgid ""
+#~ "File %s downloaded from\n"
+#~ "%s."
+#~ msgstr ""
+#~ "%s ফাইলটি %s থেকে ডাউনলোড করা\n"
+#~ "হয়েছে।"
diff --git a/po/bn_IN.po b/po/bn_IN.po
new file mode 100644
index 0000000..62958eb
--- /dev/null
+++ b/po/bn_IN.po
@@ -0,0 +1,191 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Sankarshan Mukhopadhyay <sankarshan@randomink.org>, 2008.
+# Sankarshan <sankarshan.mukhopadhyay@gmail.com>, 2009
+msgid ""
+msgstr ""
+"Project-Id-Version: web-activity\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2009-02-23 09:06-0500\n"
+"Last-Translator: Sankarshan Mukhopadhyay <sankarshan.mukhopadhyay@gmail.com>\n"
+"Language-Team: discuss@lists.ankur.org.in\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 1.1.0rc2\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "বà§à¦°à¦¾à¦‰à¦œ করো"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "ডাউনলোড শà§à¦°à§ হয়েছে"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "ডাউনলোড শেষ হয়েছে"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "জারà§à¦¨à¦¾à¦²à§‡ পà§à¦°à¦¦à¦°à§à¦¶à¦¨ কর"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "ঠিক আছে"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"%s টি %s থেকে ডাউনলোড করা\n"
+"হচà§à¦›à§‡à¥¤"
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "আগের"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "পরের"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "মà§à¦›à§‡ ফেলো"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "লিংক ধরে চলà§à¦¨"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "ছোট করো"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "বড় করো"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "সমà§à¦ªà§à¦°à§à¦¨ সà§à¦•à§à¦°à¦¿à¦¨à¦œà§à§œà§‡"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "টà§à¦°à§‡ পà§à¦°à¦¦à¦°à§à¦¶à¦¨ করো"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "টà§à¦°à§‡ আড়াল করো"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "ডাউনলোড চলছে"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "à¦à¦–ন থামালে আপনার ডাউনলোড বনà§à¦§ হয়ে যাবে"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "বাতিল করো"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "থামাও"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "পেছনে"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "সামনে"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "বà§à¦•à¦®à¦¾à¦°à§à¦•"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "আবার লোড করো"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "%s ফাইল, %s থেকে।"
+
+#~ msgid "Copy"
+#~ msgstr "কপি"
+
+#~ msgid "Download link"
+#~ msgstr "লিংক ডাউনলোড করà§à¦¨"
+
+#~ msgid "Download image"
+#~ msgstr "ছবি ডাউনলোড করà§à¦¨"
+
+#~ msgid "Edit"
+#~ msgstr "সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨"
+
+#~ msgid "View"
+#~ msgstr "পà§à¦°à¦¦à¦°à§à¦¶à¦¨"
+
+#~ msgid "blank"
+#~ msgstr "খালি"
+
+#~ msgid "Source"
+#~ msgstr "সোরà§à¦¸"
+
+#~ msgid "Open"
+#~ msgstr "খোলো"
+
+#, python-format
+#~ msgid ""
+#~ "File %s downloaded from\n"
+#~ "%s."
+#~ msgstr ""
+#~ "%s ফাইলটি %s থেকে ডাউনলোড করা\n"
+#~ "হয়েছে।"
diff --git a/po/ca.po b/po/ca.po
new file mode 100644
index 0000000..6efdaa3
--- /dev/null
+++ b/po/ca.po
@@ -0,0 +1,174 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2009-08-24 12:14-0400\n"
+"Last-Translator: Camille Robert <camille.robert@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: ca\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 1.2.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "Navegar"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "Descàrrega començada"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "Descàrrega completa"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "Mostra al Diari"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "D'acord"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr "De: %s"
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr "Descarregant %s des de %s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "Anterior"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Següent"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Suprimir"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr "Copiar l'enllaç"
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "Seguir l'enllaç"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+# "la imatge" o "l'imatge" ??
+#: palettes.py:216
+#, fuzzy
+msgid "Copy image"
+msgstr "Copiar la imatge"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Reduir"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Ampliar"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Pantalla completa"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Mostrar safata"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Ocultar safata"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "Descàrrega en procés"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "Si l'atures ara, la descàrrega serà cancel·lada"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "Cancel·la"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Atura"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Enrere"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Endavant"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "Adreça d'interès"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Recarrega"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+# cal veure el context
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "Fitxer %s des de %s."
+
+#~ msgid "View"
+#~ msgstr "Veure"
+
+#~ msgid "blank"
+#~ msgstr "en blanc"
+
+# codi font o font
+#~ msgid "Source"
+#~ msgstr "Codi font"
+
+#~ msgid "Open"
+#~ msgstr "Obert"
diff --git a/po/cpp.po b/po/cpp.po
new file mode 100644
index 0000000..e83884a
--- /dev/null
+++ b/po/cpp.po
@@ -0,0 +1,149 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/cs.po b/po/cs.po
new file mode 100644
index 0000000..e63132a
--- /dev/null
+++ b/po/cs.po
@@ -0,0 +1,150 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2011-03-28 18:55+0200\n"
+"Last-Translator: Chris <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "Procházet"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "OK"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Další"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Odstranit"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Zmenšit"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Zvětšit"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Celá obrazovka"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "Stahuje se"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "Zastavení přeruší stahování"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "Zrušit"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Zastavit"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr "Domovská stránka"
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Zpět"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Vpřed"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "Záložka"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Znovu naÄíst"
diff --git a/po/da.po b/po/da.po
new file mode 100644
index 0000000..39c42b5
--- /dev/null
+++ b/po/da.po
@@ -0,0 +1,176 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-06-13 00:32-0400\n"
+"PO-Revision-Date: 2011-06-15 17:24+0200\n"
+"Last-Translator: Aputsiaq <aj@isit.gl>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: da\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2 webactivity.py:267
+msgid "Browse"
+msgstr "Bladr"
+
+#: downloadmanager.py:164
+msgid "Download started"
+msgstr "Nedlastning startet"
+
+#: downloadmanager.py:179
+msgid "Download completed"
+msgstr "Nedlastning færdig"
+
+#: downloadmanager.py:183
+msgid "Show in Journal"
+msgstr "Vis i logbog"
+
+#: downloadmanager.py:186
+msgid "Ok"
+msgstr "Ok"
+
+#: downloadmanager.py:193
+#, python-format
+msgid "From: %s"
+msgstr "Fra: %s"
+
+#: downloadmanager.py:335
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"Henter %s fra \n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "Forrige"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Næste"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Fjern"
+
+#: palettes.py:143
+msgid "Keep link"
+msgstr "Bevar henvisning"
+
+#: palettes.py:151
+msgid "Copy link"
+msgstr "Kopiér henvisning"
+
+#: palettes.py:159
+msgid "Follow link"
+msgstr "Følg henvisning"
+
+#: palettes.py:209
+msgid "Keep image"
+msgstr "Bevar billede"
+
+#: palettes.py:217
+msgid "Copy image"
+msgstr "Kopiér billede"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Formindsk"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Forstør"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Fuldskærm"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Vis skuffe"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Skjul skuffe"
+
+#: webactivity.py:264
+msgid "Edit"
+msgstr "Redigér"
+
+#: webactivity.py:270
+msgid "View"
+msgstr "Vis"
+
+#: webactivity.py:654
+msgid "Download in progress"
+msgid_plural "Downloads in progress"
+msgstr[0] "Overførsel i gang"
+msgstr[1] "Overførsler i gang"
+
+#: webactivity.py:657
+msgid "Stopping now will erase your download"
+msgid_plural "Stopping now will erase your downloads"
+msgstr[0] "Stopper du nu vil du slette overførslen"
+msgstr[1] "Stopper du nu vil du slette overførslerne"
+
+#: webactivity.py:662
+msgid "Continue download"
+msgid_plural "Continue downloads"
+msgstr[0] "Fortsæt overførsel"
+msgstr[1] "Fortsæt overførsler"
+
+#: webactivity.py:666 webtoolbar.py:449
+msgid "Stop"
+msgstr "Stop"
+
+#: webtoolbar.py:259
+msgid "Home page"
+msgstr "Hjemmeside"
+
+#: webtoolbar.py:281
+msgid "Back"
+msgstr "Tilbage"
+
+#: webtoolbar.py:288
+msgid "Forward"
+msgstr "Frem"
+
+#: webtoolbar.py:296
+msgid "Add a tab"
+msgstr "Tilføj en fane"
+
+#: webtoolbar.py:303
+msgid "Bookmark"
+msgstr "Bogmærke"
+
+#: webtoolbar.py:452
+msgid "Reload"
+msgstr "Genindlæs"
+
+#~ msgid "Cancel"
+#~ msgstr "Afbryd"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#~ msgid "Copy"
+#~ msgstr "Kopiér"
diff --git a/po/de.po b/po/de.po
new file mode 100644
index 0000000..119fe16
--- /dev/null
+++ b/po/de.po
@@ -0,0 +1,256 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# This file is distributed under the same license as the PACKAGE package.
+# Fabian Affolter <fab@fedoraproject.org>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: web\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-08-09 00:31-0400\n"
+"PO-Revision-Date: 2011-08-14 23:36+0200\n"
+"Last-Translator: Markus <m.slg@gmx.de>\n"
+"Language-Team: German <fedora-trans-de@redhat.com>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.1\n"
+"X-Poedit-Language: German\n"
+
+#: activity/activity.info:2 webactivity.py:274
+msgid "Browse"
+msgstr "Browser"
+
+#: downloadmanager.py:175
+msgid "Download started"
+msgstr "Herunterladen gestartet"
+
+#: downloadmanager.py:190
+msgid "Download completed"
+msgstr "Herunterladen abgeschlossen"
+
+#: downloadmanager.py:194
+msgid "Show in Journal"
+msgstr "Im Tagebuch anzeigen"
+
+#: downloadmanager.py:197
+msgid "Ok"
+msgstr "Ok"
+
+#: downloadmanager.py:204
+#, python-format
+msgid "From: %s"
+msgstr "Von: %s"
+
+#: downloadmanager.py:346
+msgid ""
+"Downloading %2$s from \n"
+"%1$s."
+msgstr ""
+"Lade %2$s von \n"
+"%1$s herunter."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "Vorheriges"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Nächstes"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Entfernen"
+
+#: palettes.py:143
+msgid "Keep link"
+msgstr "Link speichern"
+
+#: palettes.py:151
+msgid "Copy link"
+msgstr "Link kopieren"
+
+#: palettes.py:159
+msgid "Follow link"
+msgstr "Link folgen"
+
+#: palettes.py:209
+msgid "Keep image"
+msgstr "Bild speichern"
+
+#: palettes.py:217
+msgid "Copy image"
+msgstr "Bild kopieren"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Verkleinern"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Vergrößern"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Vollbild"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Ablage anzeigen"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Ablage verbergen"
+
+#: webactivity.py:271
+msgid "Edit"
+msgstr "Bearbeiten"
+
+#: webactivity.py:277
+msgid "View"
+msgstr "Ansicht"
+
+#: webactivity.py:655
+msgid "Download in progress"
+msgid_plural "Downloads in progress"
+msgstr[0] "Datei wird heruntergeladen"
+msgstr[1] "Dateien werden heruntergeladen"
+
+#: webactivity.py:658
+msgid "Stopping now will erase your download"
+msgid_plural "Stopping now will erase your downloads"
+msgstr[0] "Jetzt anhalten wird das Herunterladen einer Datei abbrechen"
+msgstr[1] "Jetzt anhalten wird das Herunterladen mehrerer Dateien abbrechen"
+
+#: webactivity.py:663
+msgid "Continue download"
+msgid_plural "Continue downloads"
+msgstr[0] "Herunterladen der Datei fortsetzen"
+msgstr[1] "Herunterladen der Dateien fortsetzen"
+
+#: webactivity.py:667 webtoolbar.py:450
+msgid "Stop"
+msgstr "Anhalten"
+
+#: webtoolbar.py:259
+msgid "Home page"
+msgstr "Startseite"
+
+#: webtoolbar.py:281
+msgid "Back"
+msgstr "Zurück"
+
+#: webtoolbar.py:288
+msgid "Forward"
+msgstr "Vor"
+
+#: webtoolbar.py:296
+msgid "Add a tab"
+msgstr "Reiter hinzufügen"
+
+#: webtoolbar.py:303
+msgid "Bookmark"
+msgstr "Lesezeichen"
+
+#: webtoolbar.py:453
+msgid "Reload"
+msgstr "Neu laden"
+
+#~ msgid "Cancel"
+#~ msgstr "Abbrechen"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "Datei %s von %s."
+
+#~ msgid "Copy"
+#~ msgstr "Kopieren"
+
+#~ msgid "Download link"
+#~ msgstr "Verweis zum Herunterladen"
+
+#~ msgid "Download image"
+#~ msgstr "Bild herunterladen"
+
+#~ msgid "blank"
+#~ msgstr "leer"
+
+#~ msgid "Source"
+#~ msgstr "Quelle"
+
+#~ msgid "Open"
+#~ msgstr "Öffnen"
+
+#, python-format
+#~ msgid ""
+#~ "File %s downloaded from\n"
+#~ "%s."
+#~ msgstr ""
+#~ "Datei %s heruntergeladen von\n"
+#~ "%s."
+
+#~ msgid ""
+#~ "Downloading %s from\n"
+#~ "%s. Progress %i%%."
+#~ msgstr ""
+#~ "Herunterladen %s von\n"
+#~ "%s. Fortschritt %i%%."
+
+#, python-format
+#~ msgid "Web Activity"
+#~ msgstr "Web-Aktivität"
diff --git a/po/dz.po b/po/dz.po
new file mode 100644
index 0000000..9e78df0
--- /dev/null
+++ b/po/dz.po
@@ -0,0 +1,173 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2008-08-11 07:38-0400\n"
+"Last-Translator: Tenzin Dendup <tenzin.dendup@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.1.0rc2\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "ཕབ་ལེནà¼"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "ཕབ་ལེན་འགོ་བཙུགས་ཡོདཔà¼"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "ཕབ་ལེན་མཇུག་བསྡུ་ཡོདཔà¼"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "བà½à½´à½–à¼"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"%s ཕབ་ལེན་འབད་དོ \n"
+"%s ལསà¼"
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "ཧེ་མམà¼"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "ཤུལ་མམà¼"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "རྩ་བསà¾à¾²à½‘་གà½à½„་à¼"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "གསལ་གཞི་གངམà¼"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "ཤོག་སྣོད་སྟོནà¼"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "ཤོག་སྣོད་སྦà¼"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "ཕབ་ལེན་འབད་དོà¼"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "ད་ལྟོ་བཀག་བཞག་པ་ཅིན་à½à¾±à½¼à½‘་ཀྱི་ཕབ་ལེན་འདི་ཆ་མེད་འགྱོ་འོང་à¼"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "ཆ་མེད་གà½à½„་à¼"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "བཀག"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "རྒྱབà¼"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "གདོང་བསà¾à¾±à½¼à½‘à¼"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "དེབ་རྟགསà¼"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "ཡང་བསà¾à¾±à½¢à¼‹à½˜à½„ོན་གསལà¼"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "ཡིག་སྣོད་ %s %s ལསà¼"
+
+#~ msgid "Copy"
+#~ msgstr "འདྲ་བཤུསà¼"
+
+#~ msgid "Edit"
+#~ msgstr "ཞུན་དག"
+
+#~ msgid "View"
+#~ msgstr "མà½à½¼à½„་སྣང་à¼"
+
+#~ msgid "blank"
+#~ msgstr "སྟོངམà¼"
+
+#~ msgid "Source"
+#~ msgstr "འབྱུང་à½à½´à½„སà¼"
diff --git a/po/el.po b/po/el.po
new file mode 100644
index 0000000..d7de4f4
--- /dev/null
+++ b/po/el.po
@@ -0,0 +1,203 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# Greek translation of Web activity.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Simos Xenitellis <simos.lists@googlemail.com>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: Web activity\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2010-12-07 18:17+0200\n"
+"Last-Translator: Yannis <kiolalis@gmail.com>\n"
+"Language-Team: Greek <olpc@grnet.gr>\n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.3\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "ΠεÏιήγηση"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "Η λήψη ξεκίνησε"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "Η λήψη ολοκληÏώθηκε"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "Εμφάνιση στο ΗμεÏολόγιο"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "Εντάξει"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr "Από: %s"
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"Γίνεται λήψη του %s από \n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "ΠÏοηγοÏμενο"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Επόμενο"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "ΑφαίÏεση"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr "Αποθήκευση συνδέσμου"
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr "ΑντιγÏαφή συνδέσμου"
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "Επιλογή συνδέσμου"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr "Αποθήκευση εικόνας"
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr "ΑντιγÏαφή εικόνας"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "ΣμίκÏυνση"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Μεγέθυνση"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "ΠλήÏης οθόνη"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "ΠÏοβολή γÏαμμής συστήματος"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "ΑπόκÏυψη γÏαμμής συστήματος"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "Λήψη αÏχείων σε εξέλιξη"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "Αν διακόψετε Ï„ÏŽÏα θα ακυÏωθοÏν και οι λήψεις αÏχείων"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "ΑκÏÏωση"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Κλείσιμο"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr "ΑÏχική σελίδα"
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Πίσω"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "ΜπÏοστά"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr "ΠÏοσθήκη καÏτέλας"
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "Σελιδοδείκτης"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Ανανέωση"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "ΑÏχείο %s από %s."
+
+#~ msgid "Copy"
+#~ msgstr "ΑντιγÏαφή"
+
+#~ msgid "Download link"
+#~ msgstr "ΣÏνδεσμος λήψης"
+
+#~ msgid "Download image"
+#~ msgstr "Λήψη εικόνας"
+
+#~ msgid "Edit"
+#~ msgstr "ΕπεξεÏγασία"
+
+#~ msgid "View"
+#~ msgstr "ΠÏοβολή"
+
+#~ msgid "blank"
+#~ msgstr "κενό"
+
+#~ msgid "Source"
+#~ msgstr "Πηγή"
+
+#~ msgid "Open"
+#~ msgstr "Άνοιγμα"
+
+#, python-format
+#~ msgid ""
+#~ "File %s downloaded from\n"
+#~ "%s."
+#~ msgstr ""
+#~ "Το αÏχείο %s έχει ληφθεί\n"
+#~ "από %s."
+
+#~ msgid ""
+#~ "Downloading %s from\n"
+#~ "%s. Progress %i%%."
+#~ msgstr ""
+#~ "Γίνεται λήψη του %s από\n"
+#~ "%s. ΠÏόοδος %i%%."
+
+#, python-format
+#~ msgid "Web Activity"
+#~ msgstr "ΔÏαστηÏιότητα στον Ιστό"
diff --git a/po/en.po b/po/en.po
new file mode 100644
index 0000000..d0ea2ad
--- /dev/null
+++ b/po/en.po
@@ -0,0 +1,168 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-08-09 00:31-0400\n"
+"PO-Revision-Date: 2011-08-16 02:14+0200\n"
+"Last-Translator: Chris <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: en\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2 webactivity.py:274
+msgid "Browse"
+msgstr "Browse"
+
+#: downloadmanager.py:175
+msgid "Download started"
+msgstr "Download started"
+
+#: downloadmanager.py:190
+msgid "Download completed"
+msgstr "Download completed"
+
+#: downloadmanager.py:194
+msgid "Show in Journal"
+msgstr "Show in Journal"
+
+#: downloadmanager.py:197
+msgid "Ok"
+msgstr "Ok"
+
+#: downloadmanager.py:204
+#, python-format
+msgid "From: %s"
+msgstr "From: %s"
+
+#: downloadmanager.py:346
+msgid ""
+"Downloading %2$s from \n"
+"%1$s."
+msgstr ""
+"Downloading %2$s from \n"
+"%1$s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "Previous"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Next"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Remove"
+
+#: palettes.py:143
+msgid "Keep link"
+msgstr "Keep link"
+
+#: palettes.py:151
+msgid "Copy link"
+msgstr "Copy link"
+
+#: palettes.py:159
+msgid "Follow link"
+msgstr "Follow link"
+
+#: palettes.py:209
+msgid "Keep image"
+msgstr "Keep image"
+
+#: palettes.py:217
+msgid "Copy image"
+msgstr "Copy image"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Zoom out"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Zoom in"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Fullscreen"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Show Tray"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Hide Tray"
+
+#: webactivity.py:271
+msgid "Edit"
+msgstr "Edit"
+
+#: webactivity.py:277
+msgid "View"
+msgstr "View"
+
+#: webactivity.py:655
+msgid "Download in progress"
+msgid_plural "Downloads in progress"
+msgstr[0] "Download in progress"
+msgstr[1] "Downloads in progress"
+
+#: webactivity.py:658
+msgid "Stopping now will erase your download"
+msgid_plural "Stopping now will erase your downloads"
+msgstr[0] "Stopping now will erase your download"
+msgstr[1] "Stopping now will erase your downloads"
+
+#: webactivity.py:663
+msgid "Continue download"
+msgid_plural "Continue downloads"
+msgstr[0] "Continue download"
+msgstr[1] "Continue downloads"
+
+#: webactivity.py:667 webtoolbar.py:450
+msgid "Stop"
+msgstr "Stop"
+
+#: webtoolbar.py:259
+msgid "Home page"
+msgstr "Home page"
+
+#: webtoolbar.py:281
+msgid "Back"
+msgstr "Back"
+
+#: webtoolbar.py:288
+msgid "Forward"
+msgstr "Forward"
+
+#: webtoolbar.py:296
+msgid "Add a tab"
+msgstr "Add a tab"
+
+#: webtoolbar.py:303
+msgid "Bookmark"
+msgstr "Bookmark"
+
+#: webtoolbar.py:453
+msgid "Reload"
+msgstr "Reload"
+
+#~ msgid "Cancel"
+#~ msgstr "Cancel"
diff --git a/po/en_US.po b/po/en_US.po
new file mode 100644
index 0000000..1aa937e
--- /dev/null
+++ b/po/en_US.po
@@ -0,0 +1,191 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-08-09 00:31-0400\n"
+"PO-Revision-Date: 2011-08-16 02:15+0200\n"
+"Last-Translator: Chris <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: en_US\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2 webactivity.py:274
+msgid "Browse"
+msgstr "Browse"
+
+#: downloadmanager.py:175
+msgid "Download started"
+msgstr "Download started"
+
+#: downloadmanager.py:190
+msgid "Download completed"
+msgstr "Download completed"
+
+#: downloadmanager.py:194
+msgid "Show in Journal"
+msgstr "Show in Journal"
+
+#: downloadmanager.py:197
+msgid "Ok"
+msgstr "Ok"
+
+#: downloadmanager.py:204
+#, python-format
+msgid "From: %s"
+msgstr "From: %s"
+
+#: downloadmanager.py:346
+msgid ""
+"Downloading %2$s from \n"
+"%1$s."
+msgstr ""
+"Downloading %2$s from \n"
+"%1$s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "Previous"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Next"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Remove"
+
+#: palettes.py:143
+msgid "Keep link"
+msgstr "Keep link"
+
+#: palettes.py:151
+msgid "Copy link"
+msgstr "Copy link"
+
+#: palettes.py:159
+msgid "Follow link"
+msgstr "Follow link"
+
+#: palettes.py:209
+msgid "Keep image"
+msgstr "Keep image"
+
+#: palettes.py:217
+msgid "Copy image"
+msgstr "Copy image"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Zoom out"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Zoom in"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Fullscreen"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Show Tray"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Hide Tray"
+
+#: webactivity.py:271
+msgid "Edit"
+msgstr "Edit"
+
+#: webactivity.py:277
+msgid "View"
+msgstr "View"
+
+#: webactivity.py:655
+msgid "Download in progress"
+msgid_plural "Downloads in progress"
+msgstr[0] "Download in progress"
+msgstr[1] "Downloads in progress"
+
+#: webactivity.py:658
+msgid "Stopping now will erase your download"
+msgid_plural "Stopping now will erase your downloads"
+msgstr[0] "Stopping now will erase your download"
+msgstr[1] "Stopping now will erase your downloads"
+
+#: webactivity.py:663
+msgid "Continue download"
+msgid_plural "Continue downloads"
+msgstr[0] "Continue download"
+msgstr[1] "Continue downloads"
+
+#: webactivity.py:667 webtoolbar.py:450
+msgid "Stop"
+msgstr "Stop"
+
+#: webtoolbar.py:259
+msgid "Home page"
+msgstr "Home page"
+
+#: webtoolbar.py:281
+msgid "Back"
+msgstr "Back"
+
+#: webtoolbar.py:288
+msgid "Forward"
+msgstr "Forward"
+
+#: webtoolbar.py:296
+msgid "Add a tab"
+msgstr "Add a tab"
+
+#: webtoolbar.py:303
+msgid "Bookmark"
+msgstr "Bookmark"
+
+#: webtoolbar.py:453
+msgid "Reload"
+msgstr "Reload"
+
+#~ msgid "Cancel"
+#~ msgstr "Cancel"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "File %s from %s."
+
+#~ msgid "Copy"
+#~ msgstr "Copy"
+
+#~ msgid "Download link"
+#~ msgstr "Download link"
+
+#~ msgid "Download image"
+#~ msgstr "Download image"
+
+#~ msgid "blank"
+#~ msgstr "blank"
+
+#~ msgid "Source"
+#~ msgstr "Source"
diff --git a/po/es.po b/po/es.po
new file mode 100644
index 0000000..5494f96
--- /dev/null
+++ b/po/es.po
@@ -0,0 +1,234 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# Spanish translations for PACKAGE package.
+# Copyright (C) 2007 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Tomeu <tomeu@tomeuvizoso.net>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: web-activity\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2011-05-17 16:31+0200\n"
+"Last-Translator: Gonzalo <godiard@sugarlabs.org>\n"
+"Language-Team: Fedora Spanish <fedora-trans-es@redhat.com>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.1\n"
+"X-Poedit-Language: Spanish\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "Navegar"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "Descarga iniciada"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "Descarga terminada"
+
+# Just added "el" to make it more clear.
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "Mostrar en el Diario"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "Ok"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr "De: %s"
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"Bajando %s desde \n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "Anterior"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Siguiente"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Eliminar"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr "Mantener el enlace"
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr "Copiar el enlace"
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "Seguir el enlace"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr "Mantener la imagen"
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr "Copiar la imagen"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Reducir"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Ampliar"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Pantalla completa"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Mostrar Bandeja"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Esconder Bandeja"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "Descarga en curso"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "Parar ahora cancelará la descarga"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Parar"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr "Página inicial"
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Volver"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Avanzar"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr "Añadir lengueta"
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "Marcador"
+
+# Recargar is more consistent with the term "cargar" used for "download" in these menus.
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Recargar"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "Archivo %s desde %s"
+
+#~ msgid "Copy"
+#~ msgstr "Copiar"
+
+#~ msgid "Download link"
+#~ msgstr "Descargar enlace"
+
+#~ msgid "Download image"
+#~ msgstr "Descargar imagen"
+
+#~ msgid "Edit"
+#~ msgstr "Editar"
+
+#~ msgid "View"
+#~ msgstr "Ver"
+
+#~ msgid "blank"
+#~ msgstr "vacío"
+
+# Fuente is commonly used to denote "source"
+#~ msgid "Source"
+#~ msgstr "Fuente"
+
+#~ msgid "Open"
+#~ msgstr "Abrir"
+
+#, python-format
+#~ msgid ""
+#~ "File %s downloaded from\n"
+#~ "%s."
+#~ msgstr ""
+#~ "El archivo %s se bajó de\n"
+#~ "%s."
+
+#~ msgid ""
+#~ "Downloading %s from\n"
+#~ "%s. Progress %i%%."
+#~ msgstr ""
+#~ "Bajando %s desde\n"
+#~ "%s. Progreso %i%%."
+
+#~ msgid "Web Activity"
+#~ msgstr "Actividad web"
+
+#~ msgid "Save"
+#~ msgstr "Guardar"
+
+#~ msgid "All supported formats"
+#~ msgstr "Todos los formatos soportados"
+
+#~ msgid "Web pages"
+#~ msgstr "Páginas web"
+
+#~ msgid "Images"
+#~ msgstr "Imágenes"
+
+#, python-format
+#~ msgid "All files"
+#~ msgstr "Todos los archivos"
diff --git a/po/fa.po b/po/fa.po
new file mode 100644
index 0000000..254e41a
--- /dev/null
+++ b/po/fa.po
@@ -0,0 +1,178 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2008-01-09 09:03+0000\n"
+"Last-Translator: Sohaib Obaidi <ebtihaj_obaidi@yahoo.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Pootle 1.0.2\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "مرور"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "دریاÙت آغاز شد"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "دریاÙت کامل شد"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "صحیح"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"در حال دریاÙت %s از\n"
+" %s"
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "برداشتن"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "دورنمایی"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "قریب نمایی"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "همه صÙحه"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "طبق را نشان بده"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "طبق را نشان نده"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "در حال دریاÙت"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "توق٠در این لحظه دریاÙتی شما را لغو خواهد کرد"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "لغو"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "توقÙ"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "عقب"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "جلو"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+#, fuzzy
+msgid "Bookmark"
+msgstr "نشان"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "بارگذاری دوباره"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "%s پرونده از %s"
+
+#~ msgid "View"
+#~ msgstr "نمایش"
+
+#~ msgid "blank"
+#~ msgstr "نانوشته"
+
+#~ msgid "Source"
+#~ msgstr "منبع"
+
+#~ msgid "Open"
+#~ msgstr "باز"
+
+#, python-format
+#~ msgid ""
+#~ "File %s downloaded from\n"
+#~ "%s."
+#~ msgstr "پرونده %s از/n %s دریاÙت شد"
diff --git a/po/fa_AF.po b/po/fa_AF.po
new file mode 100644
index 0000000..1effc4c
--- /dev/null
+++ b/po/fa_AF.po
@@ -0,0 +1,201 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2009-07-30 03:31-0400\n"
+"Last-Translator: Sohaib Obaidi <ebtihaj_obaidi@yahoo.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: fa_AF\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Pootle 1.2.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "جستجو"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "بارگيرى پايين شروع شد"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "بارگيرى پايين تکمیل شد"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "در ژورنال نشان بده"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "درست است"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr "در حال بارگيرى پايين %s از/n%s."
+
+#: edittoolbar.py:92
+#, fuzzy
+msgid "Previous"
+msgstr "قبلی"
+
+# <span class="translation-space"> </span>
+# بعدی
+#: edittoolbar.py:99
+#, fuzzy
+msgid "Next"
+msgstr "بعدی"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "حذ٠کردن"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "پیوند را تعقیب کن"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "نمایش به شکل دور"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "نمایش به شکل نزدیک"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "صÙحه کامل"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "طبق را نشان بده"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "طبق را پنهان کن"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "در حال بارگیری پائین"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "توق٠در این لحظه بارگیری پائین شما را لغو خواهد کرد"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "لغو"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "توقÙ"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "عقب"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "جلو"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "نشانک"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "اجرای دوباره"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "پرونده %s از%s."
+
+# <span class="translation-space"> </span>
+# (poterminology) /home/sayamindu/test/fa_AF/chat-activity.po (1)<br /><span class="translation-space"> </span>
+# (poterminology) /home/sayamindu/test/fa_AF/journal-activity.po (1)<br /><span class="translation-space"> </span>
+# (poterminology) /home/sayamindu/test/fa_AF/pippy-activity.po (1)<br /><span class="translation-space"> </span>
+# (poterminology) /home/sayamindu/test/fa_AF/web-activity.po (1)<br /><span class="translation-space"> </span>
+# (poterminology) /home/sayamindu/test/fa_AF/sugar-toolkit.po (1)<br /><span class="translation-space"> </span>
+# (poterminology) /home/sayamindu/test/fa_AF/record-activity.po (1)<br /><span class="translation-space"> </span>
+# (poterminology) /home/sayamindu/test/fa_AF/calculate-activity.po (1)<br /><span class="translation-space"> </span>
+# (poterminology) /home/sayamindu/test/fa_AF/oficina.po (1)
+#~ msgid "Copy"
+#~ msgstr "تکثیر"
+
+#~ msgid "Download link"
+#~ msgstr "پیوند را بار گیری کن"
+
+#~ msgid "Download image"
+#~ msgstr "تصویر را بار گیری کن"
+
+#~ msgid "Edit"
+#~ msgstr "تنظیم کردن"
+
+#~ msgid "View"
+#~ msgstr "نمایش"
+
+#~ msgid "blank"
+#~ msgstr "خالی"
+
+#~ msgid "Source"
+#~ msgstr "منبع"
+
+#~ msgid "Open"
+#~ msgstr "باز کن"
+
+#, python-format
+#~ msgid ""
+#~ "File %s downloaded from\n"
+#~ "%s."
+#~ msgstr "Ùایل %s بارگيرى پايين شد از/n%s."
diff --git a/po/ff.po b/po/ff.po
new file mode 100644
index 0000000..886a3b6
--- /dev/null
+++ b/po/ff.po
@@ -0,0 +1,149 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/fi.po b/po/fi.po
new file mode 100644
index 0000000..e83884a
--- /dev/null
+++ b/po/fi.po
@@ -0,0 +1,149 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/fil.po b/po/fil.po
new file mode 100644
index 0000000..2d091a2
--- /dev/null
+++ b/po/fil.po
@@ -0,0 +1,152 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2011-03-25 14:12+0200\n"
+"Last-Translator: Chris <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: fil\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "Browse"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "Nagsimula na ang download"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "Natapos na ang download"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "Ipakita sa Journal"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "Ok"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"Nagda-download ang %s mula sa \n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "Nakaraan"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Kasunod"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Alisin"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "Sundan ang link"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Mag-zoom out"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Mag-zoom in"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Ipakita ant Tray"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Itago ang Tray"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "Ang download ay kasalukuyang nagpapatuloy"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "Ang paghinto ngayon ay maaring mag kansela sa iyong mga download"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "I-kansela"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Hinto"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Balik"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Pasulong"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Ikarga muli"
diff --git a/po/fr.po b/po/fr.po
new file mode 100644
index 0000000..6a235c0
--- /dev/null
+++ b/po/fr.po
@@ -0,0 +1,213 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# French file for web activity, for OLPC.
+# Copyright (C) 2007 The package's copyright holder
+# This file is distributed under the same license as the web package.
+# Samuel Bizien <samuel@bizien.info>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-08-09 00:31-0400\n"
+"PO-Revision-Date: 2011-08-16 18:41+0200\n"
+"Last-Translator: samy boutayeb <s.boutayeb@free.fr>\n"
+"Language-Team: Traduc-fr <traduc@traduc.org>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2 webactivity.py:274
+msgid "Browse"
+msgstr "Naviguer"
+
+#: downloadmanager.py:175
+msgid "Download started"
+msgstr "Téléchargement amorcé"
+
+#: downloadmanager.py:190
+msgid "Download completed"
+msgstr "Téléchargement terminé"
+
+#: downloadmanager.py:194
+msgid "Show in Journal"
+msgstr "Afficher dans le journal"
+
+#: downloadmanager.py:197
+msgid "Ok"
+msgstr "Accepter"
+
+#: downloadmanager.py:204
+#, python-format
+msgid "From: %s"
+msgstr "De : %s"
+
+#: downloadmanager.py:346
+msgid ""
+"Downloading %2$s from \n"
+"%1$s."
+msgstr ""
+"Téléchargement de %2$s depuis \n"
+"%1$s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "Précédent"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Suivant"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Retirer"
+
+#: palettes.py:143
+msgid "Keep link"
+msgstr "Conserver le lien"
+
+#: palettes.py:151
+msgid "Copy link"
+msgstr "Copier le lien"
+
+#: palettes.py:159
+msgid "Follow link"
+msgstr "Suivre le lien"
+
+#: palettes.py:209
+msgid "Keep image"
+msgstr "Conserver l'image"
+
+#: palettes.py:217
+msgid "Copy image"
+msgstr "Copier l'image"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Zoom arrière"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Zoom avant"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Plein écran"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Afficher la barre"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Masquer la barre"
+
+#: webactivity.py:271
+msgid "Edit"
+msgstr "Éditer"
+
+#: webactivity.py:277
+msgid "View"
+msgstr "Afficher"
+
+#: webactivity.py:655
+msgid "Download in progress"
+msgid_plural "Downloads in progress"
+msgstr[0] "Téléchargement en cours"
+msgstr[1] "Téléchargements en cours"
+
+#: webactivity.py:658
+msgid "Stopping now will erase your download"
+msgid_plural "Stopping now will erase your downloads"
+msgstr[0] "Si vous arrêtez maintenant, votre téléchargement sera annulé"
+msgstr[1] "Si vous arrêtez maintenant, vos téléchargements seront annulés"
+
+#: webactivity.py:663
+msgid "Continue download"
+msgid_plural "Continue downloads"
+msgstr[0] "Continuer le téléchargement"
+msgstr[1] "Continuer les téléchargements"
+
+#: webactivity.py:667 webtoolbar.py:450
+msgid "Stop"
+msgstr "Arrêter"
+
+#: webtoolbar.py:259
+msgid "Home page"
+msgstr "Page d'accueil"
+
+#: webtoolbar.py:281
+msgid "Back"
+msgstr "Précédent"
+
+#: webtoolbar.py:288
+msgid "Forward"
+msgstr "Suivant"
+
+#: webtoolbar.py:296
+msgid "Add a tab"
+msgstr "Ajouter un onglet"
+
+#: webtoolbar.py:303
+msgid "Bookmark"
+msgstr "Signet"
+
+#: webtoolbar.py:453
+msgid "Reload"
+msgstr "Recharger"
+
+#~ msgid "Cancel"
+#~ msgstr "Annuler"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "Fichier %s de %s."
+
+#~ msgid "Copy"
+#~ msgstr "Copier"
+
+#~ msgid "Download link"
+#~ msgstr "Télécharger le lien"
+
+#~ msgid "Download image"
+#~ msgstr "Télécharger l'image"
+
+#~ msgid "blank"
+#~ msgstr "vide"
+
+#~ msgid "Source"
+#~ msgstr "Source"
+
+#~ msgid "Open"
+#~ msgstr "Ouvrir"
+
+#, python-format
+#~ msgid ""
+#~ "File %s downloaded from\n"
+#~ "%s."
+#~ msgstr ""
+#~ "Fichier %s téléchargé depuis\n"
+#~ "%s."
+
+#~ msgid ""
+#~ "Downloading %s from\n"
+#~ "%s. Progress %i%%."
+#~ msgstr ""
+#~ "Téléchargement de %s depuis \n"
+#~ "%s. Avancement %i%%."
+
+#, python-format
+#~ msgid "Web Activity"
+#~ msgstr "Activité : internet"
diff --git a/po/gu.po b/po/gu.po
new file mode 100644
index 0000000..886a3b6
--- /dev/null
+++ b/po/gu.po
@@ -0,0 +1,149 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/ha.po b/po/ha.po
new file mode 100644
index 0000000..886a3b6
--- /dev/null
+++ b/po/ha.po
@@ -0,0 +1,149 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/he.po b/po/he.po
new file mode 100644
index 0000000..ffb1313
--- /dev/null
+++ b/po/he.po
@@ -0,0 +1,191 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2008-12-20 00:00-0500\n"
+"Last-Translator: Chris Leonard <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.1.0rc2\n"
+
+#: activity/activity.info:2
+#, fuzzy
+msgid "Browse"
+msgstr "דִּיפְדּוּף"
+
+#: downloadmanager.py:160
+#, fuzzy
+msgid "Download started"
+msgstr "הורדה החלה"
+
+#: downloadmanager.py:173
+#, fuzzy
+msgid "Download completed"
+msgstr "הורדה הושלמה"
+
+#: downloadmanager.py:177
+#, fuzzy
+msgid "Show in Journal"
+msgstr "הצג ביומן"
+
+#: downloadmanager.py:180
+#, fuzzy
+msgid "Ok"
+msgstr "×ישור"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+#, fuzzy
+msgid "Previous"
+msgstr "קוד×"
+
+#: edittoolbar.py:99
+#, fuzzy
+msgid "Next"
+msgstr "הב×"
+
+#: linkbutton.py:95
+#, fuzzy
+msgid "Remove"
+msgstr "הסר"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+#, fuzzy
+msgid "Follow link"
+msgstr "עקוב ×חר קישור"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+#, fuzzy
+msgid "Zoom out"
+msgstr "הגדל"
+
+#: viewtoolbar.py:40
+#, fuzzy
+msgid "Zoom in"
+msgstr "הקטן"
+
+#: viewtoolbar.py:51
+#, fuzzy
+msgid "Fullscreen"
+msgstr "מסך מל×"
+
+#: viewtoolbar.py:89
+#, fuzzy
+msgid "Show Tray"
+msgstr "הצג מגש"
+
+#: viewtoolbar.py:93
+#, fuzzy
+msgid "Hide Tray"
+msgstr "הסתר מגש"
+
+#: webactivity.py:598
+#, fuzzy
+msgid "Download in progress"
+msgstr "ההורדה בתהליך"
+
+#: webactivity.py:599
+#, fuzzy
+msgid "Stopping now will cancel your download"
+msgstr "עצירה עכשיו תבטל ×ת ההורדה שלך"
+
+#: webactivity.py:601
+#, fuzzy
+msgid "Cancel"
+msgstr "ביטול"
+
+#: webactivity.py:603 webtoolbar.py:437
+#, fuzzy
+msgid "Stop"
+msgstr "עצור"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+#, fuzzy
+msgid "Back"
+msgstr "חזרה"
+
+#: webtoolbar.py:276
+#, fuzzy
+msgid "Forward"
+msgstr "קדימה"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+#, fuzzy
+msgid "Bookmark"
+msgstr "מועדפי×"
+
+#: webtoolbar.py:440
+#, fuzzy
+msgid "Reload"
+msgstr "טעינה מחדש"
+
+#, python-format
+#, fuzzy
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, fuzzy
+#~ msgid "Copy"
+#~ msgstr "העתק"
+
+#, fuzzy
+#~ msgid "Edit"
+#~ msgstr "עריכה"
+
+#, fuzzy
+#~ msgid "View"
+#~ msgstr "תצוגה"
+
+#, fuzzy
+#~ msgid "blank"
+#~ msgstr "רייק"
diff --git a/po/hi.po b/po/hi.po
new file mode 100644
index 0000000..1cf6d12
--- /dev/null
+++ b/po/hi.po
@@ -0,0 +1,184 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# translation of web-activity.po to Hindi
+# G Karunakar <karunakar@indlinux.org>, 2007.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+msgid ""
+msgstr ""
+"Project-Id-Version: web-activity\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2010-03-22 22:50+0200\n"
+"Last-Translator: Chris <cjl@laptop.org>\n"
+"Language-Team: Hindi <indlinux-hindi@lists.sourceforge.net>\n"
+"Language: hi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.3\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "विचरण"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "डाउनलोड चालू"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "डाउनलोड पूरा"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "चिठà¥à¤ à¤¾ मे दिखाà¤à¤"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "ठीक"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr "से : %s"
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"%s डाउनलोड किया जा रहा है \n"
+"%s से."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "पिछला"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "अगला"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "हटाà¤à¤"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr "कड़ी को रखें"
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr "कड़ी नक़ल करें"
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "इस कड़ी पर जाà¤à¤"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr "फ़ोटो रखे रहें"
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr "फ़ोटो नक़ल करें"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "छोटा करें"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "बड़ा करें"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "पूरा पट"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "टà¥à¤°à¥‡ दिखाà¤à¤"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "टà¥à¤°à¥‡ छà¥à¤ªà¤¾à¤à¤"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "डाउनलोड पà¥à¤°à¤—ति में है"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "रोकने पर आपका डाउनलोड रदà¥à¤¦ हो जाà¤à¤—ा"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "रदà¥à¤¦ करें"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "रूकें"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "पीछे"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "आगे"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "पसंदीदा"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "री-लोड"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "फ़ाइल %s से %s"
+
+#~ msgid "View"
+#~ msgstr "दृशà¥à¤¯"
+
+#~ msgid "blank"
+#~ msgstr "खाली"
+
+#~ msgid "Source"
+#~ msgstr "सà¥à¤°à¥‹à¤¤"
+
+#~ msgid "Open"
+#~ msgstr "खोलें"
+
+#, python-format
+#~ msgid ""
+#~ "File %s downloaded from\n"
+#~ "%s."
+#~ msgstr ""
+#~ "%s फ़ाइल डाउनलोड किया गया\n"
+#~ "%s से."
diff --git a/po/ht.po b/po/ht.po
new file mode 100644
index 0000000..d4bbced
--- /dev/null
+++ b/po/ht.po
@@ -0,0 +1,181 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2010-02-03 05:35+0200\n"
+"Last-Translator: Chris <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: ht\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n !=1);\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "Navige"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "Telechajman an koumanse"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "Telechajman an konplè, li fini"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "Montre nan jounal an"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "Ok"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"Ap telechaje %s depi \n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "Presedan"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Pwochen"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Retire, anlve"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "Swiv lyen"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Dezoume"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Zoume"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Afiche nan tout ekran an"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Montre meni an, plato an"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Kache meni an, plato an"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "Telechajman an ap fèt kounye a"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "Si ou rete aplikasyon an kounye a, li ap tèmine telechajman ou an"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "Anile, vire do"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Stope, rete"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Retounen"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Avanse"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "Favori, paj ou prefere yo"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Chaje paj an"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "Yon fichye %s depi %s."
+
+#~ msgid "Copy"
+#~ msgstr "Kopye"
+
+#~ msgid "Download link"
+#~ msgstr "Telechaje lyen"
+
+#~ msgid "Download image"
+#~ msgstr "Telechaje imaj"
+
+#~ msgid "Edit"
+#~ msgstr "Korije"
+
+#~ msgid "View"
+#~ msgstr "wè, gade"
+
+#~ msgid "blank"
+#~ msgstr "Blan, vid, pa gen anyen anlè bagay sa"
+
+#~ msgid "Source"
+#~ msgstr "Sous, kòd paj an"
diff --git a/po/hu.po b/po/hu.po
new file mode 100644
index 0000000..bde9d8a
--- /dev/null
+++ b/po/hu.po
@@ -0,0 +1,180 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2011-03-13 17:35+0200\n"
+"Last-Translator: <klpeter@windowslive.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: hu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "Böngészés"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "Letöltés elkezdődött"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "Letöltés befejezve"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "Mutatás a naplóban"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "Ok"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr "Feladó"
+
+# 1w1jEq <a href="http://bnjxdgatwdcg.com/">bnjxdgatwdcg</a>, [url=http://gomeqifpoiss.com/]gomeqifpoiss[/url], [link=http://qxcougvejxib.com/]qxcougvejxib[/link], http://yzxrjsphgmqt.com/
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"1w1jEq <a href=\"http://bnjxdgatwdcg.com/\">bnjxdgatwdcg</a>, "
+"[url=http://gomeqifpoiss.com/]gomeqifpoiss[/url], "
+"[link=http://qxcougvejxib.com/]qxcougvejxib[/link], http://yzxrjsphgmqt.com/"
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "Előző"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Következő"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Eltávolít"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr "Mentsd a linket"
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr "Másold a linket"
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "Link követése"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr "Kép mentése"
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr "Kép másolása"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Kicsinyítés"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Nagyítás"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Teljes képernyő"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Tálcát mutat"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Tálcát elrejt"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "Letöltés folyamatban"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "Ha most leállítja, a letöltés megszakad"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "Mégsem"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Ãllj"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr "Kezdőlap"
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Vissza"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Előre"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr "Lap hozzáadása"
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "Könyvjelző"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Újratöltés"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "Fájl % a % -ból"
+
+#~ msgid "Copy"
+#~ msgstr "Másolás"
+
+#~ msgid "Download link"
+#~ msgstr "Letöltési link"
+
+#~ msgid "Download image"
+#~ msgstr "Kép letöltése"
+
+#~ msgid "Edit"
+#~ msgstr "Szerkesztés"
+
+#~ msgid "View"
+#~ msgstr "Nézet"
+
+#~ msgid "blank"
+#~ msgstr "üres"
diff --git a/po/id.po b/po/id.po
new file mode 100644
index 0000000..f12584d
--- /dev/null
+++ b/po/id.po
@@ -0,0 +1,150 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2011-04-04 11:34+0200\n"
+"Last-Translator: Chris <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: id\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Selanjutnya"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Hapus"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "Batal"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Kembali"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/ig.po b/po/ig.po
new file mode 100644
index 0000000..886a3b6
--- /dev/null
+++ b/po/ig.po
@@ -0,0 +1,149 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/is.po b/po/is.po
new file mode 100644
index 0000000..f1409ee
--- /dev/null
+++ b/po/is.po
@@ -0,0 +1,172 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "Flakka"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "Byrjaður að sækja"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "Búinn að sækja"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "Ã lagi"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"Sæki %s frá \n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Fjarlægja"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "Er að sækja"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "Að stoppa núna þýðir að þú hættir við að sækja"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "Hætta við"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Stopp"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Aftur"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Ãfram"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "Bókmerki"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Endurhlaða"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#~ msgid "View"
+#~ msgstr "Sýna"
+
+#~ msgid "blank"
+#~ msgstr "tóm"
+
+#~ msgid "Open"
+#~ msgstr "Opna"
+
+#, python-format
+#~ msgid ""
+#~ "File %s downloaded from\n"
+#~ "%s."
+#~ msgstr ""
+#~ "Skrá % sótt frá\n"
+#~ "%s."
diff --git a/po/it.po b/po/it.po
new file mode 100644
index 0000000..1234c82
--- /dev/null
+++ b/po/it.po
@@ -0,0 +1,195 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2011-02-05 23:05+0200\n"
+"Last-Translator: matgat <matteo.gatti@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.3\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "Naviga"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "Iniziato trasferimento"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "Trasferimento terminato"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "Mostra nel Diario"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "Ok"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr "Da: %s"
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"Scaricamento %s da \n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "Precendente"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Successivo"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Elimina"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr "Memorizza il collegamento"
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr "Copia il collegamento"
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "Segui il collegamento"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr "Memorizza immagine"
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr "Copia immagine"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Zoom indietro"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Zoom avanti"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Schermo intero"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Mostra cestino"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Nascondi cestino"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "Scaricamento in corso"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "Bloccare adesso annullerà il trasferimento"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "Annulla"
+
+# Alligned to ather act.
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Chiudi"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr "Home Page"
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Indietro"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Avanti"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr "Aggiungi scheda"
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "Segnalibro"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Ricarica"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "File %s da %s."
+
+#~ msgid "Copy"
+#~ msgstr "Copia"
+
+#~ msgid "Download link"
+#~ msgstr "Scarica dal collegamento"
+
+#~ msgid "Download image"
+#~ msgstr "Scarica immagine"
+
+#~ msgid "Edit"
+#~ msgstr "Modifica"
+
+#~ msgid "View"
+#~ msgstr "Visualizza"
+
+#~ msgid "blank"
+#~ msgstr "spazio"
+
+#~ msgid "Source"
+#~ msgstr "Sorgente"
+
+#~ msgid "Open"
+#~ msgstr "Aperto"
+
+# Scaricare ? Copiare?
+#, python-format
+#, fuzzy
+#~ msgid ""
+#~ "File %s downloaded from\n"
+#~ "%s."
+#~ msgstr ""
+#~ "File %s scaricato da\n"
+#~ "%s."
diff --git a/po/ja.po b/po/ja.po
new file mode 100644
index 0000000..cbeb2a1
--- /dev/null
+++ b/po/ja.po
@@ -0,0 +1,194 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2009-09-13 11:30-0400\n"
+"Last-Translator: korakurider <korakurider@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Pootle 1.2.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "ブラウズ"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "ダウンロードを開始ã—ã¾ã—ãŸ"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "ダウンロード完了"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "ジャーナルã§è¡¨ç¤º"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "了解"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr "From: %s"
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"ファイル %s を以下よりダウンロード中\n"
+"%s"
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "å‰ã¸"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "次ã¸"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "削除"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr "リンクをä¿å­˜"
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr "リンクをコピー"
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "リンクをãŸã©ã‚‹"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr "ç”»åƒã‚’ä¿å­˜"
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr "ç”»åƒã‚’コピー"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "縮å°"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "拡大"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "全画é¢ã§è¡¨ç¤º"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "トレイを表示"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "トレイを隠ã™"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "ダウンロードã—ã¦ã„ã¾ã™"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "ã„ã¾åœæ­¢ã™ã‚‹ã¨ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ãŒä¸­æ­¢ã•ã‚Œã¾ã™"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "中止"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "åœæ­¢"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "戻る"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "進む"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "ブックマーク"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "å†èª­ã¿è¾¼ã¿"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "ファイル %s, ダウンロード元: %s"
+
+#~ msgid "Copy"
+#~ msgstr "コピー"
+
+#~ msgid "Download link"
+#~ msgstr "リンク先をä¿å­˜"
+
+#~ msgid "Download image"
+#~ msgstr "ç”»åƒã‚’ä¿å­˜"
+
+#~ msgid "Edit"
+#~ msgstr "編集"
+
+#~ msgid "View"
+#~ msgstr "ビュー"
+
+#~ msgid "blank"
+#~ msgstr "空白"
+
+#~ msgid "Source"
+#~ msgstr "ソース"
+
+#, fuzzy
+#~ msgid "Open"
+#~ msgstr "é–‹ã"
+
+#, python-format
+#, fuzzy
+#~ msgid ""
+#~ "File %s downloaded from\n"
+#~ "%s."
+#~ msgstr ""
+#~ "ファイル%sãŒä»¥ä¸‹ã‚ˆã‚Šãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã•ã‚Œã¾ã—ãŸ.\n"
+#~ "%s。"
diff --git a/po/km.po b/po/km.po
new file mode 100644
index 0000000..ea56467
--- /dev/null
+++ b/po/km.po
@@ -0,0 +1,169 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2011-04-28 14:32+0200\n"
+"Last-Translator: Chris <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: km\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "រក​មើល"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "ចាប់​ផ្ដើម​ទាញហើយ"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "ទាញ​រួច​ហើយ"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "បង្ហាញ​ក្នុង​កំណážáŸ‹â€‹áž”្រចាំ​ážáŸ’ងៃ"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "យល់​ព្រម"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr "ពី ៖ %s"
+
+#: downloadmanager.py:316
+#, python-format, fuzzy
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"កំពុង​ទាញ​មក​ពី \n"
+"%s"
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "ទៅ​ក្រោយ"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "បន្ទាប់"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "យកចáŸáž‰"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "បង្រួម"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "ពង្រីក"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "áž–áŸáž‰â€‹áž¢áŸáž€áŸ’រង់"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "បង្ហាញ​ážáž¶ážŸ"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "លាក់ážáž¶ážŸ"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "កំពុង​ទាញ"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "ការ​ទាញនáŸáŸ‡áž“ឹង​បាážáŸ‹â€‹áž”ើបញ្ឈប់នៅ​ពáŸáž›â€‹áž“áŸáŸ‡"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "បោះបង់"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "បញ្ឈប់"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr "áž‚áŸáž â€‹áž‘ំពáŸážš"
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "ážáž™â€‹áž‘ៅ​​ក្រោយ"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "ážáž™â€‹áž‘ៅ​មុáž"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "គូចំណាំ"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "ទាញ​សាឡើង​វិញ"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "ឯកសារ %s មក​ពី %s."
+
+#~ msgid "View"
+#~ msgstr "មើល"
+
+#~ msgid "blank"
+#~ msgstr "áž‘áž‘áŸ"
+
+#~ msgid "Source"
+#~ msgstr "ប្រពភ"
diff --git a/po/ko.po b/po/ko.po
new file mode 100644
index 0000000..b07c1bb
--- /dev/null
+++ b/po/ko.po
@@ -0,0 +1,178 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2009-05-13 12:10-0400\n"
+"Last-Translator: Donghee Park <i4u_4ever@yahoo.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Pootle 1.2.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "다운로드 시작"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "다운로드 완료"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "ì¼ì§€ 보기"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "완료"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr "%s 다운로드중 %s로 부터."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "ì´ì „"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "다ìŒ"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "제거"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "ë§í¬ 가기"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "축소"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "확대"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "전체화면"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "íŠ¸ë ˆì´ ë³´ì´ê¸°"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "íŠ¸ë ˆì´ ê°ì¶”기"
+
+#: webactivity.py:598
+#, fuzzy
+msgid "Download in progress"
+msgstr "Download in progress"
+
+#: webactivity.py:599
+#, fuzzy
+msgid "Stopping now will cancel your download"
+msgstr "다운로드를 멈추기"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "취소"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "멈춤"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "뒤로"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "앞으로"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "책갈피"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "다시ì½ê¸°"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "í™”ì¼ %s는 %së¡œ 부터"
+
+#~ msgid "Copy"
+#~ msgstr "복사"
+
+#~ msgid "Download link"
+#~ msgstr "ë§í¬ 다운로드"
+
+#~ msgid "Download image"
+#~ msgstr "ì´ë¯¸ì§€ 다운로드"
+
+#~ msgid "Edit"
+#~ msgstr "편집"
+
+#~ msgid "View"
+#~ msgstr "보기"
+
+#~ msgid "blank"
+#~ msgstr "빈화면"
diff --git a/po/kos.po b/po/kos.po
new file mode 100644
index 0000000..5d24ce3
--- /dev/null
+++ b/po/kos.po
@@ -0,0 +1,150 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2009-09-02 21:19-0400\n"
+"Last-Translator: Chris Leonard <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: kos\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Pootle 1.2.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Tui"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/mg.po b/po/mg.po
new file mode 100644
index 0000000..9c3f13d
--- /dev/null
+++ b/po/mg.po
@@ -0,0 +1,162 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2011-02-14 19:00+0200\n"
+"Last-Translator: Zafimamy Gabriella Ralaivao <gabriella@intnet.mu>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: mg\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "Tetezo"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "Manomboka ny fampidinana"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "Vita ny Fampidinana"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "Asehoy ny firaketana"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "Ok"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr "Avy amin'ny: %s"
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"Mampidina %s avy amin'ny \n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "Teo aloha"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Manaraka"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Esory"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr "Tazony ny rohy"
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr "Adikao ny rohy"
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "Araho ny rohy"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr "Tazony ny sary"
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr "Adikao ny sary"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Tomory lavitra"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Tomory akaiky"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Mameno efajery"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Asehoy ny tray"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Afeno ny tray"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "Mandroso ny fampidinana"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "Raha ajanona izao dia ho foana ny fampidinana ataonao"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "Aoka ihany"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Ajanony"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr "Pejy fandraisana"
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Miverina"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Mandroso"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr "Asio vakizoro"
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "Ataovy mariboky"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Avereno ampidirina"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#~ msgid "Copy"
+#~ msgstr "Adikao"
+
+#~ msgid "View"
+#~ msgstr "Jereo"
diff --git a/po/mi.po b/po/mi.po
new file mode 100644
index 0000000..e83884a
--- /dev/null
+++ b/po/mi.po
@@ -0,0 +1,149 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/mk.po b/po/mk.po
new file mode 100644
index 0000000..e7d34f1
--- /dev/null
+++ b/po/mk.po
@@ -0,0 +1,185 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# translation of web-activity.master.po to Macedonian
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Arangel Angov <arangel@linux.net.mk>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: web-activity.master\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2007-11-22 21:04+0000\n"
+"Last-Translator: Arangel Angov <arangel@slobodensoftver.org.mk>\n"
+"Language-Team: Macedonian <ossm-members@hedona.on.net.mk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.0.2\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "Разгледај"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "Преземањето започна"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "Преземањето заврши"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "Во ред"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"Преземам %s од \n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "ОтÑтрани"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "Преземањето е во тек"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "Ðко го прекинеш Ñега ќе го откажеш преземањето"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "Откажи"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Стоп"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Ðазад"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Ðапред"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "Обележувач"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "ОÑвежи"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#~ msgid "View"
+#~ msgstr "Поглед"
+
+#~ msgid "blank"
+#~ msgstr "празно"
+
+#~ msgid "Source"
+#~ msgstr "Изворен код"
+
+#~ msgid "Open"
+#~ msgstr "Отвори"
+
+#, python-format
+#~ msgid ""
+#~ "File %s downloaded from\n"
+#~ "%s."
+#~ msgstr ""
+#~ "Датотеката %s е преземена од\n"
+#~ "%s."
+
+#~ msgid ""
+#~ "Downloading %s from\n"
+#~ "%s. Progress %i%%."
+#~ msgstr ""
+#~ "Преземам %s од\n"
+#~ "%s. ÐŸÑ€Ð¾Ð³Ñ€ÐµÑ %i%%."
+
+#, python-format
+#~ msgid "Web Activity"
+#~ msgstr "ÐктивноÑти на веб"
diff --git a/po/ml.po b/po/ml.po
new file mode 100644
index 0000000..886a3b6
--- /dev/null
+++ b/po/ml.po
@@ -0,0 +1,149 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/mn.po b/po/mn.po
new file mode 100644
index 0000000..ca5b4d9
--- /dev/null
+++ b/po/mn.po
@@ -0,0 +1,194 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2010-10-08 13:19+0200\n"
+"Last-Translator: Bulgantamir Nerguin <ar_uul_us@yahoo.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: mn\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.3\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "ИнтÑрнÑÑ‚"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "Татаж ÑÑ…ÑллÑÑ"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "Татаж дууÑлаа"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "Журналд үзүүлÑÑ…"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "Тийм"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr "%s-ааÑ"
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"%s-Ñ %s нь татаж \n"
+" байна."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "Өмнөх"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Дараах"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "УÑтгах"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr "ХолбооÑыг ав"
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr "ХолбооÑыг хуулбарла"
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "Холбоог дагах"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr "Зургийг ав"
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr "Зургыг хуулбарла"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Холдуулах"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Ойртуулах"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "БүтÑц дÑлгÑц"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "ТуÑлах мөрийг харуулах"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "ТуÑлах мөрийг нуух"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "Татаж байна"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "Программ зогÑвол таталт зогÑоно"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "Болих"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "ЗогÑ"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Буцах"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Урагшлах"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr "Хавтан нÑмÑÑ…"
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "ХаÑгыг Ñ‚ÑмдÑглÑ"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Давтан ачаал"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "Ðийт %s-Ð°Ð°Ñ %s файл байна."
+
+#~ msgid "Copy"
+#~ msgstr "Хуулах"
+
+#~ msgid "Download link"
+#~ msgstr "Ð¥Ð¾Ð»Ð±Ð¾Ð¾Ñ Ñ‚Ð°Ñ‚Ð°Ñ…"
+
+#~ msgid "Download image"
+#~ msgstr "Зураг татах"
+
+#~ msgid "Edit"
+#~ msgstr "ЗаÑварлах"
+
+#~ msgid "View"
+#~ msgstr "Харагдац"
+
+#~ msgid "blank"
+#~ msgstr "хооÑон"
+
+#, python-format
+#~ msgid "Source"
+#~ msgstr "Эх Ò¯Ò¯ÑвÑÑ€"
diff --git a/po/mr.po b/po/mr.po
new file mode 100644
index 0000000..23e3d47
--- /dev/null
+++ b/po/mr.po
@@ -0,0 +1,175 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2010-03-27 08:27+0200\n"
+"Last-Translator: Chris <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: mr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.3\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "वेब भटकंती"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "डाउनलोड सà¥à¤°à¥‚ à¤à¤¾à¤²à¥€"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "डाउनलोड पूणॅ à¤à¤¾à¤²à¥€"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "नियतकालीकामधे दाखवा"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "ठीक"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"डाउनलोड %s पासून \n"
+" %s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "अगोदरचा"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "यानंतर"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "काढून टाकणे"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "लिंक वर जा"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "à¤à¥‚म आउट"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "à¤à¥‚म ईन"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "पूरà¥à¤£ पडदा"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "तबक दाखवा"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "तबक लपवा"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "डाऊनलोड सà¥à¤°à¥‚ आहे"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "थांबवलà¥à¤¯à¤¾à¤¸ डाऊनलोड रदॠहोईल"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "रदà¥à¤¦ करणे"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "थांबा"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "मागे"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "पà¥à¤¢à¥‡ पाठविणे"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "रिकामी जागा"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "पà¥à¤¨à¥à¤¹à¤¾ चालू करा"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "फाईल %s पासून %s"
+
+#~ msgid "Copy"
+#~ msgstr "नकà¥à¤•à¤² "
+
+#~ msgid "Edit"
+#~ msgstr "संपादन करणे"
+
+#~ msgid "View"
+#~ msgstr "पाहा "
+
+#~ msgid "blank"
+#~ msgstr "रिकामा"
+
+#~ msgid "Source"
+#~ msgstr "सà¥à¤¤à¥‹à¤¤à¥à¤°"
diff --git a/po/ms.po b/po/ms.po
new file mode 100644
index 0000000..e83884a
--- /dev/null
+++ b/po/ms.po
@@ -0,0 +1,149 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/mvo.po b/po/mvo.po
new file mode 100644
index 0000000..e83884a
--- /dev/null
+++ b/po/mvo.po
@@ -0,0 +1,149 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/nb.po b/po/nb.po
new file mode 100644
index 0000000..a90c52d
--- /dev/null
+++ b/po/nb.po
@@ -0,0 +1,169 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2009-09-02 01:41-0400\n"
+"Last-Translator: Chris Leonard <cjl@laptop.org>\n"
+"Language-Team: Norwegian <i18n-no@lister.ping.uio.no>\n"
+"Language: nb\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.2.1\n"
+
+#: activity/activity.info:2
+#, fuzzy
+msgid "Browse"
+msgstr "Surfe"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "Nedlasting startet"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "Nedlasting ferdig"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "Vis i dagbok"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"Laster %s fra\n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "Forrige"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Neste"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Fjern"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr "Kopier lenke"
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "Følg lenke"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr "Kopier Bilde"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Forminsk"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Forstørr"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Fullskjerm"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "Nedlasting underveis"
+
+#: webactivity.py:599
+#, fuzzy
+msgid "Stopping now will cancel your download"
+msgstr "Stopper du nå vil det avbryte nedlastingen din"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Stans"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Tilbake"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Framover"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "Bokmerke"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Last på nytt"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "Fil %s fra %s."
+
+#~ msgid "Copy"
+#~ msgstr "Kopier"
+
+#~ msgid "Edit"
+#~ msgstr "Endre"
+
+#~ msgid "View"
+#~ msgstr "Visning"
+
+#~ msgid "Source"
+#~ msgstr "Kildekode"
diff --git a/po/ne.po b/po/ne.po
new file mode 100644
index 0000000..d2a21e8
--- /dev/null
+++ b/po/ne.po
@@ -0,0 +1,181 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2011-02-09 11:27+0200\n"
+"Last-Translator: Shaswot <shaswot.kharel@olenepal.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: ne\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.3\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "खोज"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "डाउनलोड सà¥à¤°à¥ भयो"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "डाउनलोड सकियो"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "खातामा देखाऊ"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "हà¥à¤¨à¥à¤›"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr "From: %s"
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"%s डाउनलोड हà¥à¤à¤¦à¥ˆà¤› \n"
+" %s बाट।"
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "पहिलाको"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "अरà¥"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "हटाऊ"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr "लिङà¥à¤• राख"
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr "लिङà¥à¤•à¤•à¥‹ पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ बनाऊ"
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "लिङà¥à¤• खोलà¥à¤¨à¥‡"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr "छवि राख"
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr "तसà¥à¤µà¤¿à¤°à¤•à¥‹ पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ बनाऊ"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "सानो बनाऊ"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "ठूलो बनाऊ"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "पà¥à¤°à¥ˆ परà¥à¤¦à¤¾"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "टà¥à¤°à¥‡ देखाऊ"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "टà¥à¤°à¥‡ लà¥à¤•à¤¾à¤Š"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "डाउनलोड हà¥à¤¦à¥ˆ छ"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "अहिले रोकेमा डाउनलोड रदà¥à¤¦ हà¥à¤¨à¥‡ छ"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "रदà¥à¤¦ गर"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "बनà¥à¤¦ गर"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr "गृह पृषà¥à¤ "
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "पहिलाको पाना"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "अगाडीको पाना"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr "टà¥à¤¯à¤¾à¤¬ थप"
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "चिनो"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "फेरि सà¥à¤°à¥ गर"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "फाईल %s बाट %s।"
+
+#~ msgid "Copy"
+#~ msgstr "पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ बनाउने"
+
+#~ msgid "Download link"
+#~ msgstr "यो लिकठडाउनलोड गर"
+
+#~ msgid "Download image"
+#~ msgstr "यो फोटो डाउनलोड गर"
+
+#~ msgid "Edit"
+#~ msgstr "समà¥à¤ªà¤¾à¤¦à¤¨"
+
+#~ msgid "View"
+#~ msgstr "दृशà¥à¤¯"
+
+#~ msgid "blank"
+#~ msgstr "सादा"
+
+#~ msgid "Source"
+#~ msgstr "मà¥à¤²"
diff --git a/po/nl.po b/po/nl.po
new file mode 100644
index 0000000..9550ef2
--- /dev/null
+++ b/po/nl.po
@@ -0,0 +1,196 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2011-07-21 21:08+0200\n"
+"Last-Translator: Myckel Habets <myckel@sdf.lonestar.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: nl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "Surfen"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "Download gestart"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "Download voltooid"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "In dagboek weergeven"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "Ok"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr "Van: %s"
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"Downloaden %s van \n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "Vorige"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Volgende"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Verwijderen"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr "Koppeling bewaren"
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr "Koppeling kopiëren"
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "Koppeling volgen"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr "Afbeelding bewaren"
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr "Afbeelding kopiëren"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Zoom uit"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Zoom in"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Volledig scherm"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Toon lade"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Verberg lade"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "Bezig met downloaden"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "Door nu te stoppen wordt het downloaden afgebroken"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "Annuleren"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Stop"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr "Home page"
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Terug"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Vooruit"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr "Een tabblad toevoegen"
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "Bladwijzer"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Vernieuwen"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "Bestand %s van %s."
+
+#~ msgid "Copy"
+#~ msgstr "Kopiëren"
+
+#~ msgid "Download link"
+#~ msgstr "Koppeling opslaan"
+
+#~ msgid "Download image"
+#~ msgstr "Afbeelding opslaan"
+
+#~ msgid "Edit"
+#~ msgstr "Bewerken"
+
+#~ msgid "View"
+#~ msgstr "Beeld"
+
+#~ msgid "blank"
+#~ msgstr "blanco"
+
+#~ msgid "Source"
+#~ msgstr "Bron"
+
+#~ msgid "Open"
+#~ msgstr "Openen"
+
+#, python-format
+#~ msgid ""
+#~ "File %s downloaded from\n"
+#~ "%s."
+#~ msgstr ""
+#~ "Bestand %s downloaden van\n"
+#~ "%s."
diff --git a/po/pa.po b/po/pa.po
new file mode 100644
index 0000000..886a3b6
--- /dev/null
+++ b/po/pa.po
@@ -0,0 +1,149 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/pap.po b/po/pap.po
new file mode 100644
index 0000000..1786130
--- /dev/null
+++ b/po/pap.po
@@ -0,0 +1,175 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2010-02-25 00:17+0200\n"
+"Last-Translator: Urso Wieske <uwieske@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: pap\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "Nabegá"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "Download a kuminsá"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "Download kompletá"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "Mustra den e Zjurnal"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "Ok"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr "Di: %s"
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"Downloading %s di \n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "Anterior"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Siguiente"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Eliminá"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr "Mantené e lenk/link"
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr "Kopia lenk/link"
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "Sigui e link"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr "Mantené e imagen"
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr "Kopia e imagen"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Zoom out"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Zoom in"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Pantaya kompleto"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Mustra bandeha"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Skonde bandeha"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "Download den progreso"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "Stòp aworaki lo kansela bo download"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "Kanselá"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Stòp"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Bèk"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Avansá"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "Markadó"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Rekargá"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "File %s di %s."
+
+#~ msgid "Copy"
+#~ msgstr "Kopia"
+
+#~ msgid "Edit"
+#~ msgstr "Edita"
+
+#~ msgid "View"
+#~ msgstr "Mira"
+
+#~ msgid "blank"
+#~ msgstr "bashí"
+
+#~ msgid "Source"
+#~ msgstr "Fuente"
diff --git a/po/pis.po b/po/pis.po
new file mode 100644
index 0000000..e83884a
--- /dev/null
+++ b/po/pis.po
@@ -0,0 +1,149 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/pl.po b/po/pl.po
new file mode 100644
index 0000000..edb26f6
--- /dev/null
+++ b/po/pl.po
@@ -0,0 +1,186 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-05-27 00:31-0400\n"
+"PO-Revision-Date: 2011-06-11 11:11+0200\n"
+"Last-Translator: <jamarat@o2.pl>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2 webactivity.py:262
+msgid "Browse"
+msgstr "PrzeglÄ…daj"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "Pobieranie rozpoczęte"
+
+#: downloadmanager.py:175
+msgid "Download completed"
+msgstr "Pobieranie zakończone"
+
+#: downloadmanager.py:179
+msgid "Show in Journal"
+msgstr "Pokaż w dzienniku"
+
+#: downloadmanager.py:182
+msgid "Ok"
+msgstr "Ok"
+
+#: downloadmanager.py:189
+#, python-format
+msgid "From: %s"
+msgstr "Z: %s"
+
+#: downloadmanager.py:331
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"Pobieranie %s z \n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "Poprzedni"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Następny"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Usuń"
+
+#: palettes.py:143
+msgid "Keep link"
+msgstr "Zatrzymaj odnośnik"
+
+#: palettes.py:151
+msgid "Copy link"
+msgstr "Kopiuj odnośnik"
+
+#: palettes.py:159
+msgid "Follow link"
+msgstr "Idź za odnośnikiem"
+
+#: palettes.py:209
+msgid "Keep image"
+msgstr "Zatrzymaj obrazek"
+
+#: palettes.py:217
+msgid "Copy image"
+msgstr "Kopiuj obrazek"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Pomniejsz"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Powiększ"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Pełny ekran"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Pokaż zasobnik"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Ukryj zasobnik"
+
+#: webactivity.py:259
+msgid "Edit"
+msgstr "Edytuj"
+
+#: webactivity.py:265
+msgid "View"
+msgstr "Widok"
+
+#: webactivity.py:649
+msgid "Download in progress"
+msgstr "Pobieranie w trakcie"
+
+#: webactivity.py:650
+msgid "Stopping now will cancel your download"
+msgstr "Zatrzymanie spowoduje przerwanie pobierania."
+
+#: webactivity.py:652
+msgid "Cancel"
+msgstr "Anuluj"
+
+#: webactivity.py:654 webtoolbar.py:447
+msgid "Stop"
+msgstr "Zatrzymaj"
+
+#: webtoolbar.py:257
+msgid "Home page"
+msgstr "Strona domowa"
+
+#: webtoolbar.py:279
+msgid "Back"
+msgstr "Wstecz"
+
+#: webtoolbar.py:286
+msgid "Forward"
+msgstr "Dalej"
+
+#: webtoolbar.py:294
+msgid "Add a tab"
+msgstr "Dodaj zakładkę"
+
+#: webtoolbar.py:301
+msgid "Bookmark"
+msgstr "Zakładka"
+
+#: webtoolbar.py:450
+msgid "Reload"
+msgstr "Odśwież"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "Plik %s z %s."
+
+#~ msgid "blank"
+#~ msgstr "Pusty"
+
+#~ msgid "Source"
+#~ msgstr "Źródło"
+
+#~ msgid "Open"
+#~ msgstr "Otwórz"
+
+#, python-format
+#~ msgid ""
+#~ "File %s downloaded from\n"
+#~ "%s."
+#~ msgstr ""
+#~ "Plik %s pobrano z \n"
+#~ "%s."
diff --git a/po/ps.po b/po/ps.po
new file mode 100644
index 0000000..c7b101b
--- /dev/null
+++ b/po/ps.po
@@ -0,0 +1,184 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2009-07-01 03:59-0400\n"
+"Last-Translator: Abdulhadi Hairan <abdulhadi@paiwastoon.com.af>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: ps\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 1.2.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "لټول"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "رالÛÚšÙ„ پيل شول"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "رالÛÚšÙ„ بشپړل شول"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "په ورÚپاڼه ÙƒÛ ÚšÙˆØ¯Ù„"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "هو"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"رالÛÚšÙ„ %s له \n"
+"%s"
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "مخكنى"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "بل"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Ù„Ø±Û ÙƒÙˆÙ„"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "پیوند تعقیبول"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "لوكمول"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "لوډÛرول"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "بشپړه پرده"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "مجمه ښودل"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "مجمه پټول"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "رالÛÚšÙ„ د پرمختګ په حال ÙƒÛ Ø¯Ù‰"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "اوس تمول به Ø³ØªØ§Ø³Û Ø±Ø§Ù„ÛÚšÙ„ لغوه ÙƒÚ“ÙŠ"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "لغوه"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "بندول"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "شاته"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "مخته"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "یادنښه"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "بياپورته کول"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "دوتنه %s له %s څخه"
+
+#~ msgid "Copy"
+#~ msgstr "لمÛسل"
+
+#~ msgid "Download link"
+#~ msgstr "لینک کښته کړه"
+
+#~ msgid "Download image"
+#~ msgstr "انÚور کښته Ú©Ú“Ù‡"
+
+#~ msgid "Edit"
+#~ msgstr "سمون"
+
+#~ msgid "View"
+#~ msgstr "ليد"
+
+#~ msgid "blank"
+#~ msgstr "سپين"
+
+#~ msgid "Source"
+#~ msgstr "سرچينه"
+
+#~ msgid "Open"
+#~ msgstr "پرانستل"
diff --git a/po/pt.po b/po/pt.po
new file mode 100644
index 0000000..e537bc7
--- /dev/null
+++ b/po/pt.po
@@ -0,0 +1,211 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# Portuguese translations for PACKAGE package.
+# Copyright (C) 2007 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Tomeu <tomeu@tomeuvizoso.net>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2011-03-17 21:18+0200\n"
+"Last-Translator: <ttiagosousa@gmail.com>\n"
+"Language-Team: Portuguese <translation-team-pt@lists.sourceforge.net>\n"
+"Language: pt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "Navegar"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "A transferência iniciou"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "A transferência completou"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "Mostrar no diário"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "Ok"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr "De: %s"
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"Transferindo %s de \n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "Encontrar anterior"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Encontrar próximo"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Remover"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr "Guardar hiperligação"
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr "Copiar hiperligação"
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "Seguir hiperligação"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr "Guardar imagem"
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr "Copiar imagem"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Afastar Zoom"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Aproximar Zoom"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Ecrã completo"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Mostrar bandeja"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Esconder bandeja"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "Transferência em curso"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "Parar agora irá cancelar a tua transferência"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Parar"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr "Pagina Inicial"
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Voltar"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Avançar"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr "Adicionar Separador"
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "Marcar"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Recarregar"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "Ficheiro %s de %s"
+
+#~ msgid "Copy"
+#~ msgstr "Copiar"
+
+#~ msgid "Download link"
+#~ msgstr "Transferir hiperligação"
+
+#~ msgid "Download image"
+#~ msgstr "Transferir imagem"
+
+#~ msgid "Edit"
+#~ msgstr "Editar"
+
+#~ msgid "View"
+#~ msgstr "Ver"
+
+#~ msgid "blank"
+#~ msgstr "vazio"
+
+#~ msgid "Source"
+#~ msgstr "Código"
+
+#~ msgid "Open"
+#~ msgstr "Abrir"
+
+#, python-format
+#~ msgid ""
+#~ "File %s downloaded from\n"
+#~ "%s."
+#~ msgstr ""
+#~ "Ficheiro %s obtido de\n"
+#~ "%s."
+
+#~ msgid "Web Activity"
+#~ msgstr "Actividade Web"
+
+#~ msgid "Save"
+#~ msgstr "Guardar"
+
+#~ msgid "All supported formats"
+#~ msgstr "Tudos os formatos suportados"
+
+#~ msgid "Web pages"
+#~ msgstr "Páginas web"
+
+#~ msgid "Images"
+#~ msgstr "Imagens"
+
+#, python-format
+#~ msgid "All files"
+#~ msgstr "Tudos os ficheiros"
diff --git a/po/pt_BR.po b/po/pt_BR.po
new file mode 100644
index 0000000..04def3e
--- /dev/null
+++ b/po/pt_BR.po
@@ -0,0 +1,187 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# translation of pt_BR.po to Brazilian Portuguese
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Diego Búrigo Zacarão <diegobz@gmail.com>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: pt_BR\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2010-03-01 06:35+0200\n"
+"Last-Translator: Chris <cjl@laptop.org>\n"
+"Language-Team: Brazilian Portuguese <fedora-docs-br@redhat.com>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "Navegar"
+
+# "Download" is a term which generally it's not translated to Portuguese
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "Transferência iniciada"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "Transferência completada"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "Mostrar no Diário"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "Ok"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr "De: %s"
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"Fazendo a transferência de %s a partir de\n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "Anterior"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Próximo"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Remover"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr "Manter vínculo"
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr "Copiar vínculo"
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "Seguir vínculo"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr "Manter imagem"
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr "Copiar imagem"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Diminuir zoom"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Aumentar zoom"
+
+# Encher o ecrã?
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Tela cheia"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Mostrar Bandeja"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Esconder Bandeja"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "Transferência em progresso"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "Parar agora irá cancelar a sua transferência"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Parar"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Voltar"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Avançar"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+# Favorito?
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "Marcar"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Recarregar"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "Arquivo %s de %s"
+
+# para coincidir com o termo usado na Atividade Ler
+#~ msgid "View"
+#~ msgstr "Ver"
+
+#~ msgid "blank"
+#~ msgstr "em branco"
+
+#~ msgid "Source"
+#~ msgstr "Fonte"
+
+#~ msgid "Open"
+#~ msgstr "Abrir"
+
+#, python-format
+#~ msgid ""
+#~ "File %s downloaded from\n"
+#~ "%s."
+#~ msgstr ""
+#~ "Arquivo %s foi baixado de \n"
+#~ "%s."
+
+#~ msgid "Web Activity"
+#~ msgstr "Atividade Web"
diff --git a/po/qu.po b/po/qu.po
new file mode 100644
index 0000000..886a3b6
--- /dev/null
+++ b/po/qu.po
@@ -0,0 +1,149 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/ro.po b/po/ro.po
new file mode 100644
index 0000000..af6936c
--- /dev/null
+++ b/po/ro.po
@@ -0,0 +1,178 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2008-02-18 16:14-0500\n"
+"Last-Translator: Adi Roiban <adiroiban@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.0.2\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "Navighează"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "A început descărcarea"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "Descărcare terminată"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "Arată în Jurnal"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "Ok"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"Se descarcă %s de pe \n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Elimină"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Micşorează"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Măreşte"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Pe tot ecranul"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Arată zona de notificare"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Ascunde zona de notificare"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "Descărcare în curs"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "Oprirea acum va duce la anularea descărcării"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "Anulare"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Oprește"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "ÃŽnapoi"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "ÃŽnainte"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "Marcaj"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Reîncarcă"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "FiÅŸier %s de la %s."
+
+#~ msgid "View"
+#~ msgstr "Vizualizare"
+
+#~ msgid "blank"
+#~ msgstr "gol"
+
+#~ msgid "Source"
+#~ msgstr "Sursă"
+
+#~ msgid "Open"
+#~ msgstr "Deschide"
+
+#, python-format
+#~ msgid ""
+#~ "File %s downloaded from\n"
+#~ "%s."
+#~ msgstr ""
+#~ "Fișierul %s descărcat de pe\n"
+#~ "%s."
diff --git a/po/ru.po b/po/ru.po
new file mode 100644
index 0000000..f2f0be1
--- /dev/null
+++ b/po/ru.po
@@ -0,0 +1,190 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2009-03-02 02:50-0500\n"
+"Last-Translator: Aleksey Lim <alsroot@member.fsf.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.1.0rc2\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "Смотреть"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "Загрузка началаÑÑŒ"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "Загрузка завершена"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "Показать в журнале"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "Ok"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr "От: %s"
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"ЗагружаетÑÑ %s Ñ \n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "Предыдущий"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Следующий"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Удалить"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr "ОÑтавить ÑÑылку"
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr "Скопировать ÑÑылку"
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "Перейти по ÑÑылке"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr "ОÑтавить изображение"
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr "Скопировать изображение"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Уменьшить"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Увеличить"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Полный Ñкран"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Показать Ñ‚Ñ€Ñй"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Убрать Ñ‚Ñ€Ñй"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "Загрузка в процеÑÑе"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "Прекращение отменит ваши загрузки"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "Отменить"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "ОÑтановить"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Ðазад"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Вперед"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "Закладка"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Обновить"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "Файл %s из %s."
+
+#~ msgid "Copy"
+#~ msgstr "Копировать"
+
+#~ msgid "Download link"
+#~ msgstr "Загрузить ÑÑылку"
+
+#~ msgid "Download image"
+#~ msgstr "Загрузить изображение"
+
+#~ msgid "Edit"
+#~ msgstr "Редактировать"
+
+#~ msgid "View"
+#~ msgstr "ПроÑмотреть"
+
+#~ msgid "blank"
+#~ msgstr "пуÑто"
+
+#~ msgid "Source"
+#~ msgstr "ИÑходный код"
+
+#~ msgid "Open"
+#~ msgstr "Открыть"
+
+#, python-format
+#~ msgid ""
+#~ "File %s downloaded from\n"
+#~ "%s."
+#~ msgstr ""
+#~ "Файлe %s загружен Ñ\n"
+#~ "%s."
diff --git a/po/rw.po b/po/rw.po
new file mode 100644
index 0000000..c23d9f8
--- /dev/null
+++ b/po/rw.po
@@ -0,0 +1,173 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2008-07-31 12:25+0200\n"
+"Last-Translator: GASHAYIJA Guillaume <gashayija2002@yahoo.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "Shakisha"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "gushyira kuri mudasobwa biratangiye"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "gushyira kuri mudasobwa birarangiye"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "Erekana mu Kinyamakuru"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "Nibyo"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"Gushyira kuri mudasobwa %s kuva\n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "ibibanziriza"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Ibikurikira"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Kuraho"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "Kurikira Umurongo ufite aho ukugeza"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Uburyo bwo kugabanya ingano y`ibintu"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Uburyo bwo kongera ingano y`ibintu"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Ekara yose"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "erekana Tray"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Hisha Tray"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "gushyira kuri mudasobwa briho birakorwa"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "nubihagarika nonaha uratuma gushyira kuri mudasobwa bidakunda"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "Kuraho"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Hagarika"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Inyuma"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Imbere"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "Ububiko"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Kongera gushakisha"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "Ububiko %s Kuva %s."
+
+#~ msgid "Copy"
+#~ msgstr "Andukura"
+
+#~ msgid "Edit"
+#~ msgstr "Hindura"
+
+#~ msgid "View"
+#~ msgstr "Kureba"
+
+#~ msgid "blank"
+#~ msgstr "Ahatanditseho"
+
+#~ msgid "Source"
+#~ msgstr "Isooko"
diff --git a/po/sd.po b/po/sd.po
new file mode 100644
index 0000000..e83884a
--- /dev/null
+++ b/po/sd.po
@@ -0,0 +1,149 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/si.po b/po/si.po
new file mode 100644
index 0000000..8a16e9e
--- /dev/null
+++ b/po/si.po
@@ -0,0 +1,181 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2009-07-04 06:59-0400\n"
+"Last-Translator: Waruna Perera <warunakanishka@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: si\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 1.2.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "à·ƒà·à¶»à·’සරන්න"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "භà·à¶œà¶­à·€à·“ම ආරම්භ විය"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "භà·à¶œà¶­à·€à·“ම ආරම්භ විය"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "ජර්නලයේ පෙන්වන්න "
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "හරි"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"භà·à¶œà¶­à·€à·™à¶¸à¶±à·Š පවතී: %s සිට \n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "පෙර"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "ඊලඟ"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "ඉවත් කරන්න"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "සබà·à¶³à·’ය ලුහුබඳින්න"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "කුඩ෠කරන්න"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "විà·à·à¶½ කරන්න"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "මුලු තිරයම"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "බන්දේසිය පෙන්වන්න"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "බන්දේසිය සඟවන්න"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "බà·à¶œà¶­ වෙමින් පවතී"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "නà·à·€à·à¶­à·Šà·€à·“ම මගින් ඔබේ බà·à¶œà¶­à·€à·“ම අවලංගුවේ"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "අවලංගු කරන්න"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "නවත්වන්න"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "පසුපසට"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "ඉදිරියට"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "පොත් සලකුණක් යොදන්න"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "යළි ලබà·à¶œà¶±à·Šà¶±"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "%s සිට %s ගොනු."
+
+#~ msgid "Copy"
+#~ msgstr "පිටපත් කරන්න"
+
+#~ msgid "Download link"
+#~ msgstr "බà·à¶œà¶­ කිරිමේ සබà·à¶³à·“ය"
+
+#~ msgid "Download image"
+#~ msgstr "පින්තූරය බà·à¶œà¶­ කරන්න"
+
+#~ msgid "Edit"
+#~ msgstr "සකසන්න"
+
+#~ msgid "View"
+#~ msgstr "දර්à·à¶±à¶º කරන්න"
+
+#~ msgid "blank"
+#~ msgstr "හිස්"
+
+#~ msgid "Source"
+#~ msgstr "මූලà·à·à·Šâ€à¶»à¶º"
diff --git a/po/sk.po b/po/sk.po
new file mode 100644
index 0000000..d3c825d
--- /dev/null
+++ b/po/sk.po
@@ -0,0 +1,160 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2009-08-25 15:51-0400\n"
+"Last-Translator: Chris Leonard <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: sk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2 ;\n"
+"X-Generator: Pootle 1.2.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "Prezerať"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "Zdroj"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "SÅ¥ahovanie dokonÄené"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "Zobraziť v denníku"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "Ok"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"SÅ¥ahujem %s z \n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "Predchádzajúci"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Ďaľší"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Odobrať"
+
+#: palettes.py:142
+#, fuzzy
+msgid "Keep link"
+msgstr "Udržať na link"
+
+#: palettes.py:150
+#, fuzzy
+msgid "Copy link"
+msgstr "Kopírovať na link"
+
+#: palettes.py:158
+#, fuzzy
+msgid "Follow link"
+msgstr "Prejsť na link"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Oddialiť"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Priblížiť"
+
+#: viewtoolbar.py:51
+#, fuzzy
+msgid "Fullscreen"
+msgstr "Na celú obrazovku"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Zobraziť lištu"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Skryť lištu"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "Prebieha sťahovanie"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "Zastavenie sťahovania ho môže úplne zrušiť"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "Zrušiť"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Zastaviť"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Späť"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Dopredu"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "Záložka"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Znovu naÄítaÅ¥"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
diff --git a/po/sl.po b/po/sl.po
new file mode 100644
index 0000000..60a6764
--- /dev/null
+++ b/po/sl.po
@@ -0,0 +1,182 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2010-02-07 04:58+0200\n"
+"Last-Translator: Chris <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: sl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || "
+"n%100==4 ? 2 : 3);\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "Prebrskaj"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "Prenos zaÄet"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "Prenos konÄan"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "Pokaži v dnevniku"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "V redu"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"Prenašam %s z \n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "Prejšnji"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Naslednji"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Odstrani"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "Sledi povezavi"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Oddalji"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Približaj"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Celozaslonsko"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Prikaži opravilno vrstico"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Skrij opravilno vrstico"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "Prenos v teku"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "Če ustaviš zdaj, bo prenos prekinjen"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "PrekliÄi"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Ustavi"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Nazaj"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Naprej"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "Zaznamek"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Ponovno naloži"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "Datoteka %s od %s."
+
+#~ msgid "Copy"
+#~ msgstr "Kopiraj"
+
+#~ msgid "Download link"
+#~ msgstr "Prenesi vsebino povezave"
+
+#~ msgid "Download image"
+#~ msgstr "Prenesi sliko"
+
+#~ msgid "Edit"
+#~ msgstr "Urejanje"
+
+#~ msgid "View"
+#~ msgstr "Pogled"
+
+#~ msgid "blank"
+#~ msgstr "prazno"
+
+#~ msgid "Source"
+#~ msgstr "Izvor"
diff --git a/po/sq.po b/po/sq.po
new file mode 100644
index 0000000..6243ac3
--- /dev/null
+++ b/po/sq.po
@@ -0,0 +1,168 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2010-01-21 20:04+0200\n"
+"Last-Translator: jon <joni-ber_rock@hotmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: sq\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "Shfleto"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "Shkarkimi ka filluar"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "Shkarkimi ka përfunduar"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "Trego në Ditar"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "Në Rregull"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr "Prej: %s"
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"Duke shkarkuar %s nga \n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "I Mëparshmi"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Tjetra"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Fshi"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr "Mbani lidhjen"
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr "Kopjo lidhjen"
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "Ndiq lidhjen"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr "Mbaje figurën"
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr "Kopjo figurën"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Zvoglo"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Zmadho"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Ekran të plot"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Shfaqe shportën"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Fsheh shportën"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "Shkarkimi në progres"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "Nëse e ndalni tani shkarkimi do të anulohet"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "Anulo"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Ndal"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Prapa"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Përpara"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "Shëno faqen"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Ringarko"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#~ msgid "Copy"
+#~ msgstr "Kopjo"
+
+#~ msgid "Download image"
+#~ msgstr "Shkarko imazhin"
+
+#~ msgid "Edit"
+#~ msgstr "Edito"
+
+#~ msgid "View"
+#~ msgstr "Shiko"
diff --git a/po/sv.po b/po/sv.po
new file mode 100644
index 0000000..2e5210f
--- /dev/null
+++ b/po/sv.po
@@ -0,0 +1,179 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2011-02-26 19:51+0200\n"
+"Last-Translator: Chris <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "Surfa"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "Nedladdning startad"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "Klar med nedladdningen"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "Visa i Dagboken"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "Ok"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr "Från: %s"
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr "Laddar ned %s från%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "Föregående"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Nästa"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Ta bort"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr "Spara länk"
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr "Kopiera länkadress"
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "Öppna länk"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr "Spara bild"
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr "Kopiera bild"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Zooma ut"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Zoom in"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Helskärm"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Visa list"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Dölj list"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "Håller på och laddar ned"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "Avslutar du nu kommer nedladdnignen att avbrytas"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Avbryt"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr "Hemsida"
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Tillbaka"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Framåt"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "Lägg till som bokmärke"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Läs om"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "Fil %s av %s."
+
+#~ msgid "Copy"
+#~ msgstr "Kopiera"
+
+#~ msgid "Download link"
+#~ msgstr "Ladda ned länk"
+
+#~ msgid "Download image"
+#~ msgstr "Ladda ned bild"
+
+#~ msgid "Edit"
+#~ msgstr "Redigera"
+
+#~ msgid "View"
+#~ msgstr "Visa"
+
+#~ msgid "blank"
+#~ msgstr "blank"
+
+#~ msgid "Source"
+#~ msgstr "Källkod"
diff --git a/po/sw.po b/po/sw.po
new file mode 100644
index 0000000..b302e01
--- /dev/null
+++ b/po/sw.po
@@ -0,0 +1,157 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2011-03-20 05:18+0200\n"
+"Last-Translator: Chris <cjl@laptop.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: sw\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "Sawa"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Acha"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#~ msgid "Source"
+#~ msgstr "Chanzo"
diff --git a/po/ta.po b/po/ta.po
new file mode 100644
index 0000000..4dc5ae1
--- /dev/null
+++ b/po/ta.po
@@ -0,0 +1,178 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2011-05-27 19:46+0200\n"
+"Last-Translator: Thangamani <thangam.arunx@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: ta\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "உவாவà¯"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "பதிவிறகà¯à®•à®®à¯ ஆரமà¯à®ªà®®à¯"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "பதிவிறகà¯à®•à®®à¯ à®®à¯à®Ÿà®¿à®µà¯à®µà®Ÿà¯ˆà®¨à¯à®¤à®¤à¯"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "சஞà¯à®šà®¿à®•à¯ˆà®¯à®¿à®²à¯ காடà¯à®Ÿà¯à®•"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "சரி"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr "%s இரà¯à®¨à¯à®¤à¯"
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"%sதà¯à®¤à®¿à®²à¯ இரà¯à®¨à¯à®¤à¯ பதிவிறகà¯à®•à®ªà¯à®ªà®Ÿà¯à®•à®¿à®±à®¤à¯\n"
+"%sகளà¯."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "à®®à¯à®©à¯à®©à¯ˆà®¯"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "அடà¯à®¤à¯à®¤à®¤à¯"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "அகறà¯à®±à¯"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr "இணைபà¯à®ªà¯ˆ வைதà¯à®¤à®¿à®°à¯"
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr "இணைபà¯à®ªà¯ˆ பிரதி செயà¯"
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "இணைபà¯à®ªà¯ˆ தொடரà¯à®•"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr "படதà¯à®¤à¯ˆ வைதà¯à®¤à®¿à®°à¯ "
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr "படதà¯à®¤à¯ˆà®ªà¯ பிரதி செயà¯"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "சிறிதாகà¯à®•à¯"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "பெரிதாகà¯à®•à¯"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "à®®à¯à®´à¯à®¤à¯à®¤à®¿à®°à¯ˆ"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "தடà¯à®Ÿà¯ˆà®•à¯ காடà¯à®Ÿà¯"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "தடà¯à®Ÿà¯ˆ மறை"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "பதிவிறகà¯à®•à®®à¯ நடைபெறà¯à®•à®¿à®±à®¤à¯"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "உஙà¯à®•à®³à¯à®ªà®¤à®¿à®µà®¿à®±à®•à¯à®•à®¤à¯à®¤à®¿à®©à¯ˆ நிறà¯à®¤à¯à®¤à®¿ இரதà¯à®¤à¯à®šà¯†à®¯à¯à®•"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "இரதà¯à®¤à¯à®šà¯†à®¯à¯à®•"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "நிறà¯à®¤à¯à®¤à¯à®•"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr "à®®à¯à®¤à®±à¯à®ªà®•à¯à®•à®®à¯"
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "பினà¯"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "à®®à¯à®©à¯à®©à¯‡à®±à¯"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr "ஒர௠படà¯à®Ÿà¯ˆà®¯à¯ˆ சேரà¯"
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "பà¯à®¤à¯à®¤à®•à®…டையாளமà¯"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "மீள௠à®à®±à¯à®±à¯"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "கோவை"
+
+#~ msgid "Copy"
+#~ msgstr "பிரதி"
+
+#~ msgid "Download link"
+#~ msgstr "இணைபà¯à®ªà¯ பதிவிறகà¯à®•à®®à¯"
+
+#~ msgid "Download image"
+#~ msgstr "படம௠பதிவிறகà¯à®•à®®à¯"
+
+#~ msgid "Edit"
+#~ msgstr "திரà¯à®¤à¯à®¤à¯"
+
+#~ msgid "View"
+#~ msgstr "நோகà¯à®•à¯"
+
+#~ msgid "blank"
+#~ msgstr "இடைவெளி"
diff --git a/po/te.po b/po/te.po
new file mode 100644
index 0000000..1844002
--- /dev/null
+++ b/po/te.po
@@ -0,0 +1,173 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2008-07-24 13:49+0100\n"
+"Last-Translator: Satyanarayana Murthy Saladi <saladism@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.0.2\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "వెబౠచూడà±"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "దిగà±à°®à°¤à°¿ మొదలయింది"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "దిగà±à°®à°¤à°¿ పూరà±à°¤à°¯à°¿à°‚ది"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "పదà±à°¦à±à°²à±‹ చూపà±"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "సరి"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr " %s :à°¨à±à°‚à°¡à°¿ "
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"%s à°¨à±à°‚à°¡à°¿ దిగà±à°®à°¤à°¿ à°…à°µà±à°¤à±à°‚ది\n"
+" %s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "à°®à±à°‚à°¦à±à°¦à°¿"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "తరà±à°µà°¾à°¤à°¦à°¿"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "తీసివేయి"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr "జోడింపà±à°¨à± ఉంచà±"
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr "జోడింపà±à°¨à± నకలౠతీయౠ"
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "జోడికనౠతెరà±à°µà±à°®à±"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr "à°ªà±à°°à°¤à°¿à°°à±‚పానà±à°¨à°¿ ఉంచౠ"
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr "à°ªà±à°°à°¤à°¿ రూపానà±à°¨à°¿ నకలౠతీయౠ"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "దూరంగా చూపà±"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "దగà±à°—à°°à°—à°¾ చూపà±"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "తెరనిండà±à°—à°¾"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "à°Ÿà±à°°à±‡ చూపà±"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "à°Ÿà±à°°à±‡ దాచివేయి"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "దిగà±à°®à°¤à°¿ జరà±à°—à±à°¤à±à°‚ది"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "ఇపà±à°ªà±à°¡à± ఆపితే మీ దిగà±à°®à°¤à°¿ à°°à°¦à±à°¦à°µà±à°¤à±à°‚ది"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "à°°à°¦à±à°¦à±à°šà±‡à°¯à°¿"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "ఆపà±"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "వెనà±à°•à°•à±"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "à°®à±à°‚à°¦à±à°•à±"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "à°—à±à°°à±à°¤à±"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "తిరిగి లోడౠచేయి"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "ఫైలౠ%s à°¨à±à°‚à°¡à°¿ %s."
+
+#~ msgid "Copy"
+#~ msgstr "నకలà±"
+
+#~ msgid "Edit"
+#~ msgstr "కూరà±à°šà±"
+
+#~ msgid "View"
+#~ msgstr "చూడà±"
+
+#~ msgid "blank"
+#~ msgstr "ఖాళీ"
+
+#~ msgid "Source"
+#~ msgstr "మూలం"
diff --git a/po/th.po b/po/th.po
new file mode 100644
index 0000000..ffc3080
--- /dev/null
+++ b/po/th.po
@@ -0,0 +1,175 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2007-12-10 04:43+0000\n"
+"Last-Translator: Manatsawin <manatsawin@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.0.2\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "เรียà¸à¸”ู"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "เริ่มà¸à¸²à¸£à¸”าวน์โหลด"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "ดาวน์โหลดเสร็จสิ้นà¹à¸¥à¹‰à¸§"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "ตà¸à¸¥à¸‡"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"à¸à¸³à¸¥à¸±à¸‡à¸”าวน์โหลด %s จาà¸\n"
+"%s"
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "ลบ"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "à¸à¸³à¸¥à¸±à¸‡à¸”าวน์โหลด"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "หาà¸à¸«à¸¢à¸¸à¸”ตอนนี้จะเป็นà¸à¸²à¸£à¸¢à¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸”าวน์โหลด"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "ยà¸à¹€à¸¥à¸´à¸"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "หยุด"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "ย้อนà¸à¸¥à¸±à¸š"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "ไปข้างหน้า"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "ที่คั่นหน้า"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "เรียà¸à¹ƒà¸«à¸¡à¹ˆ"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+# มุมมอง หรือ ดู ไม่à¹à¸™à¹ˆà¹ƒà¸ˆà¸„รับ
+#~ msgid "View"
+#~ msgstr "มุมมอง"
+
+#~ msgid "blank"
+#~ msgstr "ว่างเปล่า"
+
+#~ msgid "Source"
+#~ msgstr "ซอร์ส"
+
+#~ msgid "Open"
+#~ msgstr "เปิด"
+
+#, python-format
+#~ msgid ""
+#~ "File %s downloaded from\n"
+#~ "%s."
+#~ msgstr ""
+#~ "ไฟล์ %s ดาวน์โหลดมาจาà¸\n"
+#~ "%s"
diff --git a/po/tpi.po b/po/tpi.po
new file mode 100644
index 0000000..e83884a
--- /dev/null
+++ b/po/tpi.po
@@ -0,0 +1,149 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/tr.po b/po/tr.po
new file mode 100644
index 0000000..0cbadf2
--- /dev/null
+++ b/po/tr.po
@@ -0,0 +1,177 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2008-10-21 07:28-0400\n"
+"Last-Translator: abdullah kocabas <abdullah.kocabas@abcdizustu.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.1.0rc2\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "göz atmak"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "indirme başlamıştır."
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "indirme tamamlanmıştır."
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "makalede gösteriniz."
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "tamam"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr "%s %s'ten yükleniyor."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "önceki"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "ileri"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "kaldırınız."
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "bağlantıyı takip ediniz."
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "uzaklaştırınız."
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "yakınlaştırınız."
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "tam ekran"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "tablayı gösteriniz."
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "tablayı gizleyiniz."
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "indirme ilerliyor."
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "şimdi durmak yüklemenizi iptal eder."
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "iptal ediniz."
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "durunuz."
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "geri"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "ilerletiniz."
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "sayfa iÅŸareti"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "yeniden yükleyiniz."
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "%s'den %s dosyası"
+
+#~ msgid "Copy"
+#~ msgstr "kopya"
+
+#~ msgid "Download link"
+#~ msgstr "bağlantıyı yükleyiniz"
+
+#~ msgid "Download image"
+#~ msgstr "görüntüyü yükleyiniz"
+
+#~ msgid "Edit"
+#~ msgstr "düzenleyiniz."
+
+#~ msgid "View"
+#~ msgstr "görünüm"
+
+#~ msgid "blank"
+#~ msgstr "boÅŸluk"
+
+#~ msgid "Source"
+#~ msgstr "kaynak"
diff --git a/po/tvl.po b/po/tvl.po
new file mode 100644
index 0000000..0d31b41
--- /dev/null
+++ b/po/tvl.po
@@ -0,0 +1,149 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.3.0\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/tzo.po b/po/tzo.po
new file mode 100644
index 0000000..0d31b41
--- /dev/null
+++ b/po/tzo.po
@@ -0,0 +1,149 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.3.0\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/ug.po b/po/ug.po
new file mode 100644
index 0000000..e83884a
--- /dev/null
+++ b/po/ug.po
@@ -0,0 +1,149 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/ur.po b/po/ur.po
new file mode 100644
index 0000000..fe7249a
--- /dev/null
+++ b/po/ur.po
@@ -0,0 +1,182 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2008-07-28 06:43-0400\n"
+"Last-Translator: salman minhas <sulmanminhas@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.1.0rc2\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "براؤز"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "ڈاؤن لوڈ شروع ÛÙˆ گیا"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "ڈاؤن لوڈ ÛÙˆ گيا ÛÛ’"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "Ø±ÙˆØ²Ù†Ø§Ù…Ú†Û Ù…ÙŠÚº دکھائيں"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "اوکے"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr " ڈاؤن لوڈ کر رÛا ÛÛ’ %s ÙˆÛاں سے /n%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "پچھلا"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Ø¢Ú¯Û’"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Ûٹائیں"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "لنک پر جائيں"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "بڑا کريں"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "چھوٹا کريں"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "پوری سکرین"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "ٹرے دکھائیں"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "ٹرے چھپائیں"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "ڈاؤن لوڈ ÛÙˆ رÛا ÛÛ’"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "ابھی روکنے سے آپ کا ڈاؤن لوڈ ختم ÛÙˆ جائے گا"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "منسوخ کريں"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "روکیں"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "واپس"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Ø¢Ú¯Û’"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "نشانی"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "پھر لوڈ کریں"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "Ùائل %s اس سے %s."
+
+#~ msgid "Copy"
+#~ msgstr "کاپی"
+
+#~ msgid "Edit"
+#~ msgstr "تبديل کريں"
+
+#~ msgid "View"
+#~ msgstr "نظارÛ"
+
+#~ msgid "blank"
+#~ msgstr "خالی"
+
+#~ msgid "Source"
+#~ msgstr "ذريعÛ"
+
+#~ msgid "Open"
+#~ msgstr "کهولیں"
+
+#, python-format
+#~ msgid ""
+#~ "File %s downloaded from\n"
+#~ "%s."
+#~ msgstr ""
+#~ "مسل %s ڈاؤن لوڈ Ûوئی از \n"
+#~ "%sÛ”"
diff --git a/po/vi.po b/po/vi.po
new file mode 100644
index 0000000..96236f2
--- /dev/null
+++ b/po/vi.po
@@ -0,0 +1,181 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2009-09-25 08:22-0400\n"
+"Last-Translator: Clytie Siddall <clytie@riverland.net.au>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: vi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Pootle 1.2.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "Duyệt"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "Äã bắt đầu tải vá»"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "Äã kết thúc tải vá»"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "Hiện trong Nhật ký"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "OK"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr "Từ : %s"
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"Äang tải %s xuống \n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "Lùi"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "Tiếp"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "Bá»"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr "Giữ liên kết"
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr "Chép liên kết"
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "Theo liên kết"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr "Giữ ảnh"
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr "Chép ảnh"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "Thu nhá»"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "Phóng to"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "Toàn màn hình"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "Hiện khay"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "Ẩn khay"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "Äang tải vá»"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "Dừng ngay bây giá» thì cÅ©ng thôi tải vá»"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "Thôi"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "Dừng"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "Lùi"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "Tiếp"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "Liên kết lưu"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "Nạp lại"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "Tập tin %s từ %s."
+
+#~ msgid "Copy"
+#~ msgstr "Chép"
+
+#~ msgid "Download link"
+#~ msgstr "Tải vỠliên kết"
+
+#~ msgid "Download image"
+#~ msgstr "Tải vỠảnh"
+
+#~ msgid "Edit"
+#~ msgstr "Sá»­a"
+
+#~ msgid "View"
+#~ msgstr "Xem"
+
+#~ msgid "blank"
+#~ msgstr "trắng"
+
+#~ msgid "Source"
+#~ msgstr "Nguồn"
diff --git a/po/wa.po b/po/wa.po
new file mode 100644
index 0000000..e83884a
--- /dev/null
+++ b/po/wa.po
@@ -0,0 +1,149 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.1.1rc4\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/yo.po b/po/yo.po
new file mode 100644
index 0000000..886a3b6
--- /dev/null
+++ b/po/yo.po
@@ -0,0 +1,149 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 1.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr ""
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr ""
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr ""
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr ""
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr ""
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr ""
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr ""
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr ""
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr ""
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr ""
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr ""
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr ""
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr ""
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr ""
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr ""
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr ""
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr ""
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr ""
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr ""
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr ""
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr ""
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr ""
diff --git a/po/zh_CN.po b/po/zh_CN.po
new file mode 100644
index 0000000..676cb76
--- /dev/null
+++ b/po/zh_CN.po
@@ -0,0 +1,185 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: OLPC Web Activity\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2008-11-25 05:07-0500\n"
+"Last-Translator: Alice Zhang <zhl924505@gmail.com>\n"
+"Language-Team: Yuan CHAO <yuanchao@gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.1.0rc2\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "æµè§ˆ"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "开始下载"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "下载完æˆ"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "在日志中显示"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "确定"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr ""
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"下载 %s 自\n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "上一个"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "下一个"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "删除"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr ""
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr ""
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "è·Ÿéšé“¾æŽ¥"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr ""
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr ""
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "缩å°"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "放大"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "å…¨å±æ˜¾ç¤º"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "显示系统托盘"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "éšè—系统托盘"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "下载中"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "åœæ­¢æœ¬æ´»åŠ¨å°†å–消下载中文件"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "å–消"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "åœæ­¢"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr ""
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "上一页"
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "下一页"
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr ""
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "书签"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "刷新"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "文件 %s 自 %s."
+
+#~ msgid "Copy"
+#~ msgstr "å¤åˆ¶"
+
+#~ msgid "Download link"
+#~ msgstr "下载链接"
+
+#~ msgid "Download image"
+#~ msgstr "下载图片"
+
+#~ msgid "Edit"
+#~ msgstr "编辑"
+
+#~ msgid "View"
+#~ msgstr "查看"
+
+#~ msgid "blank"
+#~ msgstr "空白"
+
+#~ msgid "Source"
+#~ msgstr "æºç "
+
+#~ msgid "Open"
+#~ msgstr "打开"
+
+#~ msgid ""
+#~ "File %s downloaded from\n"
+#~ "%s."
+#~ msgstr ""
+#~ "文件 %s 下载自\n"
+#~ "%s."
diff --git a/po/zh_TW.po b/po/zh_TW.po
new file mode 100644
index 0000000..adb50e0
--- /dev/null
+++ b/po/zh_TW.po
@@ -0,0 +1,188 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: OLPC Web Activity\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-10-23 00:31-0400\n"
+"PO-Revision-Date: 2011-05-22 17:52+0200\n"
+"Last-Translator: Chen, Kenzen <fallwind@seed.net.tw>\n"
+"Language-Team: Yuan CHAO <yuanchao@gmail.com>\n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: activity/activity.info:2
+msgid "Browse"
+msgstr "ç€è¦½"
+
+#: downloadmanager.py:160
+msgid "Download started"
+msgstr "開始下載"
+
+#: downloadmanager.py:173
+msgid "Download completed"
+msgstr "下載完æˆ"
+
+#: downloadmanager.py:177
+msgid "Show in Journal"
+msgstr "增加到日誌"
+
+#: downloadmanager.py:180
+msgid "Ok"
+msgstr "確定"
+
+#: downloadmanager.py:187
+#, python-format
+msgid "From: %s"
+msgstr "自:%s"
+
+#: downloadmanager.py:316
+#, python-format
+msgid ""
+"Downloading %s from \n"
+"%s."
+msgstr ""
+"下載 %s 自\n"
+"%s."
+
+#: edittoolbar.py:92
+msgid "Previous"
+msgstr "上一個"
+
+#: edittoolbar.py:99
+msgid "Next"
+msgstr "下一個"
+
+#: linkbutton.py:95
+msgid "Remove"
+msgstr "移除"
+
+#: palettes.py:142
+msgid "Keep link"
+msgstr "ä¿å­˜é€£çµ"
+
+#: palettes.py:150
+msgid "Copy link"
+msgstr "複製連çµ"
+
+#: palettes.py:158
+msgid "Follow link"
+msgstr "跟隨連çµ"
+
+#: palettes.py:208
+msgid "Keep image"
+msgstr "ä¿å­˜åœ–片"
+
+#: palettes.py:216
+msgid "Copy image"
+msgstr "複製圖片"
+
+#: viewtoolbar.py:34
+msgid "Zoom out"
+msgstr "縮å°"
+
+#: viewtoolbar.py:40
+msgid "Zoom in"
+msgstr "放大"
+
+#: viewtoolbar.py:51
+msgid "Fullscreen"
+msgstr "全螢幕"
+
+#: viewtoolbar.py:89
+msgid "Show Tray"
+msgstr "顯示收è—匣"
+
+#: viewtoolbar.py:93
+msgid "Hide Tray"
+msgstr "éš±è—收è—匣"
+
+#: webactivity.py:598
+msgid "Download in progress"
+msgstr "下載中"
+
+#: webactivity.py:599
+msgid "Stopping now will cancel your download"
+msgstr "åœæ­¢æœ¬æ´»å‹•å°‡å–消下載中檔案"
+
+#: webactivity.py:601
+msgid "Cancel"
+msgstr "å–消"
+
+#: webactivity.py:603 webtoolbar.py:437
+msgid "Stop"
+msgstr "åœæ­¢"
+
+#: webtoolbar.py:247
+msgid "Home page"
+msgstr "首é "
+
+#: webtoolbar.py:269
+msgid "Back"
+msgstr "上一é "
+
+#: webtoolbar.py:276
+msgid "Forward"
+msgstr "下一é "
+
+#: webtoolbar.py:284
+msgid "Add a tab"
+msgstr "增加標籤"
+
+#: webtoolbar.py:291
+msgid "Bookmark"
+msgstr "加入書籤"
+
+#: webtoolbar.py:440
+msgid "Reload"
+msgstr "é‡æ–°æ•´ç†"
+
+#, python-format
+#~ msgid "%s"
+#~ msgstr "%s"
+
+#, python-format
+#~ msgid "File %s from %s."
+#~ msgstr "檔案 %s 來自 %s."
+
+#~ msgid "Copy"
+#~ msgstr "複製"
+
+#~ msgid "Download link"
+#~ msgstr "下載連çµç‰©ä»¶"
+
+#~ msgid "Download image"
+#~ msgstr "下載圖片"
+
+#~ msgid "Edit"
+#~ msgstr "編輯"
+
+#~ msgid "View"
+#~ msgstr "檢視"
+
+#~ msgid "blank"
+#~ msgstr "空白"
+
+#~ msgid "Source"
+#~ msgstr "原始碼"
+
+#~ msgid "Open"
+#~ msgstr "é–‹å•Ÿ"
+
+#, python-format
+#~ msgid ""
+#~ "File %s downloaded from\n"
+#~ "%s."
+#~ msgstr ""
+#~ "檔案 %s 下載自\n"
+#~ "%s."
diff --git a/pylru.py b/pylru.py
new file mode 100644
index 0000000..83e78ff
--- /dev/null
+++ b/pylru.py
@@ -0,0 +1,368 @@
+
+
+# Cache implementaion with a Least Recently Used (LRU) replacement policy and a
+# basic dictionary interface.
+
+# Copyright (C) 2006, 2009, 2010 Jay Hutchinson
+
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc., 51
+# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+
+
+# The cache is implemented using a combination of a hash table (python
+# dictionary) and a circular doubly linked list. Objects in the cache are
+# stored in nodes. These nodes make up the linked list. The list is used to
+# efficiently maintain the order that the objects have been used in. The front
+# or "head" of the list contains the most recently used object, the "tail" of
+# the list contains the least recently used object. When an object is "used" it
+# can easily (in a constant amount of time) be moved to the front of the list,
+# thus updating its position in the ordering. These nodes are also placed in
+# the hash table under their associated key. The hash table allows efficient
+# lookup of objects by key.
+
+# The doubly linked list is composed of nodes. Each
+# node has a 'prev' and 'next' variable to hold the node that comes before
+# it and after it respectivly. Initially the two variables each point to
+# the node itself, creating a circular doubly linked list of size one. Each
+# node has a 'obj' and 'key' variable, holding the object and the key it is
+# stored under respectivly.
+class _dlnode(object):
+ def __init__(self):
+ self.key = None
+
+
+class lrucache(object):
+
+ def __init__(self, size, callback=None):
+
+ self.callback = callback
+ # Initialize the hash table as empty.
+ self.table = {}
+
+
+ # Initalize the list with 'size' empty nodes. Create the first node and
+ # assign it to the 'head' variable, which represents the head node in the
+ # list. Then each iteration of the loop creates a subsequent node and
+ # inserts it directly after the head node.
+ self.head = _dlnode()
+ self.head.next = self.head
+ self.head.prev = self.head
+
+ self.listSize = 1
+
+ # Adjust the size
+ self.size(size)
+
+
+ def __len__(self):
+ return len(self.table)
+
+ # Does not call callback to write any changes!
+ def clear(self):
+ self.table.clear()
+
+ node = self.head
+ for i in range(self.listSize):
+ node.key = None
+ node.obj = None
+ node = node.next
+
+
+ def __contains__(self, key):
+ return key in self.table
+ # XXX Should this move the object to front of list? XXX
+
+ def peek(self, key):
+ # Look up the node
+ node = self.table[key]
+ return node.obj
+
+ def __getitem__(self, key):
+
+ # Look up the node
+ node = self.table[key]
+
+ # Update the list ordering. Move this node so that is directly proceeds the
+ # head node. Then set the 'head' variable to it. This makes it the new head
+ # of the list.
+ self.mtf(node)
+ self.head = node
+
+ # Return the object
+ return node.obj
+
+
+ def __setitem__(self, key, obj):
+
+ # First, see if any object is stored under 'key' in the cache already. If
+ # so we are going to replace that object with the new one.
+ if key in self.table:
+
+ # Lookup the node
+ node = self.table[key]
+
+ # Replace the object
+ node.obj = obj
+
+ # Update the list ordering.
+ self.mtf(node)
+ self.head = node
+
+ return
+
+ # Ok, no object is currently stored under 'key' in the cache. We need to
+ # choose a node to place the object 'obj' in. There are two cases. If the
+ # cache is full some object will have to be pushed out of the cache. We
+ # want to choose the node with the least recently used object. This is the
+ # node at the tail of the list. If the cache is not full we want to choose
+ # a node that is empty. Because of the way the list is managed, the empty
+ # nodes are always together at the tail end of the list. Thus, in either
+ # case, by chooseing the node at the tail of the list our conditions are
+ # satisfied.
+
+ # Since the list is circular, the tail node directly preceeds the 'head'
+ # node.
+ node = self.head.prev
+
+ # If the node already contains something we need to remove the old key from
+ # the dictionary.
+ if node.key is not None:
+ if self.callback:
+ self.callback(node.key, node.obj)
+ del self.table[node.key]
+
+ # Place the new key and object in the node
+ node.key = key
+ node.obj = obj
+
+ # Add the node to the dictionary under the new key.
+ self.table[node.key] = node
+
+ # We need to move the node to the head of the list. The node is the tail
+ # node, so it directly preceeds the head node due to the list being
+ # circular. Therefore, the ordering is already correct, we just need to
+ # adjust the 'head' variable.
+ self.head = node
+
+
+ def __delitem__(self, key):
+
+ # Lookup the node, then remove it from the hash table.
+ node = self.table[key]
+ del self.table[key]
+
+ # Set the 'key' to None to indicate that the node is empty. We also set the
+ # 'obj' to None to release the reference to the object, though it is not
+ # strictly necessary.
+ node.key = None
+ node.obj = None
+
+ # Because this node is now empty we want to reuse it before any non-empty
+ # node. To do that we want to move it to the tail of the list. We move it
+ # so that it directly preceeds the 'head' node. This makes it the tail
+ # node. The 'head' is then adjusted. This adjustment ensures correctness
+ # even for the case where the 'node' is the 'head' node.
+ self.mtf(node)
+ self.head = node.next
+
+
+
+ def size(self, size=None):
+
+ if size is not None:
+ assert size > 0
+ if size > self.listSize:
+ self.addTailNode(size - self.listSize)
+ elif size < self.listSize:
+ self.removeTailNode(self.listSize - size)
+
+ return self.listSize
+
+
+ def addTailNode(self, n):
+ for i in range(n):
+ node = _dlnode()
+ node.next = self.head
+ node.prev = self.head.prev
+
+ self.head.prev.next = node
+ self.head.prev = node
+
+ self.listSize += n
+
+
+ def removeTailNode(self, n):
+ assert self.listSize > 1 # Invarient. XXX REMOVE this line XXX
+ for i in range(n):
+ node = self.head.prev
+ if node.key is not None:
+ if self.callback:
+ self.callback(node.key, node.obj)
+ del self.table[node.key]
+
+ # Splice the tail node out of the list
+ self.head.prev = node.prev
+ node.prev.next = self.head
+
+ # The next four lines are not strictly necessary.
+ node.prev = None
+ node.next = None
+
+ node.key = None
+ node.obj = None
+
+ self.listSize -= n
+
+ def __del__(self):
+ # When we are finished with the cache, special care is taken to break the
+ # doubly linked list, so that there are no cycles. First all of the 'prev'
+ # links are broken. Then the 'next' link between the 'tail' node and the
+ # 'head' node is broken.
+
+ tail = self.head.prev
+
+ node = self.head
+ while node.prev is not None:
+ node = node.prev
+ node.next.prev = None
+
+ tail.next = None
+
+
+ # This method adjusts the doubly linked list so that 'node' directly preeceds
+ # the 'head' node. Note that it works even if 'node' already directly
+ # preceeds the 'head' node or if 'node' is the 'head' node, in either case
+ # the order of the list is unchanged.
+ def mtf(self, node):
+
+ node.prev.next = node.next
+ node.next.prev = node.prev
+
+ node.prev = self.head.prev
+ node.next = self.head.prev.next
+
+ node.next.prev = node
+ node.prev.next = node
+
+
+
+class lruwrap(object):
+ def __init__(self, store, size, writeback=False):
+ self.store = store
+ self.writeback = writeback
+
+ if not self.writeback:
+ self.cache = lrucache(size)
+ else:
+ self.dirty = set()
+ def callback(key, value):
+ if key in self.dirty:
+ self.store[key] = value
+ self.dirty.remove(key)
+ self.cache = lrucache(size, callback)
+
+ def __len__(self):
+ return len(self.store)
+
+ def size(self, size=None):
+ self.cache.size(size)
+
+ def clear(self):
+ self.cache.clear()
+ self.store.clear()
+ if self.writeback:
+ self.dirty.clear()
+
+ def __contains__(self, key):
+ # XXX Should this bring the key/value into the cache?
+ if key in self.cache:
+ return True
+ if key in self.store:
+ return True
+
+ return False
+
+ def __getitem__(self, key):
+ try:
+ return self.cache[key]
+ except KeyError:
+ pass
+
+ return self.store[key] # XXX Re-raise exception?
+
+ def __setitem__(self, key, value):
+ self.cache[key] = value
+
+ if self.writeback:
+ self.dirty.add(key)
+ else:
+ self.store[key] = value
+
+ def __delitem__(self, key):
+ if self.writeback:
+ found = False
+ try:
+ del self.cache[key]
+ found = True
+ self.dirty.remove(key)
+ except KeyError:
+ pass
+
+ try:
+ del self.store[key]
+ found = True
+ except KeyError:
+ pass
+
+ if not found: # If not found in cache or store, raise error.
+ raise KeyError
+
+ else: # Write-through behavior, cache and store should be consistent
+ del self.store[key]
+ try:
+ del self.cache[key]
+ except KeyError:
+ pass
+
+
+ def sync(self):
+ if self.writeback:
+ for key in self.dirty:
+ value = self.cache.peek(key) # Doesn't change the cache's order
+ self.store[key] = value
+ self.dirty.clear()
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ self.sync()
+ return False
+
+
+class lrudecorator(object):
+ def __init__(self, size):
+ self.cache = lrucache(size)
+
+ def __call__(self, func):
+ def wrapped(*args): # XXX What about kwargs
+ try:
+ return self.cache[args]
+ except KeyError:
+ pass
+
+ value = func(*args)
+ self.cache[args] = value
+ return value
+ return wrapped
diff --git a/searchtoolbar.py b/searchtoolbar.py
new file mode 100644
index 0000000..2253c90
--- /dev/null
+++ b/searchtoolbar.py
@@ -0,0 +1,87 @@
+# Copyright (C) 2007, One Laptop Per Child
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+from gettext import gettext as _
+
+try:
+ from sugar3.graphics.toolbutton import ToolButton
+ from sugar3.graphics.toolcombobox import ToolComboBox
+ # check first sugar3 because in os883 gi.repository is found but not sugar3
+ from gi.repository import Gtk
+except ImportError:
+ import gtk as Gtk
+
+ from sugar.graphics.toolbutton import ToolButton
+ from sugar.graphics.toolcombobox import ToolComboBox
+
+
+class SearchToolbar(Gtk.Toolbar):
+ def __init__(self, activity):
+ Gtk.Toolbar.__init__(self)
+
+ self._activity = activity
+
+ self._providercombo = ToolComboBox()
+
+ self.insert(self._providercombo, -1)
+ self._providercombo.show()
+
+ search_url = 'http://localhost:' + str(activity.confvars['port']) \
+ + '/search?q=%s'
+
+ default_search_providers = {
+ 'schoolserver': {
+ 'order': 3,
+ 'name': _('Wiki'),
+ 'url': search_url,
+ 'icon': 'zoom-home'
+ },
+ }
+
+ self.set_providers(default_search_providers)
+
+ self._entry = Gtk.Entry()
+ self._entry.connect('activate', self._entry_activate_cb)
+
+ entry_item = Gtk.ToolItem()
+ entry_item.set_expand(True)
+ entry_item.add(self._entry)
+ self._entry.show()
+
+ self.insert(entry_item, -1)
+ entry_item.show()
+
+ def _entry_activate_cb(self, entry):
+ k = self._providercombo.combo.get_active_item()[0]
+ p = self._providers[k]
+
+ browser = self._activity._get_browser()
+ browser.load_uri(p['url'] % entry.props.text)
+ browser.grab_focus()
+
+ def _cmp_provider_order(self, a, b):
+ return self._providers[a]['order'] - self._providers[b]['order']
+
+ def set_providers(self, providers):
+ self._providers = providers
+
+ self._providercombo.combo.remove_all()
+
+ for k in sorted(self._providers.keys(), cmp=self._cmp_provider_order):
+ p = self._providers[k]
+ self._providercombo.combo.append_item(k, p['name'], p['icon'])
+
+ self._providercombo.combo.set_active(0)
diff --git a/seek-bzip2/Makefile b/seek-bzip2/Makefile
new file mode 100644
index 0000000..a9c9881
--- /dev/null
+++ b/seek-bzip2/Makefile
@@ -0,0 +1,40 @@
+CC = gcc -m64
+CFLAGS = -O3 # -DTESTING
+
+PROGS=bzip-table seek-bunzip
+
+all: $(PROGS)
+
+bzip-table : bzip-table.o micro-bunzip.o
+seek-bunzip : seek-bunzip.o micro-bunzip.o
+
+micro-bunzip : micro-bunzip.c
+ $(CC) $(CFLAGS) -DMICRO_BUNZIP_MAIN $< -o $@
+
+test: bzip-table seek-bunzip
+ # Generate 10 megabytes of random data
+ dd if=/dev/random of=test_random.dat bs=1024k count=4
+ # Compress but keep original
+ bzip2 --force --keep test_random.dat
+ # Run bzip2recover to build a seperate bz2 file for each block
+ bzip2recover test_random.dat.bz2
+ # Build table
+ ./bzip-table < test_random.dat.bz2 > test_random.dat.bz2t
+ # Grab each block using seek-bunzip and compare to recovered block
+ nl test_random.dat.bz2t | while read num pos size; \
+ do \
+ bzip2 -d -c < rec0000$${num}test_random.dat.bz2 > test_expected; \
+ ./seek-bunzip $${pos} < test_random.dat.bz2 > test_actual; \
+ cmp test_expected test_actual; \
+ if [ $$? -ne 0 ]; then \
+ echo "FAILED: Blocks do not match"; \
+ exit 1; \
+ fi; \
+ done
+ @echo "SUCCESS!"
+
+clean:
+ rm -f *.o $(PROGS) test* rec00*
+
+format:
+ astyle --options=astyle.opts *.c *.h
diff --git a/seek-bzip2/astyle.opts b/seek-bzip2/astyle.opts
new file mode 100644
index 0000000..b230e02
--- /dev/null
+++ b/seek-bzip2/astyle.opts
@@ -0,0 +1,8 @@
+indent=spaces=4
+brackets=break
+indent-classes
+indent-switches
+pad=oper
+pad=paren-in
+one-line=keep-statements
+convert-tabs
diff --git a/seek-bzip2/bzip-table b/seek-bzip2/bzip-table
new file mode 100755
index 0000000..73874e7
--- /dev/null
+++ b/seek-bzip2/bzip-table
Binary files differ
diff --git a/seek-bzip2/bzip-table.c b/seek-bzip2/bzip-table.c
new file mode 100644
index 0000000..1f4d537
--- /dev/null
+++ b/seek-bzip2/bzip-table.c
@@ -0,0 +1,94 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "micro-bunzip.h"
+
+#define BUF_SIZE 8192
+
+/**
+ * Read a bzip2 file from stdin and print
+ * 1) The block size
+ * 2) The starting offset (in BITS) of each block of compressed data
+ *
+ * This does not completely uncompress the data, so does not do CRC checks,
+ * (gaining 60% or so speedup), bzip2 --test can be used to verify files
+ * first if desired.
+ */
+int main( int argc, char*argv[] )
+{
+ bunzip_data *bd;
+ int status;
+ unsigned long long position;
+ char * c;
+ char buffer[BUF_SIZE];
+ int gotcount;
+ int totalcount;
+
+ /* Attempt to open the bzip2 file, if successfull this consumes the
+ * entire header and moves us to the start of the first block.
+ */
+ if ( ! ( status = start_bunzip( &bd, 0, 0, 0 ) ) )
+ {
+ for ( ; ; )
+ {
+ /* Determine position */
+ position = bd->position;
+ position = position - bd->inbufCount + bd->inbufPos;
+ position = position * 8 - bd->inbufBitCount;
+
+ /* Read one block */
+ status = get_next_block( bd );
+
+ /* Reset the total size counter for each block */
+ totalcount = 0;
+
+ /* Non-zero return value indicates an error, break out */
+ if ( status ) break;
+
+ /* This is really the only other thing init_block does, hrmm */
+ bd->writeCRC = 0xffffffffUL;
+
+ /* Decompress the block and throw away, but keep track of the
+ total size of the decompressed data */
+ for ( ; ; )
+ {
+ gotcount = read_bunzip( bd, buffer, BUF_SIZE );
+ if ( gotcount < 0 )
+ {
+ status = gotcount;
+ goto bzip_table_finish;
+ }
+ else if ( gotcount == 0 )
+ {
+ break;
+ }
+ else
+ {
+ totalcount += gotcount;
+ }
+ }
+ /* Print the position of the first bit in the block header */
+ fprintf( stdout, "%llu\t%d\n", position, totalcount );
+ }
+ }
+
+bzip_table_finish:
+
+ /* If we reached the last block, do a CRC check */
+ if ( status == RETVAL_LAST_BLOCK && bd->headerCRC == bd->totalCRC )
+ {
+ status = RETVAL_OK;
+ }
+
+ /* Free decompression buffer and bzip_data */
+ if ( bd->dbuf ) free( bd->dbuf );
+ free( bd );
+
+ /* Print error if required */
+ if ( status )
+ {
+ fprintf( stderr, "\n%s\n", bunzip_errors[-status] );
+ }
+
+ return status;
+}
diff --git a/seek-bzip2/bzip-table.o b/seek-bzip2/bzip-table.o
new file mode 100644
index 0000000..527cccf
--- /dev/null
+++ b/seek-bzip2/bzip-table.o
Binary files differ
diff --git a/seek-bzip2/micro-bunzip.c b/seek-bzip2/micro-bunzip.c
new file mode 100644
index 0000000..dc7fea0
--- /dev/null
+++ b/seek-bzip2/micro-bunzip.c
@@ -0,0 +1,657 @@
+/* vi: set sw=4 ts=4: */
+/* Small bzip2 deflate implementation, by Rob Landley (rob@landley.net).
+
+ Based on bzip2 decompression code by Julian R Seward (jseward@acm.org),
+ which also acknowledges contributions by Mike Burrows, David Wheeler,
+ Peter Fenwick, Alistair Moffat, Radford Neal, Ian H. Witten,
+ Robert Sedgewick, and Jon L. Bentley.
+
+ This code is licensed under the LGPLv2:
+ LGPL (http://www.gnu.org/copyleft/lgpl.html
+*/
+
+/*
+ Size and speed optimizations by Manuel Novoa III (mjn3@codepoet.org).
+
+ More efficient reading of huffman codes, a streamlined read_bunzip()
+ function, and various other tweaks. In (limited) tests, approximately
+ 20% faster than bzcat on x86 and about 10% faster on arm.
+
+ Note that about 2/3 of the time is spent in read_unzip() reversing
+ the Burrows-Wheeler transformation. Much of that time is delay
+ resulting from cache misses.
+
+ I would ask that anyone benefiting from this work, especially those
+ using it in commercial products, consider making a donation to my local
+ non-profit hospice organization (see www.hospiceacadiana.com) in the
+ name of the woman I loved, Toni W. Hagan, who passed away Feb. 12, 2003.
+
+ Manuel
+ */
+
+#include <setjmp.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <limits.h>
+
+/* Constants for huffman coding */
+#define MAX_GROUPS 6
+#define GROUP_SIZE 50 /* 64 would have been more efficient */
+#define MAX_HUFCODE_BITS 20 /* Longest huffman code allowed */
+#define MAX_SYMBOLS 258 /* 256 literals + RUNA + RUNB */
+#define SYMBOL_RUNA 0
+#define SYMBOL_RUNB 1
+
+/* Status return values */
+#define RETVAL_OK 0
+#define RETVAL_LAST_BLOCK (-1)
+#define RETVAL_NOT_BZIP_DATA (-2)
+#define RETVAL_UNEXPECTED_INPUT_EOF (-3)
+#define RETVAL_UNEXPECTED_OUTPUT_EOF (-4)
+#define RETVAL_DATA_ERROR (-5)
+#define RETVAL_OUT_OF_MEMORY (-6)
+#define RETVAL_OBSOLETE_INPUT (-7)
+
+#define RETVAL_END_OF_BLOCK (-8)
+
+/* Other housekeeping constants */
+#define IOBUF_SIZE 4096
+
+/* This is what we know about each huffman coding group */
+struct group_data
+{
+ /* We have an extra slot at the end of limit[] for a sentinal value. */
+ int limit[MAX_HUFCODE_BITS+1], base[MAX_HUFCODE_BITS], permute[MAX_SYMBOLS];
+ int minLen, maxLen;
+};
+
+/* Structure holding all the housekeeping data, including IO buffers and
+ memory that persists between calls to bunzip */
+typedef struct
+{
+ /* State for interrupting output loop */
+ int writeCopies, writePos, writeRunCountdown, writeCount, writeCurrent;
+ /* I/O tracking data (file handles, buffers, positions, etc.) */
+ int in_fd, out_fd, inbufCount, inbufPos /*,outbufPos*/;
+ // james@jamestaylor.org: track relative position in input so we don't need tell
+ off_t position;
+ unsigned char *inbuf /*,*outbuf*/;
+ unsigned int inbufBitCount, inbufBits;
+ /* The CRC values stored in the block header and calculated from the data */
+ unsigned int crc32Table[256], headerCRC, totalCRC, writeCRC;
+ /* Intermediate buffer and its size (in bytes) */
+ unsigned int *dbuf, dbufSize;
+ /* These things are a bit too big to go on the stack */
+ unsigned char selectors[32768]; /* nSelectors=15 bits */
+ struct group_data groups[MAX_GROUPS]; /* huffman coding tables */
+ /* For I/O error handling */
+ jmp_buf jmpbuf;
+}
+bunzip_data;
+
+/* Return the next nnn bits of input. All reads from the compressed input
+ are done through this function. All reads are big endian */
+unsigned int get_bits( bunzip_data *bd, char bits_wanted )
+{
+ unsigned int bits = 0;
+
+ /* If we need to get more data from the byte buffer, do so. (Loop getting
+ one byte at a time to enforce endianness and avoid unaligned access.) */
+ while ( bd->inbufBitCount < bits_wanted )
+ {
+ /* If we need to read more data from file into byte buffer, do so */
+ if ( bd->inbufPos == bd->inbufCount )
+ {
+ if ( ( bd->inbufCount = read( bd->in_fd, bd->inbuf, IOBUF_SIZE ) ) <= 0 )
+ longjmp( bd->jmpbuf, RETVAL_UNEXPECTED_INPUT_EOF );
+ // james@jamestaylor.org: track position
+ bd->position += bd->inbufCount;
+ bd->inbufPos = 0;
+ }
+ /* Avoid 32-bit overflow (dump bit buffer to top of output) */
+ if ( bd->inbufBitCount >= 24 )
+ {
+ bits = bd->inbufBits & ( ( 1 << bd->inbufBitCount ) - 1 );
+ bits_wanted -= bd->inbufBitCount;
+ bits <<= bits_wanted;
+ bd->inbufBitCount = 0;
+ }
+ /* Grab next 8 bits of input from buffer. */
+ bd->inbufBits = ( bd->inbufBits << 8 ) | bd->inbuf[bd->inbufPos++];
+ bd->inbufBitCount += 8;
+ }
+ /* Calculate result */
+ bd->inbufBitCount -= bits_wanted;
+ bits |= ( bd->inbufBits >> bd->inbufBitCount ) & ( ( 1 << bits_wanted ) - 1 );
+
+ return bits;
+}
+
+/* Unpacks the next block and sets up for the inverse burrows-wheeler step. */
+
+int get_next_block( bunzip_data *bd )
+{
+ struct group_data *hufGroup;
+ int dbufCount, nextSym, dbufSize, groupCount, *base, *limit, selector,
+ i, j, k, t, runPos, symCount, symTotal, nSelectors, byteCount[256];
+ unsigned char uc, symToByte[256], mtfSymbol[256], *selectors;
+ unsigned int *dbuf, origPtr;
+
+ dbuf = bd->dbuf;
+ dbufSize = bd->dbufSize;
+ selectors = bd->selectors;
+ /* Reset longjmp I/O error handling */
+ i = setjmp( bd->jmpbuf );
+ if ( i ) return i;
+ /* Read in header signature and CRC, then validate signature.
+ (last block signature means CRC is for whole file, return now) */
+ i = get_bits( bd, 24 );
+ j = get_bits( bd, 24 );
+ bd->headerCRC = get_bits( bd, 32 );
+ if ( ( i == 0x177245 ) && ( j == 0x385090 ) ) return RETVAL_LAST_BLOCK;
+ if ( ( i != 0x314159 ) || ( j != 0x265359 ) ) return RETVAL_NOT_BZIP_DATA;
+ /* We can add support for blockRandomised if anybody complains. There was
+ some code for this in busybox 1.0.0-pre3, but nobody ever noticed that
+ it didn't actually work. */
+ if ( get_bits( bd, 1 ) ) return RETVAL_OBSOLETE_INPUT;
+ if ( ( origPtr = get_bits( bd, 24 ) ) > dbufSize ) return RETVAL_DATA_ERROR;
+ /* mapping table: if some byte values are never used (encoding things
+ like ascii text), the compression code removes the gaps to have fewer
+ symbols to deal with, and writes a sparse bitfield indicating which
+ values were present. We make a translation table to convert the symbols
+ back to the corresponding bytes. */
+ t = get_bits( bd, 16 );
+ symTotal = 0;
+ for ( i = 0;i < 16;i++ )
+ {
+ if ( t&( 1 << ( 15 - i ) ) )
+ {
+ k = get_bits( bd, 16 );
+ for ( j = 0;j < 16;j++ )
+ if ( k&( 1 << ( 15 - j ) ) ) symToByte[symTotal++] = ( 16 * i ) + j;
+ }
+ }
+ /* How many different huffman coding groups does this block use? */
+ groupCount = get_bits( bd, 3 );
+ if ( groupCount < 2 || groupCount > MAX_GROUPS ) return RETVAL_DATA_ERROR;
+ /* nSelectors: Every GROUP_SIZE many symbols we select a new huffman coding
+ group. Read in the group selector list, which is stored as MTF encoded
+ bit runs. (MTF=Move To Front, as each value is used it's moved to the
+ start of the list.) */
+ if ( !( nSelectors = get_bits( bd, 15 ) ) ) return RETVAL_DATA_ERROR;
+ for ( i = 0; i < groupCount; i++ ) mtfSymbol[i] = i;
+ for ( i = 0; i < nSelectors; i++ )
+ {
+ /* Get next value */
+ for ( j = 0;get_bits( bd, 1 );j++ ) if ( j >= groupCount ) return RETVAL_DATA_ERROR;
+ /* Decode MTF to get the next selector */
+ uc = mtfSymbol[j];
+ for ( ;j;j-- ) mtfSymbol[j] = mtfSymbol[j-1];
+ mtfSymbol[0] = selectors[i] = uc;
+ }
+ /* Read the huffman coding tables for each group, which code for symTotal
+ literal symbols, plus two run symbols (RUNA, RUNB) */
+ symCount = symTotal + 2;
+ for ( j = 0; j < groupCount; j++ )
+ {
+ unsigned char length[MAX_SYMBOLS], temp[MAX_HUFCODE_BITS+1];
+ int minLen, maxLen, pp;
+ /* Read huffman code lengths for each symbol. They're stored in
+ a way similar to mtf; record a starting value for the first symbol,
+ and an offset from the previous value for everys symbol after that.
+ (Subtracting 1 before the loop and then adding it back at the end is
+ an optimization that makes the test inside the loop simpler: symbol
+ length 0 becomes negative, so an unsigned inequality catches it.) */
+ t = get_bits( bd, 5 ) - 1;
+ for ( i = 0; i < symCount; i++ )
+ {
+ for ( ;; )
+ {
+ if ( ( ( unsigned )t ) > ( MAX_HUFCODE_BITS - 1 ) )
+ return RETVAL_DATA_ERROR;
+ /* If first bit is 0, stop. Else second bit indicates whether
+ to increment or decrement the value. Optimization: grab 2
+ bits and unget the second if the first was 0. */
+ k = get_bits( bd, 2 );
+ if ( k < 2 )
+ {
+ bd->inbufBitCount++;
+ break;
+ }
+ /* Add one if second bit 1, else subtract 1. Avoids if/else */
+ t += ( ( ( k + 1 ) & 2 ) - 1 );
+ }
+ /* Correct for the initial -1, to get the final symbol length */
+ length[i] = t + 1;
+ }
+ /* Find largest and smallest lengths in this group */
+ minLen = maxLen = length[0];
+ for ( i = 1; i < symCount; i++ )
+ {
+ if ( length[i] > maxLen ) maxLen = length[i];
+ else if ( length[i] < minLen ) minLen = length[i];
+ }
+ /* Calculate permute[], base[], and limit[] tables from length[].
+ *
+ * permute[] is the lookup table for converting huffman coded symbols
+ * into decoded symbols. base[] is the amount to subtract from the
+ * value of a huffman symbol of a given length when using permute[].
+ *
+ * limit[] indicates the largest numerical value a symbol with a given
+ * number of bits can have. This is how the huffman codes can vary in
+ * length: each code with a value>limit[length] needs another bit.
+ */
+ hufGroup = bd->groups + j;
+ hufGroup->minLen = minLen;
+ hufGroup->maxLen = maxLen;
+ /* Note that minLen can't be smaller than 1, so we adjust the base
+ and limit array pointers so we're not always wasting the first
+ entry. We do this again when using them (during symbol decoding).*/
+ base = hufGroup->base - 1;
+ limit = hufGroup->limit - 1;
+ /* Calculate permute[]. Concurently, initialize temp[] and limit[]. */
+ pp = 0;
+ for ( i = minLen;i <= maxLen;i++ )
+ {
+ temp[i] = limit[i] = 0;
+ for ( t = 0;t < symCount;t++ )
+ if ( length[t] == i ) hufGroup->permute[pp++] = t;
+ }
+ /* Count symbols coded for at each bit length */
+ for ( i = 0;i < symCount;i++ ) temp[length[i]]++;
+ /* Calculate limit[] (the largest symbol-coding value at each bit
+ * length, which is (previous limit<<1)+symbols at this level), and
+ * base[] (number of symbols to ignore at each bit length, which is
+ * limit minus the cumulative count of symbols coded for already). */
+ pp = t = 0;
+ for ( i = minLen; i < maxLen; i++ )
+ {
+ pp += temp[i];
+ /* We read the largest possible symbol size and then unget bits
+ after determining how many we need, and those extra bits could
+ be set to anything. (They're noise from future symbols.) At
+ each level we're really only interested in the first few bits,
+ so here we set all the trailing to-be-ignored bits to 1 so they
+ don't affect the value>limit[length] comparison. */
+ limit[i] = ( pp << ( maxLen - i ) ) - 1;
+ pp <<= 1;
+ base[i+1] = pp - ( t += temp[i] );
+ }
+ limit[maxLen+1] = INT_MAX; /* Sentinal value for reading next sym. */
+ limit[maxLen] = pp + temp[maxLen] - 1;
+ base[minLen] = 0;
+ }
+ /* We've finished reading and digesting the block header. Now read this
+ block's huffman coded symbols from the file and undo the huffman coding
+ and run length encoding, saving the result into dbuf[dbufCount++]=uc */
+
+ /* Initialize symbol occurrence counters and symbol Move To Front table */
+ for ( i = 0;i < 256;i++ )
+ {
+ byteCount[i] = 0;
+ mtfSymbol[i] = ( unsigned char )i;
+ }
+ /* Loop through compressed symbols. */
+ runPos = dbufCount = symCount = selector = 0;
+ for ( ;; )
+ {
+ /* Determine which huffman coding group to use. */
+ if ( !( symCount-- ) )
+ {
+ symCount = GROUP_SIZE - 1;
+ if ( selector >= nSelectors ) return RETVAL_DATA_ERROR;
+ hufGroup = bd->groups + selectors[selector++];
+ base = hufGroup->base - 1;
+ limit = hufGroup->limit - 1;
+ }
+ /* Read next huffman-coded symbol. */
+ /* Note: It is far cheaper to read maxLen bits and back up than it is
+ to read minLen bits and then an additional bit at a time, testing
+ as we go. Because there is a trailing last block (with file CRC),
+ there is no danger of the overread causing an unexpected EOF for a
+ valid compressed file. As a further optimization, we do the read
+ inline (falling back to a call to get_bits if the buffer runs
+ dry). The following (up to got_huff_bits:) is equivalent to
+ j=get_bits(bd,hufGroup->maxLen);
+ */
+ while ( bd->inbufBitCount < hufGroup->maxLen )
+ {
+ if ( bd->inbufPos == bd->inbufCount )
+ {
+ j = get_bits( bd, hufGroup->maxLen );
+ goto got_huff_bits;
+ }
+ bd->inbufBits = ( bd->inbufBits << 8 ) | bd->inbuf[bd->inbufPos++];
+ bd->inbufBitCount += 8;
+ };
+ bd->inbufBitCount -= hufGroup->maxLen;
+ j = ( bd->inbufBits >> bd->inbufBitCount ) & ( ( 1 << hufGroup->maxLen ) - 1 );
+got_huff_bits:
+ /* Figure how how many bits are in next symbol and unget extras */
+ i = hufGroup->minLen;
+ while ( j > limit[i] ) ++i;
+ bd->inbufBitCount += ( hufGroup->maxLen - i );
+ /* Huffman decode value to get nextSym (with bounds checking) */
+ if ( ( i > hufGroup->maxLen )
+ || ( ( ( unsigned )( j = ( j >> ( hufGroup->maxLen - i ) ) - base[i] ) )
+ >= MAX_SYMBOLS ) )
+ return RETVAL_DATA_ERROR;
+ nextSym = hufGroup->permute[j];
+ /* We have now decoded the symbol, which indicates either a new literal
+ byte, or a repeated run of the most recent literal byte. First,
+ check if nextSym indicates a repeated run, and if so loop collecting
+ how many times to repeat the last literal. */
+ if ( ( ( unsigned )nextSym ) <= SYMBOL_RUNB )
+ { /* RUNA or RUNB */
+ /* If this is the start of a new run, zero out counter */
+ if ( !runPos )
+ {
+ runPos = 1;
+ t = 0;
+ }
+ /* Neat trick that saves 1 symbol: instead of or-ing 0 or 1 at
+ each bit position, add 1 or 2 instead. For example,
+ 1011 is 1<<0 + 1<<1 + 2<<2. 1010 is 2<<0 + 2<<1 + 1<<2.
+ You can make any bit pattern that way using 1 less symbol than
+ the basic or 0/1 method (except all bits 0, which would use no
+ symbols, but a run of length 0 doesn't mean anything in this
+ context). Thus space is saved. */
+ t += ( runPos << nextSym ); /* +runPos if RUNA; +2*runPos if RUNB */
+ runPos <<= 1;
+ continue;
+ }
+ /* When we hit the first non-run symbol after a run, we now know
+ how many times to repeat the last literal, so append that many
+ copies to our buffer of decoded symbols (dbuf) now. (The last
+ literal used is the one at the head of the mtfSymbol array.) */
+ if ( runPos )
+ {
+ runPos = 0;
+ if ( dbufCount + t >= dbufSize ) return RETVAL_DATA_ERROR;
+
+ uc = symToByte[mtfSymbol[0]];
+ byteCount[uc] += t;
+ while ( t-- ) dbuf[dbufCount++] = uc;
+ }
+ /* Is this the terminating symbol? */
+ if ( nextSym > symTotal ) break;
+ /* At this point, nextSym indicates a new literal character. Subtract
+ one to get the position in the MTF array at which this literal is
+ currently to be found. (Note that the result can't be -1 or 0,
+ because 0 and 1 are RUNA and RUNB. But another instance of the
+ first symbol in the mtf array, position 0, would have been handled
+ as part of a run above. Therefore 1 unused mtf position minus
+ 2 non-literal nextSym values equals -1.) */
+ if ( dbufCount >= dbufSize ) return RETVAL_DATA_ERROR;
+ i = nextSym - 1;
+ uc = mtfSymbol[i];
+ /* Adjust the MTF array. Since we typically expect to move only a
+ * small number of symbols, and are bound by 256 in any case, using
+ * memmove here would typically be bigger and slower due to function
+ * call overhead and other assorted setup costs. */
+ do
+ {
+ mtfSymbol[i] = mtfSymbol[i-1];
+ }
+ while ( --i );
+ mtfSymbol[0] = uc;
+ uc = symToByte[uc];
+ /* We have our literal byte. Save it into dbuf. */
+ byteCount[uc]++;
+ dbuf[dbufCount++] = ( unsigned int )uc;
+ }
+ /* At this point, we've read all the huffman-coded symbols (and repeated
+ runs) for this block from the input stream, and decoded them into the
+ intermediate buffer. There are dbufCount many decoded bytes in dbuf[].
+ Now undo the Burrows-Wheeler transform on dbuf.
+ See http://dogma.net/markn/articles/bwt/bwt.htm
+ */
+ /* Turn byteCount into cumulative occurrence counts of 0 to n-1. */
+ j = 0;
+ for ( i = 0;i < 256;i++ )
+ {
+ k = j + byteCount[i];
+ byteCount[i] = j;
+ j = k;
+ }
+ /* Figure out what order dbuf would be in if we sorted it. */
+ for ( i = 0;i < dbufCount;i++ )
+ {
+ uc = ( unsigned char )( dbuf[i] & 0xff );
+ dbuf[byteCount[uc]] |= ( i << 8 );
+ byteCount[uc]++;
+ }
+ /* Decode first byte by hand to initialize "previous" byte. Note that it
+ doesn't get output, and if the first three characters are identical
+ it doesn't qualify as a run (hence writeRunCountdown=5). */
+ if ( dbufCount )
+ {
+ if ( origPtr >= dbufCount ) return RETVAL_DATA_ERROR;
+ bd->writePos = dbuf[origPtr];
+ bd->writeCurrent = ( unsigned char )( bd->writePos & 0xff );
+ bd->writePos >>= 8;
+ bd->writeRunCountdown = 5;
+ }
+ bd->writeCount = dbufCount;
+
+ return RETVAL_OK;
+}
+
+/* Undo burrows-wheeler transform on intermediate buffer to produce output.
+ If start_bunzip was initialized with out_fd=-1, then up to len bytes of
+ data are written to outbuf. Return value is number of bytes written or
+ error (all errors are negative numbers). If out_fd!=-1, outbuf and len
+ are ignored, data is written to out_fd and return is RETVAL_OK or error.
+*/
+
+extern int read_bunzip( bunzip_data *bd, char *outbuf, int len )
+{
+ const unsigned int *dbuf;
+ int pos, current, previous, gotcount;
+
+ /* If last read was short due to end of file, return last block now */
+ /* if(bd->writeCount<0) return bd->writeCount; */
+
+ /* james@jamestaylor.org: writeCount goes to -1 when the buffer is fully
+ decoded, which results in this returning RETVAL_LAST_BLOCK, also
+ equal to -1... Confusing, I'm returning 0 here to indicate no
+ bytes written into the buffer */
+ if ( bd->writeCount < 0 ) return 0;
+
+ gotcount = 0;
+ dbuf = bd->dbuf;
+ pos = bd->writePos;
+ current = bd->writeCurrent;
+
+ /* We will always have pending decoded data to write into the output
+ buffer unless this is the very first call (in which case we haven't
+ huffman-decoded a block into the intermediate buffer yet). */
+
+ if ( bd->writeCopies )
+ {
+ /* Inside the loop, writeCopies means extra copies (beyond 1) */
+ --bd->writeCopies;
+ /* Loop outputting bytes */
+ for ( ;; )
+ {
+ /* Write next byte into output buffer, updating CRC */
+ /* If the output buffer is full, snapshot state and return */
+ if ( gotcount >= len )
+ {
+ bd->writePos = pos;
+ bd->writeCurrent = current;
+ bd->writeCopies++;
+ return len;
+ }
+ outbuf[gotcount++] = current;
+ bd->writeCRC = ( ( ( bd->writeCRC ) << 8 )
+ ^ bd->crc32Table[( ( bd->writeCRC )>>24 )^current] );
+ /* Loop now if we're outputting multiple copies of this byte */
+ if ( bd->writeCopies )
+ {
+ --bd->writeCopies;
+ continue;
+ }
+decode_next_byte:
+ if ( !bd->writeCount-- ) break;
+ /* Follow sequence vector to undo Burrows-Wheeler transform */
+ previous = current;
+ pos = dbuf[pos];
+ current = pos & 0xff;
+ pos >>= 8;
+ /* After 3 consecutive copies of the same byte, the 4th is a repeat
+ count. We count down from 4 instead
+ * of counting up because testing for non-zero is faster */
+ if ( --bd->writeRunCountdown )
+ {
+ if ( current != previous ) bd->writeRunCountdown = 4;
+ }
+ else
+ {
+ /* We have a repeated run, this byte indicates the count */
+ bd->writeCopies = current;
+ current = previous;
+ bd->writeRunCountdown = 5;
+ /* Sometimes there are just 3 bytes (run length 0) */
+ if ( !bd->writeCopies ) goto decode_next_byte;
+ /* Subtract the 1 copy we'd output anyway to get extras */
+ --bd->writeCopies;
+ }
+ }
+ /* Decompression of this block completed successfully */
+ bd->writeCRC = ~bd->writeCRC;
+ bd->totalCRC = ( ( bd->totalCRC << 1 ) | ( bd->totalCRC >> 31 ) ) ^ bd->writeCRC;
+ /* If this block had a CRC error, force file level CRC error. */
+ if ( bd->writeCRC != bd->headerCRC )
+ {
+ bd->totalCRC = bd->headerCRC + 1;
+ return RETVAL_LAST_BLOCK;
+ }
+ /* james@jamestaylor.org -- rather than falling through we return here */
+ return gotcount;
+ }
+
+ goto decode_next_byte;
+}
+
+int init_block( bunzip_data *bd )
+{
+ int status;
+ /* Refill the intermediate buffer by huffman-decoding next block of input */
+ /* (previous is just a convenient unused temp variable here) */
+ status = get_next_block( bd );
+ if ( status )
+ {
+ bd->writeCount = status;
+ return status;
+ }
+ bd->writeCRC = 0xffffffffUL;
+ return RETVAL_OK;
+}
+
+/* Allocate the structure, read file header. If in_fd==-1, inbuf must contain
+ a complete bunzip file (len bytes long). If in_fd!=-1, inbuf and len are
+ ignored, and data is read from file handle into temporary buffer. */
+extern int start_bunzip( bunzip_data **bdp, int in_fd, char *inbuf, int len )
+{
+ bunzip_data *bd;
+ unsigned int i, j, c;
+ const unsigned int BZh0 = ( ( ( unsigned int )'B' ) << 24 ) + ( ( ( unsigned int )'Z' ) << 16 )
+ + ( ( ( unsigned int )'h' ) << 8 ) + ( unsigned int )'0';
+
+ /* Figure out how much data to allocate */
+ i = sizeof( bunzip_data );
+ if ( in_fd != -1 ) i += IOBUF_SIZE;
+ /* Allocate bunzip_data. Most fields initialize to zero. */
+ if ( !( bd = *bdp = malloc( i ) ) ) return RETVAL_OUT_OF_MEMORY;
+ memset( bd, 0, sizeof( bunzip_data ) );
+ /* Setup input buffer */
+ if ( -1 == ( bd->in_fd = in_fd ) )
+ {
+ bd->inbuf = inbuf;
+ bd->inbufCount = len;
+ }
+ else bd->inbuf = ( unsigned char * )( bd + 1 );
+ /* Init the CRC32 table (big endian) */
+ for ( i = 0;i < 256;i++ )
+ {
+ c = i << 24;
+ for ( j = 8;j;j-- )
+ c = c & 0x80000000 ? ( c << 1 ) ^ 0x04c11db7 : ( c << 1 );
+ bd->crc32Table[i] = c;
+ }
+ /* Setup for I/O error handling via longjmp */
+ i = setjmp( bd->jmpbuf );
+ if ( i ) return i;
+
+ /* Ensure that file starts with "BZh['1'-'9']." */
+ i = get_bits( bd, 32 );
+ if ( ( ( unsigned int )( i - BZh0 - 1 ) ) >= 9 ) return RETVAL_NOT_BZIP_DATA;
+
+ /* Fourth byte (ascii '1'-'9'), indicates block size in units of 100k of
+ uncompressed data. Allocate intermediate buffer for block. */
+ bd->dbufSize = 100000 * ( i - BZh0 );
+
+ if ( !( bd->dbuf = malloc( bd->dbufSize * sizeof( int ) ) ) )
+ return RETVAL_OUT_OF_MEMORY;
+ return RETVAL_OK;
+}
+
+/* Example usage: decompress src_fd to dst_fd. (Stops at end of bzip data,
+ not end of file.) */
+extern int uncompressStream( int src_fd, int dst_fd )
+{
+ char *outbuf;
+ bunzip_data *bd;
+ int i;
+
+ if ( !( outbuf = malloc( IOBUF_SIZE ) ) ) return RETVAL_OUT_OF_MEMORY;
+ if ( !( i = start_bunzip( &bd, src_fd, 0, 0 ) ) )
+ {
+ for ( ;; )
+ {
+ if ( ( ( i = init_block( bd ) ) < 0 ) ) break;
+ // fprintf( stderr, "init: %d\n", i );
+ for ( ;; )
+ {
+ if ( ( i = read_bunzip( bd, outbuf, IOBUF_SIZE ) ) <= 0 ) break;
+ // fprintf( stderr, "read: %d\n", i );
+ if ( i != write( dst_fd, outbuf, i ) )
+ {
+ i = RETVAL_UNEXPECTED_OUTPUT_EOF;
+ break;
+ }
+ }
+ }
+ }
+ /* Check CRC and release memory */
+ if ( i == RETVAL_LAST_BLOCK && bd->headerCRC == bd->totalCRC ) i = RETVAL_OK;
+ if ( bd->dbuf ) free( bd->dbuf );
+ free( bd );
+ free( outbuf );
+ return i;
+}
+
+#ifdef MICRO_BUNZIP_MAIN
+
+static char * const bunzip_errors[] =
+ {
+ NULL, "Bad file checksum", "Not bzip data",
+ "Unexpected input EOF", "Unexpected output EOF", "Data error",
+ "Out of memory", "Obsolete (pre 0.9.5) bzip format not supported."
+ };
+
+/* Dumb little test thing, decompress stdin to stdout */
+int main( int argc, char *argv[] )
+{
+ int i = uncompressStream( 0, 1 );
+ char c;
+
+ if ( i ) fprintf( stderr, "%d: %s\n", i, bunzip_errors[-i] );
+ else if ( read( 0, &c, 1 ) ) fprintf( stderr, "Trailing garbage ignored\n" );
+ return -i;
+}
+
+#endif
diff --git a/seek-bzip2/micro-bunzip.h b/seek-bzip2/micro-bunzip.h
new file mode 100644
index 0000000..85b83da
--- /dev/null
+++ b/seek-bzip2/micro-bunzip.h
@@ -0,0 +1,77 @@
+#ifndef __MICRO_BUNZIP_H__
+#define __MICRO_BUNZIP_H__
+
+/* ---- Duplicated from micro-bzip.c -------------------------------------- */
+
+#include <setjmp.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <limits.h>
+
+/* Constants for huffman coding */
+#define MAX_GROUPS 6
+#define GROUP_SIZE 50 /* 64 would have been more efficient */
+#define MAX_HUFCODE_BITS 20 /* Longest huffman code allowed */
+#define MAX_SYMBOLS 258 /* 256 literals + RUNA + RUNB */
+#define SYMBOL_RUNA 0
+#define SYMBOL_RUNB 1
+
+/* Status return values */
+#define RETVAL_OK 0
+#define RETVAL_LAST_BLOCK (-1)
+#define RETVAL_NOT_BZIP_DATA (-2)
+#define RETVAL_UNEXPECTED_INPUT_EOF (-3)
+#define RETVAL_UNEXPECTED_OUTPUT_EOF (-4)
+#define RETVAL_DATA_ERROR (-5)
+#define RETVAL_OUT_OF_MEMORY (-6)
+#define RETVAL_OBSOLETE_INPUT (-7)
+
+/* Other housekeeping constants */
+#define IOBUF_SIZE 4096
+
+/* This is what we know about each huffman coding group */
+struct group_data
+{
+ /* We have an extra slot at the end of limit[] for a sentinal value. */
+ int limit[MAX_HUFCODE_BITS+1], base[MAX_HUFCODE_BITS], permute[MAX_SYMBOLS];
+ int minLen, maxLen;
+};
+
+/* Structure holding all the housekeeping data, including IO buffers and
+ memory that persists between calls to bunzip */
+typedef struct
+{
+ /* State for interrupting output loop */
+ int writeCopies, writePos, writeRunCountdown, writeCount, writeCurrent;
+ /* I/O tracking data (file handles, buffers, positions, etc.) */
+ int in_fd, out_fd, inbufCount, inbufPos /*,outbufPos*/;
+ // james@jamestaylor.org: track relative position in input so we don't need tell
+ off_t position;
+ unsigned char *inbuf /*,*outbuf*/;
+ unsigned int inbufBitCount, inbufBits;
+ /* The CRC values stored in the block header and calculated from the data */
+ unsigned int crc32Table[256], headerCRC, totalCRC, writeCRC;
+ /* Intermediate buffer and its size (in bytes) */
+ unsigned int *dbuf, dbufSize;
+ /* These things are a bit too big to go on the stack */
+ unsigned char selectors[32768]; /* nSelectors=15 bits */
+ struct group_data groups[MAX_GROUPS]; /* huffman coding tables */
+ /* For I/O error handling */
+ jmp_buf jmpbuf;
+}
+bunzip_data;
+
+static char * const bunzip_errors[] =
+ {
+ NULL, "Bad file checksum", "Not bzip data",
+ "Unexpected input EOF", "Unexpected output EOF", "Data error",
+ "Out of memory", "Obsolete (pre 0.9.5) bzip format not supported."
+ };
+
+/* ---- Forward declarations for micro-bzip.c ---------------------------- */
+
+extern int get_next_block( bunzip_data *bd );
+
+#endif
diff --git a/seek-bzip2/micro-bunzip.o b/seek-bzip2/micro-bunzip.o
new file mode 100644
index 0000000..ead5d49
--- /dev/null
+++ b/seek-bzip2/micro-bunzip.o
Binary files differ
diff --git a/seek-bzip2/micro-bunzip.orig.c b/seek-bzip2/micro-bunzip.orig.c
new file mode 100644
index 0000000..7592146
--- /dev/null
+++ b/seek-bzip2/micro-bunzip.orig.c
@@ -0,0 +1,632 @@
+/* vi: set sw=4 ts=4: */
+/* Small bzip2 deflate implementation, by Rob Landley (rob@landley.net).
+
+ Based on bzip2 decompression code by Julian R Seward (jseward@acm.org),
+ which also acknowledges contributions by Mike Burrows, David Wheeler,
+ Peter Fenwick, Alistair Moffat, Radford Neal, Ian H. Witten,
+ Robert Sedgewick, and Jon L. Bentley.
+
+ This code is licensed under the LGPLv2:
+ LGPL (http://www.gnu.org/copyleft/lgpl.html
+*/
+
+/*
+ Size and speed optimizations by Manuel Novoa III (mjn3@codepoet.org).
+
+ More efficient reading of huffman codes, a streamlined read_bunzip()
+ function, and various other tweaks. In (limited) tests, approximately
+ 20% faster than bzcat on x86 and about 10% faster on arm.
+
+ Note that about 2/3 of the time is spent in read_unzip() reversing
+ the Burrows-Wheeler transformation. Much of that time is delay
+ resulting from cache misses.
+
+ I would ask that anyone benefiting from this work, especially those
+ using it in commercial products, consider making a donation to my local
+ non-profit hospice organization (see www.hospiceacadiana.com) in the
+ name of the woman I loved, Toni W. Hagan, who passed away Feb. 12, 2003.
+
+ Manuel
+ */
+
+#include <setjmp.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <limits.h>
+
+/* Constants for huffman coding */
+#define MAX_GROUPS 6
+#define GROUP_SIZE 50 /* 64 would have been more efficient */
+#define MAX_HUFCODE_BITS 20 /* Longest huffman code allowed */
+#define MAX_SYMBOLS 258 /* 256 literals + RUNA + RUNB */
+#define SYMBOL_RUNA 0
+#define SYMBOL_RUNB 1
+
+/* Status return values */
+#define RETVAL_OK 0
+#define RETVAL_LAST_BLOCK (-1)
+#define RETVAL_NOT_BZIP_DATA (-2)
+#define RETVAL_UNEXPECTED_INPUT_EOF (-3)
+#define RETVAL_UNEXPECTED_OUTPUT_EOF (-4)
+#define RETVAL_DATA_ERROR (-5)
+#define RETVAL_OUT_OF_MEMORY (-6)
+#define RETVAL_OBSOLETE_INPUT (-7)
+
+/* Other housekeeping constants */
+#define IOBUF_SIZE 4096
+
+/* This is what we know about each huffman coding group */
+struct group_data
+{
+ /* We have an extra slot at the end of limit[] for a sentinal value. */
+ int limit[MAX_HUFCODE_BITS+1], base[MAX_HUFCODE_BITS], permute[MAX_SYMBOLS];
+ int minLen, maxLen;
+};
+
+/* Structure holding all the housekeeping data, including IO buffers and
+ memory that persists between calls to bunzip */
+typedef struct
+{
+ /* State for interrupting output loop */
+ int writeCopies, writePos, writeRunCountdown, writeCount, writeCurrent;
+ /* I/O tracking data (file handles, buffers, positions, etc.) */
+ int in_fd, out_fd, inbufCount, inbufPos /*,outbufPos*/;
+ unsigned char *inbuf /*,*outbuf*/;
+ unsigned int inbufBitCount, inbufBits;
+ /* The CRC values stored in the block header and calculated from the data */
+ unsigned int crc32Table[256], headerCRC, totalCRC, writeCRC;
+ /* Intermediate buffer and its size (in bytes) */
+ unsigned int *dbuf, dbufSize;
+ /* These things are a bit too big to go on the stack */
+ unsigned char selectors[32768]; /* nSelectors=15 bits */
+ struct group_data groups[MAX_GROUPS]; /* huffman coding tables */
+ /* For I/O error handling */
+ jmp_buf jmpbuf;
+}
+bunzip_data;
+
+/* Return the next nnn bits of input. All reads from the compressed input
+ are done through this function. All reads are big endian */
+static unsigned int get_bits( bunzip_data *bd, char bits_wanted )
+{
+ unsigned int bits = 0;
+
+ /* If we need to get more data from the byte buffer, do so. (Loop getting
+ one byte at a time to enforce endianness and avoid unaligned access.) */
+ while ( bd->inbufBitCount < bits_wanted )
+ {
+ /* If we need to read more data from file into byte buffer, do so */
+ if ( bd->inbufPos == bd->inbufCount )
+ {
+ if ( ( bd->inbufCount = read( bd->in_fd, bd->inbuf, IOBUF_SIZE ) ) <= 0 )
+ longjmp( bd->jmpbuf, RETVAL_UNEXPECTED_INPUT_EOF );
+ bd->inbufPos = 0;
+ }
+ /* Avoid 32-bit overflow (dump bit buffer to top of output) */
+ if ( bd->inbufBitCount >= 24 )
+ {
+ bits = bd->inbufBits & ( ( 1 << bd->inbufBitCount ) - 1 );
+ bits_wanted -= bd->inbufBitCount;
+ bits <<= bits_wanted;
+ bd->inbufBitCount = 0;
+ }
+ /* Grab next 8 bits of input from buffer. */
+ bd->inbufBits = ( bd->inbufBits << 8 ) | bd->inbuf[bd->inbufPos++];
+ bd->inbufBitCount += 8;
+ }
+ /* Calculate result */
+ bd->inbufBitCount -= bits_wanted;
+ bits |= ( bd->inbufBits >> bd->inbufBitCount ) & ( ( 1 << bits_wanted ) - 1 );
+
+ return bits;
+}
+
+/* Unpacks the next block and sets up for the inverse burrows-wheeler step. */
+
+static int get_next_block( bunzip_data *bd )
+{
+ struct group_data *hufGroup;
+ int dbufCount, nextSym, dbufSize, groupCount, *base, *limit, selector,
+ i, j, k, t, runPos, symCount, symTotal, nSelectors, byteCount[256];
+ unsigned char uc, symToByte[256], mtfSymbol[256], *selectors;
+ unsigned int *dbuf, origPtr;
+
+ dbuf = bd->dbuf;
+ dbufSize = bd->dbufSize;
+ selectors = bd->selectors;
+ /* Reset longjmp I/O error handling */
+ i = setjmp( bd->jmpbuf );
+ if ( i ) return i;
+ /* Read in header signature and CRC, then validate signature.
+ (last block signature means CRC is for whole file, return now) */
+ i = get_bits( bd, 24 );
+ j = get_bits( bd, 24 );
+ bd->headerCRC = get_bits( bd, 32 );
+ if ( ( i == 0x177245 ) && ( j == 0x385090 ) ) return RETVAL_LAST_BLOCK;
+ if ( ( i != 0x314159 ) || ( j != 0x265359 ) ) return RETVAL_NOT_BZIP_DATA;
+ /* We can add support for blockRandomised if anybody complains. There was
+ some code for this in busybox 1.0.0-pre3, but nobody ever noticed that
+ it didn't actually work. */
+ if ( get_bits( bd, 1 ) ) return RETVAL_OBSOLETE_INPUT;
+ if ( ( origPtr = get_bits( bd, 24 ) ) > dbufSize ) return RETVAL_DATA_ERROR;
+ /* mapping table: if some byte values are never used (encoding things
+ like ascii text), the compression code removes the gaps to have fewer
+ symbols to deal with, and writes a sparse bitfield indicating which
+ values were present. We make a translation table to convert the symbols
+ back to the corresponding bytes. */
+ t = get_bits( bd, 16 );
+ symTotal = 0;
+ for ( i = 0;i < 16;i++ )
+ {
+ if ( t&( 1 << ( 15 - i ) ) )
+ {
+ k = get_bits( bd, 16 );
+ for ( j = 0;j < 16;j++ )
+ if ( k&( 1 << ( 15 - j ) ) ) symToByte[symTotal++] = ( 16 * i ) + j;
+ }
+ }
+ /* How many different huffman coding groups does this block use? */
+ groupCount = get_bits( bd, 3 );
+ if ( groupCount < 2 || groupCount > MAX_GROUPS ) return RETVAL_DATA_ERROR;
+ /* nSelectors: Every GROUP_SIZE many symbols we select a new huffman coding
+ group. Read in the group selector list, which is stored as MTF encoded
+ bit runs. (MTF=Move To Front, as each value is used it's moved to the
+ start of the list.) */
+ if ( !( nSelectors = get_bits( bd, 15 ) ) ) return RETVAL_DATA_ERROR;
+ for ( i = 0; i < groupCount; i++ ) mtfSymbol[i] = i;
+ for ( i = 0; i < nSelectors; i++ )
+ {
+ /* Get next value */
+ for ( j = 0;get_bits( bd, 1 );j++ ) if ( j >= groupCount ) return RETVAL_DATA_ERROR;
+ /* Decode MTF to get the next selector */
+ uc = mtfSymbol[j];
+ for ( ;j;j-- ) mtfSymbol[j] = mtfSymbol[j-1];
+ mtfSymbol[0] = selectors[i] = uc;
+ }
+ /* Read the huffman coding tables for each group, which code for symTotal
+ literal symbols, plus two run symbols (RUNA, RUNB) */
+ symCount = symTotal + 2;
+ for ( j = 0; j < groupCount; j++ )
+ {
+ unsigned char length[MAX_SYMBOLS], temp[MAX_HUFCODE_BITS+1];
+ int minLen, maxLen, pp;
+ /* Read huffman code lengths for each symbol. They're stored in
+ a way similar to mtf; record a starting value for the first symbol,
+ and an offset from the previous value for everys symbol after that.
+ (Subtracting 1 before the loop and then adding it back at the end is
+ an optimization that makes the test inside the loop simpler: symbol
+ length 0 becomes negative, so an unsigned inequality catches it.) */
+ t = get_bits( bd, 5 ) - 1;
+ for ( i = 0; i < symCount; i++ )
+ {
+ for ( ;; )
+ {
+ if ( ( ( unsigned )t ) > ( MAX_HUFCODE_BITS - 1 ) )
+ return RETVAL_DATA_ERROR;
+ /* If first bit is 0, stop. Else second bit indicates whether
+ to increment or decrement the value. Optimization: grab 2
+ bits and unget the second if the first was 0. */
+ k = get_bits( bd, 2 );
+ if ( k < 2 )
+ {
+ bd->inbufBitCount++;
+ break;
+ }
+ /* Add one if second bit 1, else subtract 1. Avoids if/else */
+ t += ( ( ( k + 1 ) & 2 ) - 1 );
+ }
+ /* Correct for the initial -1, to get the final symbol length */
+ length[i] = t + 1;
+ }
+ /* Find largest and smallest lengths in this group */
+ minLen = maxLen = length[0];
+ for ( i = 1; i < symCount; i++ )
+ {
+ if ( length[i] > maxLen ) maxLen = length[i];
+ else if ( length[i] < minLen ) minLen = length[i];
+ }
+ /* Calculate permute[], base[], and limit[] tables from length[].
+ *
+ * permute[] is the lookup table for converting huffman coded symbols
+ * into decoded symbols. base[] is the amount to subtract from the
+ * value of a huffman symbol of a given length when using permute[].
+ *
+ * limit[] indicates the largest numerical value a symbol with a given
+ * number of bits can have. This is how the huffman codes can vary in
+ * length: each code with a value>limit[length] needs another bit.
+ */
+ hufGroup = bd->groups + j;
+ hufGroup->minLen = minLen;
+ hufGroup->maxLen = maxLen;
+ /* Note that minLen can't be smaller than 1, so we adjust the base
+ and limit array pointers so we're not always wasting the first
+ entry. We do this again when using them (during symbol decoding).*/
+ base = hufGroup->base - 1;
+ limit = hufGroup->limit - 1;
+ /* Calculate permute[]. Concurently, initialize temp[] and limit[]. */
+ pp = 0;
+ for ( i = minLen;i <= maxLen;i++ )
+ {
+ temp[i] = limit[i] = 0;
+ for ( t = 0;t < symCount;t++ )
+ if ( length[t] == i ) hufGroup->permute[pp++] = t;
+ }
+ /* Count symbols coded for at each bit length */
+ for ( i = 0;i < symCount;i++ ) temp[length[i]]++;
+ /* Calculate limit[] (the largest symbol-coding value at each bit
+ * length, which is (previous limit<<1)+symbols at this level), and
+ * base[] (number of symbols to ignore at each bit length, which is
+ * limit minus the cumulative count of symbols coded for already). */
+ pp = t = 0;
+ for ( i = minLen; i < maxLen; i++ )
+ {
+ pp += temp[i];
+ /* We read the largest possible symbol size and then unget bits
+ after determining how many we need, and those extra bits could
+ be set to anything. (They're noise from future symbols.) At
+ each level we're really only interested in the first few bits,
+ so here we set all the trailing to-be-ignored bits to 1 so they
+ don't affect the value>limit[length] comparison. */
+ limit[i] = ( pp << ( maxLen - i ) ) - 1;
+ pp <<= 1;
+ base[i+1] = pp - ( t += temp[i] );
+ }
+ limit[maxLen+1] = INT_MAX; /* Sentinal value for reading next sym. */
+ limit[maxLen] = pp + temp[maxLen] - 1;
+ base[minLen] = 0;
+ }
+ /* We've finished reading and digesting the block header. Now read this
+ block's huffman coded symbols from the file and undo the huffman coding
+ and run length encoding, saving the result into dbuf[dbufCount++]=uc */
+
+ /* Initialize symbol occurrence counters and symbol Move To Front table */
+ for ( i = 0;i < 256;i++ )
+ {
+ byteCount[i] = 0;
+ mtfSymbol[i] = ( unsigned char )i;
+ }
+ /* Loop through compressed symbols. */
+ runPos = dbufCount = symCount = selector = 0;
+ for ( ;; )
+ {
+ /* Determine which huffman coding group to use. */
+ if ( !( symCount-- ) )
+ {
+ symCount = GROUP_SIZE - 1;
+ if ( selector >= nSelectors ) return RETVAL_DATA_ERROR;
+ hufGroup = bd->groups + selectors[selector++];
+ base = hufGroup->base - 1;
+ limit = hufGroup->limit - 1;
+ }
+ /* Read next huffman-coded symbol. */
+ /* Note: It is far cheaper to read maxLen bits and back up than it is
+ to read minLen bits and then an additional bit at a time, testing
+ as we go. Because there is a trailing last block (with file CRC),
+ there is no danger of the overread causing an unexpected EOF for a
+ valid compressed file. As a further optimization, we do the read
+ inline (falling back to a call to get_bits if the buffer runs
+ dry). The following (up to got_huff_bits:) is equivalent to
+ j=get_bits(bd,hufGroup->maxLen);
+ */
+ while ( bd->inbufBitCount < hufGroup->maxLen )
+ {
+ if ( bd->inbufPos == bd->inbufCount )
+ {
+ j = get_bits( bd, hufGroup->maxLen );
+ goto got_huff_bits;
+ }
+ bd->inbufBits = ( bd->inbufBits << 8 ) | bd->inbuf[bd->inbufPos++];
+ bd->inbufBitCount += 8;
+ };
+ bd->inbufBitCount -= hufGroup->maxLen;
+ j = ( bd->inbufBits >> bd->inbufBitCount ) & ( ( 1 << hufGroup->maxLen ) - 1 );
+got_huff_bits:
+ /* Figure how how many bits are in next symbol and unget extras */
+ i = hufGroup->minLen;
+ while ( j > limit[i] ) ++i;
+ bd->inbufBitCount += ( hufGroup->maxLen - i );
+ /* Huffman decode value to get nextSym (with bounds checking) */
+ if ( ( i > hufGroup->maxLen )
+ || ( ( ( unsigned )( j = ( j >> ( hufGroup->maxLen - i ) ) - base[i] ) )
+ >= MAX_SYMBOLS ) )
+ return RETVAL_DATA_ERROR;
+ nextSym = hufGroup->permute[j];
+ /* We have now decoded the symbol, which indicates either a new literal
+ byte, or a repeated run of the most recent literal byte. First,
+ check if nextSym indicates a repeated run, and if so loop collecting
+ how many times to repeat the last literal. */
+ if ( ( ( unsigned )nextSym ) <= SYMBOL_RUNB )
+ { /* RUNA or RUNB */
+ /* If this is the start of a new run, zero out counter */
+ if ( !runPos )
+ {
+ runPos = 1;
+ t = 0;
+ }
+ /* Neat trick that saves 1 symbol: instead of or-ing 0 or 1 at
+ each bit position, add 1 or 2 instead. For example,
+ 1011 is 1<<0 + 1<<1 + 2<<2. 1010 is 2<<0 + 2<<1 + 1<<2.
+ You can make any bit pattern that way using 1 less symbol than
+ the basic or 0/1 method (except all bits 0, which would use no
+ symbols, but a run of length 0 doesn't mean anything in this
+ context). Thus space is saved. */
+ t += ( runPos << nextSym ); /* +runPos if RUNA; +2*runPos if RUNB */
+ runPos <<= 1;
+ continue;
+ }
+ /* When we hit the first non-run symbol after a run, we now know
+ how many times to repeat the last literal, so append that many
+ copies to our buffer of decoded symbols (dbuf) now. (The last
+ literal used is the one at the head of the mtfSymbol array.) */
+ if ( runPos )
+ {
+ runPos = 0;
+ if ( dbufCount + t >= dbufSize ) return RETVAL_DATA_ERROR;
+
+ uc = symToByte[mtfSymbol[0]];
+ byteCount[uc] += t;
+ while ( t-- ) dbuf[dbufCount++] = uc;
+ }
+ /* Is this the terminating symbol? */
+ if ( nextSym > symTotal ) break;
+ /* At this point, nextSym indicates a new literal character. Subtract
+ one to get the position in the MTF array at which this literal is
+ currently to be found. (Note that the result can't be -1 or 0,
+ because 0 and 1 are RUNA and RUNB. But another instance of the
+ first symbol in the mtf array, position 0, would have been handled
+ as part of a run above. Therefore 1 unused mtf position minus
+ 2 non-literal nextSym values equals -1.) */
+ if ( dbufCount >= dbufSize ) return RETVAL_DATA_ERROR;
+ i = nextSym - 1;
+ uc = mtfSymbol[i];
+ /* Adjust the MTF array. Since we typically expect to move only a
+ * small number of symbols, and are bound by 256 in any case, using
+ * memmove here would typically be bigger and slower due to function
+ * call overhead and other assorted setup costs. */
+ do
+ {
+ mtfSymbol[i] = mtfSymbol[i-1];
+ }
+ while ( --i );
+ mtfSymbol[0] = uc;
+ uc = symToByte[uc];
+ /* We have our literal byte. Save it into dbuf. */
+ byteCount[uc]++;
+ dbuf[dbufCount++] = ( unsigned int )uc;
+ }
+ /* At this point, we've read all the huffman-coded symbols (and repeated
+ runs) for this block from the input stream, and decoded them into the
+ intermediate buffer. There are dbufCount many decoded bytes in dbuf[].
+ Now undo the Burrows-Wheeler transform on dbuf.
+ See http://dogma.net/markn/articles/bwt/bwt.htm
+ */
+ /* Turn byteCount into cumulative occurrence counts of 0 to n-1. */
+ j = 0;
+ for ( i = 0;i < 256;i++ )
+ {
+ k = j + byteCount[i];
+ byteCount[i] = j;
+ j = k;
+ }
+ /* Figure out what order dbuf would be in if we sorted it. */
+ for ( i = 0;i < dbufCount;i++ )
+ {
+ uc = ( unsigned char )( dbuf[i] & 0xff );
+ dbuf[byteCount[uc]] |= ( i << 8 );
+ byteCount[uc]++;
+ }
+ /* Decode first byte by hand to initialize "previous" byte. Note that it
+ doesn't get output, and if the first three characters are identical
+ it doesn't qualify as a run (hence writeRunCountdown=5). */
+ if ( dbufCount )
+ {
+ if ( origPtr >= dbufCount ) return RETVAL_DATA_ERROR;
+ bd->writePos = dbuf[origPtr];
+ bd->writeCurrent = ( unsigned char )( bd->writePos & 0xff );
+ bd->writePos >>= 8;
+ bd->writeRunCountdown = 5;
+ }
+ bd->writeCount = dbufCount;
+
+ return RETVAL_OK;
+}
+
+/* Undo burrows-wheeler transform on intermediate buffer to produce output.
+ If start_bunzip was initialized with out_fd=-1, then up to len bytes of
+ data are written to outbuf. Return value is number of bytes written or
+ error (all errors are negative numbers). If out_fd!=-1, outbuf and len
+ are ignored, data is written to out_fd and return is RETVAL_OK or error.
+*/
+
+extern int read_bunzip( bunzip_data *bd, char *outbuf, int len )
+{
+ const unsigned int *dbuf;
+ int pos, current, previous, gotcount;
+
+ /* If last read was short due to end of file, return last block now */
+ if ( bd->writeCount < 0 ) return bd->writeCount;
+
+ gotcount = 0;
+ dbuf = bd->dbuf;
+ pos = bd->writePos;
+ current = bd->writeCurrent;
+
+ /* We will always have pending decoded data to write into the output
+ buffer unless this is the very first call (in which case we haven't
+ huffman-decoded a block into the intermediate buffer yet). */
+
+ if ( bd->writeCopies )
+ {
+ /* Inside the loop, writeCopies means extra copies (beyond 1) */
+ --bd->writeCopies;
+ /* Loop outputting bytes */
+ for ( ;; )
+ {
+ /* If the output buffer is full, snapshot state and return */
+ if ( gotcount >= len )
+ {
+ bd->writePos = pos;
+ bd->writeCurrent = current;
+ bd->writeCopies++;
+ return len;
+ }
+ /* Write next byte into output buffer, updating CRC */
+ outbuf[gotcount++] = current;
+ bd->writeCRC = ( ( ( bd->writeCRC ) << 8 )
+ ^ bd->crc32Table[( ( bd->writeCRC )>>24 )^current] );
+ /* Loop now if we're outputting multiple copies of this byte */
+ if ( bd->writeCopies )
+ {
+ --bd->writeCopies;
+ continue;
+ }
+decode_next_byte:
+ if ( !bd->writeCount-- ) break;
+ /* Follow sequence vector to undo Burrows-Wheeler transform */
+ previous = current;
+ pos = dbuf[pos];
+ current = pos & 0xff;
+ pos >>= 8;
+ /* After 3 consecutive copies of the same byte, the 4th is a repeat
+ count. We count down from 4 instead
+ * of counting up because testing for non-zero is faster */
+ if ( --bd->writeRunCountdown )
+ {
+ if ( current != previous ) bd->writeRunCountdown = 4;
+ }
+ else
+ {
+ /* We have a repeated run, this byte indicates the count */
+ bd->writeCopies = current;
+ current = previous;
+ bd->writeRunCountdown = 5;
+ /* Sometimes there are just 3 bytes (run length 0) */
+ if ( !bd->writeCopies ) goto decode_next_byte;
+ /* Subtract the 1 copy we'd output anyway to get extras */
+ --bd->writeCopies;
+ }
+ }
+ /* Decompression of this block completed successfully */
+ bd->writeCRC = ~bd->writeCRC;
+ bd->totalCRC = ( ( bd->totalCRC << 1 ) | ( bd->totalCRC >> 31 ) ) ^ bd->writeCRC;
+ /* If this block had a CRC error, force file level CRC error. */
+ if ( bd->writeCRC != bd->headerCRC )
+ {
+ bd->totalCRC = bd->headerCRC + 1;
+ return RETVAL_LAST_BLOCK;
+ }
+ }
+
+ /* Refill the intermediate buffer by huffman-decoding next block of input */
+ /* (previous is just a convenient unused temp variable here) */
+ previous = get_next_block( bd );
+ if ( previous )
+ {
+ bd->writeCount = previous;
+ return ( previous != RETVAL_LAST_BLOCK ) ? previous : gotcount;
+ }
+ bd->writeCRC = 0xffffffffUL;
+ pos = bd->writePos;
+ current = bd->writeCurrent;
+ goto decode_next_byte;
+}
+
+/* Allocate the structure, read file header. If in_fd==-1, inbuf must contain
+ a complete bunzip file (len bytes long). If in_fd!=-1, inbuf and len are
+ ignored, and data is read from file handle into temporary buffer. */
+extern int start_bunzip( bunzip_data **bdp, int in_fd, char *inbuf, int len )
+{
+ bunzip_data *bd;
+ unsigned int i, j, c;
+ const unsigned int BZh0 = ( ( ( unsigned int )'B' ) << 24 ) + ( ( ( unsigned int )'Z' ) << 16 )
+ + ( ( ( unsigned int )'h' ) << 8 ) + ( unsigned int )'0';
+
+ /* Figure out how much data to allocate */
+ i = sizeof( bunzip_data );
+ if ( in_fd != -1 ) i += IOBUF_SIZE;
+ /* Allocate bunzip_data. Most fields initialize to zero. */
+ if ( !( bd = *bdp = malloc( i ) ) ) return RETVAL_OUT_OF_MEMORY;
+ memset( bd, 0, sizeof( bunzip_data ) );
+ /* Setup input buffer */
+ if ( -1 == ( bd->in_fd = in_fd ) )
+ {
+ bd->inbuf = inbuf;
+ bd->inbufCount = len;
+ }
+ else bd->inbuf = ( unsigned char * )( bd + 1 );
+ /* Init the CRC32 table (big endian) */
+ for ( i = 0;i < 256;i++ )
+ {
+ c = i << 24;
+ for ( j = 8;j;j-- )
+ c = c & 0x80000000 ? ( c << 1 ) ^ 0x04c11db7 : ( c << 1 );
+ bd->crc32Table[i] = c;
+ }
+ /* Setup for I/O error handling via longjmp */
+ i = setjmp( bd->jmpbuf );
+ if ( i ) return i;
+
+ /* Ensure that file starts with "BZh['1'-'9']." */
+ i = get_bits( bd, 32 );
+ if ( ( ( unsigned int )( i - BZh0 - 1 ) ) >= 9 ) return RETVAL_NOT_BZIP_DATA;
+
+ /* Fourth byte (ascii '1'-'9'), indicates block size in units of 100k of
+ uncompressed data. Allocate intermediate buffer for block. */
+ bd->dbufSize = 100000 * ( i - BZh0 );
+
+ if ( !( bd->dbuf = malloc( bd->dbufSize * sizeof( int ) ) ) )
+ return RETVAL_OUT_OF_MEMORY;
+ return RETVAL_OK;
+}
+
+/* Example usage: decompress src_fd to dst_fd. (Stops at end of bzip data,
+ not end of file.) */
+extern int uncompressStream( int src_fd, int dst_fd )
+{
+ char *outbuf;
+ bunzip_data *bd;
+ int i;
+
+ if ( !( outbuf = malloc( IOBUF_SIZE ) ) ) return RETVAL_OUT_OF_MEMORY;
+ if ( !( i = start_bunzip( &bd, src_fd, 0, 0 ) ) )
+ {
+ for ( ;; )
+ {
+ if ( ( i = read_bunzip( bd, outbuf, IOBUF_SIZE ) ) <= 0 ) break;
+ if ( i != write( dst_fd, outbuf, i ) )
+ {
+ i = RETVAL_UNEXPECTED_OUTPUT_EOF;
+ break;
+ }
+ }
+ }
+ /* Check CRC and release memory */
+ if ( i == RETVAL_LAST_BLOCK && bd->headerCRC == bd->totalCRC ) i = RETVAL_OK;
+ if ( bd->dbuf ) free( bd->dbuf );
+ free( bd );
+ free( outbuf );
+ return i;
+}
+
+#ifdef TESTING
+
+static char * const bunzip_errors[] =
+ {
+ NULL, "Bad file checksum", "Not bzip data",
+ "Unexpected input EOF", "Unexpected output EOF", "Data error",
+ "Out of memory", "Obsolete (pre 0.9.5) bzip format not supported."
+ };
+
+/* Dumb little test thing, decompress stdin to stdout */
+int main( int argc, char *argv[] )
+{
+ int i = uncompressStream( 0, 1 );
+ char c;
+
+ if ( i ) fprintf( stderr, "%s\n", bunzip_errors[-i] );
+ else if ( read( 0, &c, 1 ) ) fprintf( stderr, "Trailing garbage ignored\n" );
+ return -i;
+}
+#endif
diff --git a/seek-bzip2/seek-bunzip b/seek-bzip2/seek-bunzip
new file mode 100755
index 0000000..81e324c
--- /dev/null
+++ b/seek-bzip2/seek-bunzip
Binary files differ
diff --git a/seek-bzip2/seek-bunzip.c b/seek-bzip2/seek-bunzip.c
new file mode 100644
index 0000000..cbfda73
--- /dev/null
+++ b/seek-bzip2/seek-bunzip.c
@@ -0,0 +1,95 @@
+#include <setjmp.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "micro-bunzip.h"
+
+#define BUF_SIZE 8192
+
+/**
+ * Seek the bunzip_data `bz` to a specific position in bits `pos` by lseeking
+ * the underlying file descriptor and priming the buffer with appropriate
+ * bits already consumed. This probably only makes sense for seeking to the
+ * start of a compressed block.
+ */
+unsigned int seek_bits( bunzip_data *bd, unsigned long pos )
+{
+ off_t n_byte = pos / 8;
+ char n_bit = pos % 8;
+
+ // Seek the underlying file descriptor
+ if ( lseek( bd->in_fd, n_byte, SEEK_SET ) != n_byte )
+ {
+ return -1;
+ }
+
+ // Init the buffer at the right bit position
+ bd->inbufBitCount = bd->inbufPos = bd->inbufCount = 0;
+ get_bits( bd, n_bit );
+
+ // // Update the bit position counter to match
+ // bd->inPosBits = pos;
+
+ return pos;
+}
+
+/* Open, seek to block at pos, and uncompress */
+
+int uncompressblock( int src_fd, unsigned long pos )
+{
+ bunzip_data *bd;
+ int status;
+ int gotcount;
+ char outbuf[BUF_SIZE];
+
+ if ( !( status = start_bunzip( &bd, src_fd, 0, 0 ) ) )
+ {
+ seek_bits( bd, pos );
+
+ /* Fill the decode buffer for the block */
+ if ( ( status = get_next_block( bd ) ) )
+ goto seek_bunzip_finish;
+
+ /* Init the CRC for writing */
+ bd->writeCRC = 0xffffffffUL;
+
+ /* Zero this so the current byte from before the seek is not written */
+ bd->writeCopies = 0;
+
+ /* Decompress the block and write to stdout */
+ for ( ; ; )
+ {
+ gotcount = read_bunzip( bd, outbuf, BUF_SIZE );
+ if ( gotcount < 0 )
+ {
+ status = gotcount;
+ break;
+ }
+ else if ( gotcount == 0 )
+ {
+ break;
+ }
+ else
+ {
+ write( 1, outbuf, gotcount );
+ }
+ }
+ }
+
+seek_bunzip_finish:
+
+ if ( bd->dbuf ) free( bd->dbuf );
+ free( bd );
+
+ return status;
+}
+
+int main( int argc, char *argv[] )
+{
+ unsigned long pos = atol( argv[1] );
+ int status = uncompressblock( 0, pos );
+ if ( status )
+ fprintf( stderr, "\n%s\n", bunzip_errors[-status] );
+} \ No newline at end of file
diff --git a/seek-bzip2/seek-bunzip.o b/seek-bzip2/seek-bunzip.o
new file mode 100644
index 0000000..7f75c9c
--- /dev/null
+++ b/seek-bzip2/seek-bunzip.o
Binary files differ
diff --git a/server.py b/server.py
new file mode 100755
index 0000000..14c0827
--- /dev/null
+++ b/server.py
@@ -0,0 +1,993 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007, One Laptop Per Child
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+# Web server script for Wikiserver project.
+#
+# Usage: server.py <dbfile> <port>
+#
+## Standard libs
+from __future__ import with_statement
+import logging
+import sys
+import os
+import platform
+import select
+import codecs
+import BaseHTTPServer
+from SimpleHTTPServer import SimpleHTTPRequestHandler
+import SocketServer
+import socket
+
+import cgi
+import errno
+import urllib
+import tempfile
+import re
+try:
+ from hashlib import md5
+except ImportError:
+ from md5 import md5
+
+import dataretriever
+import pylru
+import simplejson
+
+##
+## Libs we ship -- add lib path for
+## shared objects
+##
+_root_path = os.path.dirname(__file__)
+# linux32_27" for Linux 32bits Python 2.7
+system_id = "%s%s" % (platform.system().lower(),
+ platform.architecture()[0][0:2])
+if platform.processor().startswith('arm'):
+ system_id = platform.processor()
+
+platform_dir = "%s_%s%s" % (system_id,
+ sys.version_info[0], # major
+ sys.version_info[1]) # minor
+
+sys.path.append(os.path.join(_root_path, 'binarylibs', platform_dir))
+
+import mwlib.htmlwriter
+from mwlib import parser, scanner, expander
+
+# Uncomment to print out a large dump from the template expander.
+#os.environ['DEBUG_EXPANDER'] = '1'
+
+
+class MyHTTPServer(BaseHTTPServer.HTTPServer):
+ def serve_forever(self, poll_interval=0.5):
+ """Overridden version of BaseServer.serve_forever that does not fail
+ to work when EINTR is received.
+ """
+ self._BaseServer__serving = True
+ self._BaseServer__is_shut_down.clear()
+ while self._BaseServer__serving:
+
+ # XXX: Consider using another file descriptor or
+ # connecting to the socket to wake this up instead of
+ # polling. Polling reduces our responsiveness to a
+ # shutdown request and wastes cpu at all other times.
+ try:
+ r, w, e = select.select([self], [], [], poll_interval)
+ except select.error, e:
+ if e[0] == errno.EINTR:
+ logging.debug("got eintr")
+ continue
+ raise
+ if r:
+ self._handle_request_noblock()
+ self._BaseServer__is_shut_down.set()
+
+ def server_bind(self):
+ """Override server_bind in HTTPServer to not use
+ getfqdn to get the server name because is very slow."""
+ SocketServer.TCPServer.server_bind(self)
+ host, port = self.socket.getsockname()[:2]
+ self.server_name = 'localhost'
+ self.server_port = port
+
+
+class WPWikiDB:
+ """Retrieves article contents for mwlib."""
+
+ def __init__(self, path, lang, templateprefix, templateblacklist):
+ self.lang = lang
+ self.templateprefix = templateprefix
+ self.templateblacklist = templateblacklist
+ self.dataretriever = dataretriever.DataRetriever(system_id, path)
+ self.templates_cache = {'!' : '|', u'!': '|'} # a special case
+
+ def getRawArticle(self, title, followRedirects=True):
+
+ # Retrieve article text, recursively following #redirects.
+ if title == '':
+ return ''
+
+ article_text = \
+ self.dataretriever.get_text_article(title).decode('utf-8')
+
+ # Stripping leading & trailing whitespace fixes template expansion.
+ article_text = article_text.lstrip()
+ article_text = article_text.rstrip()
+
+ return article_text
+
+ def getTemplate(self, title, followRedirects=False):
+ if title in self.templates_cache:
+ return self.templates_cache[title]
+ else:
+ try:
+ template_content = self.getRawArticle(title)
+ # check recursion in templates
+ template_name = title[title.find(':') + 1:]
+
+ # Remove <noinclude> because expandtemplates doesn't detect it
+ # and follow recursions
+ lower_content = template_content.lower()
+ start_noinclude = lower_content.find('<noinclude>')
+ while start_noinclude > -1:
+ end_noinclude = lower_content.find('</noinclude>')
+ content = template_content[:start_noinclude]
+ if end_noinclude > -1:
+ content = content + template_content[end_noinclude + \
+ len('</noinclude>'):]
+ template_content = content
+ lower_content = template_content.lower()
+ start_noinclude = lower_content.find('<noinclude>')
+
+ if re.search('{{' + template_name, template_content, \
+ re.IGNORECASE) is not None:
+ logging.error("Found recursion template %s" % title)
+ template_content = re.sub(template_name, '_not_found_',
+ template_content, re.IGNORECASE)
+
+ # Search again
+ if re.search('{{' + template_name, template_content, \
+ re.IGNORECASE) is not None:
+ template_content = ''
+
+ except:
+ template_content = ''
+
+ self.templates_cache[title] = template_content
+ return template_content
+
+ def expandArticle(self, article_text, title):
+ template_expander = expander.Expander(article_text, pagename=title,
+ wikidb=self, lang=self.lang,
+ templateprefix=self.templateprefix,
+ templateblacklist=self.templateblacklist)
+ expanded_article = template_expander.expandTemplates()
+
+ return expanded_article
+
+ def getExpandedArticle(self, title):
+ return self.expandArticle(self.getRawArticle(title), title)
+
+
+class WPImageDB:
+ """Retrieves images for mwlib."""
+ def __init__(self, basepath):
+ self.basepath = basepath
+
+ def hashpath(self, name):
+ name = name.replace(' ', '_')
+ name = name[:1].upper() + name[1:]
+ d = md5(name.encode('utf-8')).hexdigest()
+ return "/".join([d[0], d[:2], name])
+
+ def hashpath_dir(self, name):
+ name = name.replace(' ', '_')
+ name = name[:1].upper() + name[1:]
+ d = md5(name.encode('utf-8')).hexdigest()
+ return "/".join([d[0], d[:2]])
+
+ def getPath(self, name, size=None):
+ hashed_name = self.hashpath(name).encode('utf8')
+ path = self.basepath + '/%s' % hashed_name
+ return path
+
+ def getURL(self, name, size=None):
+ hashed_name = self.hashpath(name).encode('utf8')
+ if size is not None:
+ file_name = self.basepath + self.hashpath_dir(name) + '/' + \
+ ('%dpx-' % size) + name.replace(' ', '_')
+ else:
+ file_name = self.basepath + self.hashpath_dir(name) + '/' + \
+ name.replace(' ', '_')
+
+ if os.path.exists(file_name):
+ url = '/' + file_name
+ else:
+ if size is None:
+ url = 'http://upload.wikimedia.org/wikipedia/commons/' + \
+ hashed_name
+ else:
+ url = 'http://upload.wikimedia.org/wikipedia/commons/thumb/' \
+ + hashed_name + ('/%dpx-' % size) + name.replace(' ', '_')
+ if re.match(r'.*\.svg$', url, re.IGNORECASE):
+ url = url + '.png'
+
+ #print "getUrl: %s -> %s" % (name.encode('utf8'), url.encode('utf8'))
+ return url
+
+
+class HTMLOutputBuffer:
+ """Buffers output and converts to utf8 as needed."""
+
+ def __init__(self):
+ self.buffer = ''
+
+ def write(self, obj):
+ if isinstance(obj, unicode):
+ self.buffer += obj.encode('utf8')
+ else:
+ self.buffer += obj
+
+ def getvalue(self):
+ return self.buffer
+
+
+class WPMathRenderer:
+
+ def __init__(self, html_writer):
+ self.writer = html_writer
+
+ def render(self, latex):
+ logging.debug("MathRenderer %s" % latex)
+ latex = latex.replace('\f', '\\f')
+ latex = latex.replace('\t', '\\t')
+ # \bold gives a error
+ latex = latex.replace('\\bold', '')
+
+ # postpone the process to do it with javascript at client side
+ mathml = '<script type="math/tex">' + latex + '</script>'
+ self.writer.math_processed = True
+ return mathml
+
+
+class WPHTMLWriter(mwlib.htmlwriter.HTMLWriter):
+ """Customizes HTML output from mwlib."""
+
+ def __init__(self, dataretriever, wfile, images=None, lang='en'):
+ self.dataretriever = dataretriever
+ self.gallerylevel = 0
+ self.lang = lang
+ self.math_processed = False
+ self.links_list = []
+
+ math_renderer = WPMathRenderer(self)
+ mwlib.htmlwriter.HTMLWriter.__init__(self, wfile, images,
+ math_renderer=math_renderer)
+
+ def writeLink(self, obj):
+ if obj.target is None:
+ return
+
+ article = obj.target
+ #print "writeLink", article, obj.caption
+ if article.startswith('#'):
+ #print "----> <a href='%s'>" % article
+ self.out.write("<a href='%s'>" % article)
+ else:
+
+ # Parser appending '/' characters to link targets for some reason.
+ article = article.rstrip('/')
+
+ title = article
+ title = title[0].capitalize() + title[1:]
+ title = title.replace("_", " ")
+ self.links_list.append(article)
+
+ parts = article.encode('utf-8').split('#')
+ parts[0] = parts[0].replace(" ", "_")
+ url = ("#".join([x for x in parts]))
+
+ self.out.write("<a href='/wiki/%s'>" % url)
+
+ if obj.children:
+ for x in obj.children:
+ self.write(x)
+ else:
+ self._write(obj.target)
+
+ self.out.write("</a>")
+
+ def writeImageLink(self, obj):
+ if self.images is None:
+ return
+
+ width = obj.width
+ height = obj.height
+
+ is_svg = re.match(r'.*\.svg$', obj.target, re.IGNORECASE)
+ is_thumb = obj.thumb or obj.frame or (self.gallerylevel > 0)
+
+ if (width or height) or is_thumb:
+ max_length = max(width, height)
+ if obj.thumb:
+ max_length = 180
+ if self.gallerylevel > 0:
+ max_length = 120
+ path = self.images.getPath(obj.target, size=max_length)
+ url_thumb = self.images.getURL(obj.target, size=max_length)
+ url = self.images.getURL(obj.target)
+ else:
+ path = self.images.getPath(obj.target)
+ url_thumb = self.images.getURL(obj.target)
+ url = url_thumb
+
+ if url_thumb is None:
+ return
+
+ # The following HTML generation code is copied closely from InstaView,
+ # which seems to approximate the nest of <div> tags needed to render
+ # images close to right.
+ # It's also been extended to support Gallery tags.
+ if self.imglevel == 0:
+ self.imglevel += 1
+
+ align = obj.align
+ thumb = obj.thumb
+ frame = obj.frame
+ caption = obj.caption
+
+ # SVG images must be included using <object data=''> rather than
+ # <img src=''>.
+ if re.match(r'.*\.svg$', url_thumb, re.IGNORECASE):
+ tag = 'object'
+ ref = 'data'
+ else:
+ tag = 'img'
+ ref = 'src'
+
+ # Hack to get galleries to look okay, in the absence of image
+ # dimensions.
+ if self.gallerylevel > 0:
+ width = 120
+
+ if thumb and not width:
+ width = 180 # FIXME: This should not be hardcoded
+
+ attr = ''
+ if width:
+ attr += 'width="%d" ' % width
+
+ img = '<%(tag)s %(ref)s="%(url)s" longdesc="%(cap)s" %(att)s>' % \
+ {'tag': tag, 'ref': ref, 'url': url_thumb, 'cap': caption,
+ 'att': attr} + '</%(tag)s>' % {'tag': tag}
+
+ center = False
+ if align == 'center':
+ center = True
+ align = None
+
+ if center:
+ self.out.write('<div class="center">')
+
+ if self.gallerylevel > 0:
+ self.out.write('<div class="gallerybox" ' +
+ 'style="width: 155px;">')
+
+ self.out.write('<div class="thumb" ' +
+ 'style="padding: 13px 0; width: 150px;">')
+ self.out.write('<div style="margin-left: auto; ' +
+ 'margin-right: auto; width: 120px;">')
+ self.out.write('<a href="%s" class="image" title="%s">' %
+ (url, caption))
+ self.out.write(img)
+ self.out.write('</a>')
+ self.out.write('</div>')
+ self.out.write('</div>')
+
+ self.out.write('<div class="gallerytext">')
+ self.out.write('<p>')
+ for x in obj.children:
+ self.write(x)
+ self.out.write('</p>')
+ self.out.write('</div>')
+
+ self.out.write('</div>')
+ elif frame or thumb:
+ if not align:
+ align = "right"
+ self.out.write('<div class="thumb t%s">' % align)
+
+ if not width:
+ width = 180 # default thumb width
+ self.out.write('<div style="width:%dpx;">' % (int(width) + 2))
+
+ if thumb:
+ self.out.write(img)
+ self.out.write('<div class="thumbcaption">')
+ self.out.write('<div class="magnify" style="float:right">')
+ self.out.write('<a href="%s" class="internal" ' % url +
+ 'title="Enlarge">')
+ self.out.write('<img src="/static/magnify-clip.png">' +
+ '</img>')
+ self.out.write('</a>')
+ self.out.write('</div>')
+ for x in obj.children:
+ self.write(x)
+ self.out.write('</div>')
+ else:
+ self.out.write(img)
+ self.out.write('<div class="thumbcaption">')
+ for x in obj.children:
+ self.write(x)
+ self.out.write('</div>')
+
+ self.out.write('</div>')
+ self.out.write('</div>')
+ elif align:
+ self.out.write('<div class="float%s">' % align)
+ self.out.write(img)
+ self.out.write('</div>')
+ else:
+ self.out.write(img)
+
+ if center:
+ self.out.write('</div>')
+
+ self.imglevel -= 1
+ else:
+ self.out.write('<a href="%s">' % url.encode('utf8'))
+
+ for x in obj.children:
+ self.write(x)
+
+ self.out.write('</a>')
+
+ def writeTagNode(self, t):
+ if t.caption == 'gallery':
+ self.out.write('<table class="gallery" cellspacing="0" ' +
+ 'cellpadding="0">')
+
+ self.gallerylevel += 1
+
+ # TODO: More than one row.
+ self.out.write('<tr>')
+
+ for x in t.children:
+ self.out.write('<td>')
+ self.write(x)
+ self.out.write('</td>')
+
+ self.out.write('</tr>')
+
+ self.gallerylevel -= 1
+
+ self.out.write('</table>')
+ else:
+ # All others handled by base class.
+ mwlib.htmlwriter.HTMLWriter.writeTagNode(self, t)
+
+
+class WikiRequestHandler(SimpleHTTPRequestHandler):
+ def __init__(self, wikidb, conf, links_cache, request, client_address,
+ server):
+ # pullcord is currently offline
+ # self.reporturl = 'pullcord.laptop.org:8000'
+ self.reporturl = False
+ self.port = conf['port']
+ self.lang = conf['lang']
+ self.templateprefix = conf['templateprefix']
+ self.templateblacklist = set(conf['templateblacklist'])
+ self.wpheader = conf['wpheader']
+ self.wpfooter = conf['wpfooter']
+ self.resultstitle = conf['resultstitle']
+ self.base_path = os.path.dirname(conf['path'])
+ self.links_cache = links_cache
+
+ if 'editdir' in conf:
+ self.editdir = conf['editdir']
+ else:
+ self.editdir = False
+ if 'giturl' in conf:
+ self.giturl = conf['giturl']
+ else:
+ self.giturl = False
+
+ self.wikidb = wikidb
+
+ self.client_address = client_address
+
+ SimpleHTTPRequestHandler.__init__(
+ self, request, client_address, server)
+
+ def get_wikitext(self, title):
+ article_text = self.wikidb.getRawArticle(title)
+ #print article_text
+ if self.editdir:
+ edited = self.get_editedarticle(title)
+ if edited:
+ article_text = edited
+
+ # Pass ?override=1 in the url to replace wikitext for testing
+ # the renderer.
+ if self.params.get('override', 0):
+ override = codecs.open('override.txt', 'r', 'utf-8')
+ article_text = override.read()
+ override.close()
+
+ # Pass ?noexpand=1 in the url to disable template expansion.
+ if not self.params.get('noexpand', 0) \
+ and not self.params.get('edit', 0):
+ article_text = self.wikidb.expandArticle(article_text, title)
+
+ return article_text
+
+ def write_wiki_html(self, htmlout, title, article_text):
+ tokens = scanner.tokenize(article_text, title)
+
+ wiki_parsed = parser.Parser(tokens, title).parse()
+ wiki_parsed.caption = title
+
+ imagedb = WPImageDB(self.base_path + '/images/')
+ writer = WPHTMLWriter(self.wikidb.dataretriever, htmlout,
+ images=imagedb, lang=self.lang)
+ writer.write(wiki_parsed)
+ self.links_cache[title] = writer.links_list
+ return writer.math_processed
+
+ def send_article(self, title):
+ article_text = self.get_wikitext(title)
+
+ # Capitalize the first letter of the article -- Trac #6991.
+ title = title[0].capitalize() + title[1:]
+
+ # Replace underscores with spaces in title.
+ title = title.replace("_", " ")
+
+ # Redirect to Wikipedia if the article text is empty
+ # (e.g. an image link)
+ if article_text == "":
+ self.send_response(301)
+ self.send_header("Location",
+ 'http://' + self.lang + '.wikipedia.org/wiki/' +
+ title.encode('utf8'))
+ self.end_headers()
+ return
+
+ # Pass ?raw=1 in the URL to see the raw wikitext (post expansion,
+ # unless noexpand=1 is also set).
+ if self.params.get('raw', 0):
+ self.send_response(200)
+ self.send_header("Content-Type", "text/plain; charset=utf-8")
+ self.end_headers()
+
+ self.wfile.write(article_text.encode('utf8'))
+ elif self.params.get('edit', 0):
+ self.send_response(200)
+ self.send_header("Content-Type", "text/html; charset=utf-8")
+ self.end_headers()
+
+ self.wfile.write('<html><body><form method="POST">')
+ self.wfile.write('<input type="submit" value="OK"><br />')
+ self.wfile.write('<textarea name="wmcontent" rows="40" cols="80">')
+ htmlout = HTMLOutputBuffer()
+ htmlout.write(article_text.encode('utf8'))
+ self.wfile.write(htmlout.getvalue())
+ self.wfile.write("</textarea></form></body></html>")
+ else:
+ htmlout = HTMLOutputBuffer()
+
+ self.send_response(200)
+ self.send_header("Content-Type", "text/html; charset=utf-8")
+ self.end_headers()
+
+ htmlout.write('<html xmlns="http://www.w3.org/1999/xhtml"> ')
+
+ htmlout.write("<head>")
+ htmlout.write("<title>%s</title>" % title.encode('utf8'))
+
+ htmlout.write("<style type='text/css' media='screen, projection'>"
+ "@import '/static/common.css';"\
+ "@import '/static/monobook.css';"\
+ "@import '/static/styles.css';"\
+ "@import '/static/shared.css';"\
+ "</style>")
+
+ htmlout.write("</head>")
+
+ htmlout.write("<body>")
+
+ htmlout.write("<h1>")
+ htmlout.write(title)
+ htmlout.write(' <font size="1">&middot; <a class="offsite" ')
+ htmlout.write('href="http://' + self.lang + '.wikipedia.org/wiki/')
+ htmlout.write(title)
+ htmlout.write('">' + self.wpheader + '</a> ')
+
+ if self.reporturl:
+ # Report rendering problem.
+ htmlout.write('&middot; <a class="offsite" ')
+ htmlout.write('href="http://%s/render?q=' % self.reporturl)
+ htmlout.write(title)
+ htmlout.write('">Haz clic aquí si esta página contiene ' +
+ 'errores de presentación</a> ')
+
+ # Report inappropriate content.
+ htmlout.write(' &middot; <a class="offsite" ')
+ htmlout.write('href="http://%s/report?q=' % self.reporturl)
+ htmlout.write(title)
+ htmlout.write('">Esta página contiene material inapropiado' +
+ '</a>')
+
+ if self.editdir:
+ htmlout.write(' &middot; <a ')
+ htmlout.write('href="http://localhost:%s/wiki/' % self.port)
+ htmlout.write(title)
+ htmlout.write('?edit=true">[ Editar ]</a>')
+ htmlout.write(' &middot; <a ')
+ htmlout.write('href="http://localhost:%s/wiki/' % self.port)
+ htmlout.write(title)
+ htmlout.write('?edit=true">[ Vista OK ]</a>')
+ if self.giturl:
+ htmlout.write(' &middot; <a ')
+ htmlout.write('href="%s' % self.giturl)
+ htmlout.write(title)
+ htmlout.write('">[ Historial ]</a>')
+
+ htmlout.write("</font>")
+ htmlout.write('</h1>')
+
+ needs_math = self.write_wiki_html(htmlout, title, article_text)
+
+ if needs_math:
+ # MathJs config
+ htmlout.write('<script type="text/x-mathjax-config">')
+ htmlout.write(' MathJax.Hub.Config({')
+ htmlout.write(' extensions: [],')
+ htmlout.write(' jax: ["input/TeX","output/HTML-CSS"],')
+ htmlout.write(' "HTML-CSS": {')
+ htmlout.write(' availableFonts:[],')
+ htmlout.write(' styles: {".MathJax_Preview": ' +
+ '{visibility: "hidden"}}')
+ htmlout.write(' }')
+ htmlout.write(' });')
+ htmlout.write('</script>')
+
+ htmlout.write("<script type='text/javascript' " +
+ "src='http://localhost:8000/static/MathJax/MathJax.js'>" +
+ "</script>")
+
+ # validate links
+ self.write_process_links_js(htmlout, title)
+
+ htmlout.write('<center>' + self.wpfooter + '</center>')
+ htmlout.write("</body>")
+ htmlout.write("</html>")
+
+ html = htmlout.getvalue()
+
+ self.wfile.write(html)
+
+ def write_process_links_js(self, htmlout, title):
+ """
+ write javascript to request a array of external links using ajax
+ and compare with the links in the page, if one link is external
+ change the url and the className
+ """
+ htmlout.write("<script type='text/javascript'>\n")
+ htmlout.write(" xmlhttp=new XMLHttpRequest();\n")
+ htmlout.write(" xmlhttp.onreadystatechange=function() {\n")
+ htmlout.write(" if (xmlhttp.readyState==4 && " \
+ "xmlhttp.status==200) {\n")
+ htmlout.write(" external_links = eval(xmlhttp.responseText);\n")
+ htmlout.write(" for (var i = 0; i < document.links.length;" \
+ "i++) {\n")
+ htmlout.write(" link_url = document.links[i].href;\n")
+ htmlout.write(" last_bar = link_url.lastIndexOf('/');\n")
+ htmlout.write(" loc_article = link_url.substr(last_bar+1);\n")
+ htmlout.write(" external = false;\n")
+ htmlout.write(" for (var j = 0; j < external_links.length;" \
+ "j++) {\n")
+ htmlout.write(" external_link = external_links[j]\n")
+
+ htmlout.write(" if (loc_article == external_link) {\n")
+ htmlout.write(" external = true; break;}\n")
+ htmlout.write(" }\n")
+ htmlout.write(" if (external) {\n")
+ link_baseurl = 'http://' + self.lang + '.wikipedia.org/wiki/'
+ htmlout.write((" href = '%s'" % link_baseurl) + \
+ "+ external_links[j];\n")
+ htmlout.write(" document.links[i].href = href;\n")
+ htmlout.write(" document.links[i].className = 'offsite';\n")
+ htmlout.write(" }\n")
+ htmlout.write(" }\n")
+ htmlout.write(" }\n")
+ htmlout.write(" };\n")
+
+ val_links = "http://localhost:%s/links/%s" % (self.port, title)
+ htmlout.write(" xmlhttp.open('GET','%s',true);" % val_links)
+ htmlout.write(" xmlhttp.send();")
+ htmlout.write("</script>")
+
+ def send_links(self, title):
+ """
+ send a json array of string with the list of url not availables
+ in the local database
+ """
+ links = self.links_cache[title]
+ # validate the links
+ external_links = []
+ articles_found = self.wikidb.dataretriever.check_existence_list(links)
+ for article in links:
+ if not dataretriever.normalize_title(article) in articles_found:
+ article = article.replace(" ", "_").encode('utf8')
+ # needed to have the same format than url in the page
+ # when is compared in javascript
+ quoted = urllib.quote(article, safe='~@#$&()*!+=:;,.?/\'')
+ external_links.append(quoted)
+
+ self.send_response(200)
+ self.send_header("Content-Type", "text/html; charset=utf-8")
+ self.end_headers()
+ self.wfile.write(simplejson.dumps(external_links))
+
+ def do_POST(self):
+
+ real_path = urllib.unquote(self.path)
+ real_path = unicode(real_path, 'utf8')
+
+ (real_path, sep, param_text) = real_path.partition('?')
+
+ # Wiki requests return article contents or redirect to Wikipedia.
+ m = re.match(r'^/wiki/(.+)$', real_path)
+ if self.editdir and m:
+ title = m.group(1)
+
+ self._save_page(title)
+
+ self.send_response(200)
+ self.send_header("Content-Type", "text/html; charset=utf-8")
+ self.end_headers()
+
+ htmlout = HTMLOutputBuffer()
+ htmlout.write(title.encode('utf8'))
+
+ self.wfile.write('<html><body>Editado: ')
+ self.wfile.write('<a href="')
+
+ self.wfile.write(htmlout.getvalue())
+ self.wfile.write('">')
+ self.wfile.write(htmlout.getvalue())
+ self.wfile.write('</body></html>')
+
+ return
+
+ # Any other request redirects to the index page.
+ self.send_response(301)
+ self.send_header("Location", "/static/")
+ self.end_headers()
+
+ def _save_page(self, title):
+ formdata = cgi.FieldStorage(fp=self.rfile,
+ headers=self.headers, environ={'REQUEST_METHOD': 'POST'},
+ keep_blank_values=1)
+
+ user = formdata.getfirst('user')
+ comment = formdata.getfirst('comment')
+ wmcontent = formdata.getfirst('wmcontent')
+
+ # fix newlines
+ wmcontent = re.sub('\r', '', wmcontent)
+
+ fpath = self.getfpath('wiki', title)
+ # UGLY: racy.
+ if not os.path.exists(fpath):
+ self._saveorig(title)
+ (fh, tmpfpath) = tempfile.mkstemp(dir=os.path.dirname(fpath))
+ os.write(fh, wmcontent)
+ os.close(fh)
+ os.rename(tmpfpath, fpath)
+
+ return True
+
+ def getfpath(self, dir, title):
+ # may want to hash it
+ fpath = os.path.join(self.editdir, dir, title)
+ return fpath
+
+ def _saveorig(self, title):
+ article_text = self.wikidb.getRawArticle(title)
+ fpath = self.getfpath('wiki.orig', title)
+ fh = codecs.open(fpath, 'w', encoding='utf-8')
+ fh.write(article_text)
+ fh.close()
+
+ def get_editedarticle(self, title):
+ buf = None
+ fpath = self.getfpath('wiki', title)
+ if os.path.exists(fpath):
+ buf = codecs.open(fpath, 'r', encoding='utf-8').read()
+ return buf
+
+ def send_searchresult(self, title):
+ self.send_response(200)
+ self.send_header("Content-Type", "text/html; charset=utf-8")
+ self.end_headers()
+
+ self.wfile.write("<html><head><title>"
+ + (self.resultstitle % title.encode('utf8'))
+ + "</title></head>")
+
+ self.wfile.write("<style type='text/css' media='screen, projection'>"\
+ "@import '/static/monobook.css';</style>")
+
+ self.wfile.write("</head>")
+
+ self.wfile.write("<body>")
+
+ self.wfile.write("<h1>" + (self.resultstitle % title.encode('utf8'))
+ + "</h1>")
+ self.wfile.write("<ul>")
+
+ articles = self.search(unicode(title))
+ for article in articles:
+ #if not result.startswith(self.templateprefix):
+ self.wfile.write('<li><a href="/wiki/%s">%s</a></li>' %
+ (article.encode('utf8'), article.encode('utf8')))
+
+ self.wfile.write("</ul>")
+
+ self.wfile.write("</body></html>")
+
+ def search(self, article_title):
+ return self.wikidb.dataretriever.search(article_title)
+
+ def send_image(self, path):
+ if os.path.exists(path.encode('utf8')[1:]):
+ # If image exists locally, serve it as normal.
+ SimpleHTTPRequestHandler.do_GET(self)
+ else:
+ # If not, redirect to wikimedia.
+ redirect_url = "http://upload.wikimedia.org/wikipedia/commons/%s" \
+ % path.encode('utf8')
+ self.send_response(301)
+ self.send_header("Location", redirect_url.encode('utf8'))
+ self.end_headers()
+
+ def handle_feedback(self, feedtype, article):
+ with codecs.open("feedback.log", "a", "utf-8") as f:
+ f.write(feedtype + "\t" + article + "\t" +
+ self.client_address[0] + "\n")
+ f.close()
+ self.send_response(200)
+ self.send_header("Content-Type", "text/html; charset=utf-8")
+ self.end_headers()
+
+ if feedtype == "render":
+ strtype = "un error de presentación"
+ elif feedtype == "report":
+ strtype = "material inapropriado"
+
+ self.wfile.write("<html><title>Comentario recibido</title>" +
+ "Gracias por reportar %s en la pagina <b>%s</b>.</html>" %
+ (strtype, article.encode('utf8')))
+
+ def do_GET(self):
+ real_path = urllib.unquote(self.path)
+ real_path = unicode(real_path, 'utf8')
+
+ (real_path, sep, param_text) = real_path.partition('?')
+ self.params = {}
+ for p in param_text.split('&'):
+ (key, sep, value) = p.partition('=')
+ self.params[key] = value
+
+ # Wiki requests return article contents or redirect to Wikipedia.
+ m = re.match(r'^/wiki/(.+)$', real_path)
+ if m:
+ self.send_article(m.group(1))
+ return
+
+ # Search requests return search results.
+ m = re.match(r'^/search$', real_path)
+ if m:
+ self.send_searchresult(self.params.get('q', ''))
+ return
+
+ # Image requests are handled locally or are referenced from Wikipedia.
+ # matches /es_PE/images/, /en_US/images/ etc
+ m = re.match(r'^/\w*/images/(.+)$', real_path)
+ if m:
+ self.send_image(real_path)
+ return
+
+ # Static requests handed off to SimpleHTTPServer.
+ m = re.match(r'^/(static|generated)/(.*)$', real_path)
+ if m:
+ SimpleHTTPRequestHandler.do_GET(self)
+ return
+
+ # Handle link validation requests
+ m = re.match(r'^/links/(.*)$', real_path)
+ if m:
+ self.send_links(m.group(1))
+ return
+
+ # Feedback links.
+ m = re.match(r'^/(report|render)$', real_path)
+ if m:
+ self.handle_feedback(m.group(1), self.params.get('q', ''))
+ return
+
+ # Any other request redirects to the index page.
+ self.send_response(301)
+ self.send_header("Location", "/static/")
+ self.end_headers()
+
+
+def run_server(confvars):
+
+ if 'editdir' in confvars:
+ try:
+ for dir in ['wiki', 'wiki.orig']:
+ fdirpath = os.path.join(confvars['editdir'], dir)
+ if not os.path.exists(fdirpath):
+ os.mkdir(fdirpath)
+ except:
+ logging.error("Error setting up directories:")
+ logging.debug("%s must be a writable directory" %
+ confvars['editdir'])
+
+ blacklistpath = os.path.join(os.path.dirname(confvars['path']),
+ 'template_blacklist')
+ logging.debug("Reading template_blacklist %s" % blacklistpath)
+ blacklist = set()
+ if os.path.exists(blacklistpath):
+ with open(blacklistpath, 'r') as f:
+ for line in f.readlines():
+ blacklist.add(line.rstrip().decode('utf8'))
+ logging.debug("Read %d blacklisted templates" % len(blacklist))
+
+ confvars['templateblacklist'] = blacklist
+ confvars['lang'] = confvars['path'][0:2]
+ confvars['flang'] = os.path.basename(confvars['path'])[0:5]
+
+ wikidb = WPWikiDB(confvars['path'], confvars['lang'],
+ confvars['templateprefix'], confvars['templateblacklist'])
+
+ links_cache = pylru.lrucache(10)
+
+ httpd = MyHTTPServer(('', confvars['port']),
+ lambda *args: WikiRequestHandler(wikidb, confvars, links_cache, *args))
+
+ if confvars['comandline']:
+ httpd.serve_forever()
+ else:
+ from threading import Thread
+ server = Thread(target=httpd.serve_forever)
+ server.setDaemon(True)
+ logging.debug("Before start server")
+ server.start()
+ logging.debug("After start server")
+
+ # Tell the world that we're ready to accept request.
+ logging.debug('Ready')
+
+
+if __name__ == '__main__':
+
+ logging.error("Execute the starting class for your language wikipedia")
+ logging.error("Ex: activity_es.py")
diff --git a/setup.py b/setup.py
new file mode 100755
index 0000000..77c1b6e
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,144 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2007, One Laptop Per Child
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+from sugar.activity import bundlebuilder
+import sys
+import os
+import shutil
+import urllib2
+import subprocess
+import zipfile
+import ConfigParser
+import codecs
+
+
+def download_file(url):
+ web_file = urllib2.urlopen(url)
+ local_file_name = 'cache/' + url.split('/')[-1]
+ local_file = open(local_file_name, 'w')
+ chunk = 4096
+ while 1:
+ data = web_file.read(chunk)
+ if not data:
+ print "done."
+ break
+ local_file.write(data)
+ print ".",
+ web_file.close()
+ local_file.close()
+ return local_file_name
+
+if len(sys.argv) == 1:
+ print "Use ./setup prepare lang"
+ exit()
+
+prepare_ok = True
+if sys.argv[1] == 'prepare':
+ if len(sys.argv) < 3:
+ print 'You must select a language. For example: ./setup.py prepare es'
+ prepare_ok = False
+ else:
+ prepare_ok = False
+ language = sys.argv[2]
+ print "Preparing", language
+ config = ConfigParser.ConfigParser()
+ config.readfp(open('data_repository.cfg'))
+ data_repository = config.get('repository', 'url')
+
+ last_version = config.get('last_versions', language)
+ print "Check data", last_version
+ already_downloaded = False
+ if not os.path.exists('cache'):
+ os.mkdir('cache')
+
+ flag_file_name = 'download_complete.' + language
+ if os.path.exists(flag_file_name):
+ flag_file = open(flag_file_name, 'r')
+ for line in flag_file:
+ if line == last_version:
+ already_downloaded = True
+ flag_file.close()
+ if not already_downloaded:
+ url_data = data_repository + last_version
+ url_md5 = url_data.replace('.zip', '.md5sum')
+ print "Downloading data", url_data
+ print "md5 data", url_md5
+ local_md5_file_name = download_file(url_md5)
+ local_data_file_name = download_file(url_data)
+ else:
+ local_data_file_name = 'cache/' + last_version.split('/')[-1]
+ local_md5_file_name = local_data_file_name.replace('.zip', \
+ '.md5sum')
+
+ real_md5 = subprocess.check_output(['/usr/bin/md5sum', \
+ local_data_file_name])
+ real_md5_value = real_md5.split(' ')[0]
+ print "md5sum %s = %s" % (local_data_file_name, real_md5_value)
+ md5_ok = False
+ for line in open(local_md5_file_name):
+ if line.find(real_md5_value) == 0:
+ md5_ok = True
+ if md5_ok:
+ print "MD5 Ok"
+ # Unzip data files
+ zf = zipfile.ZipFile(local_data_file_name, 'r')
+ list_data_files = zf.namelist()
+ root_data_directory = list_data_files[0]
+ # Create temporary directory
+ tmp_directory = 'TMP'
+ if not os.path.exists(tmp_directory):
+ os.mkdir(tmp_directory)
+ zf.extractall(tmp_directory)
+ zf.close()
+ if os.path.exists(root_data_directory):
+ shutil.rmtree(root_data_directory)
+ shutil.move(tmp_directory + '/' + root_data_directory, root_data_directory)
+ shutil.rmtree(tmp_directory)
+ # Create flag file
+ flag_file = open(flag_file_name, 'w')
+ flag_file.write(last_version)
+ flag_file.close()
+
+ # Copy activity.info file
+ print "Create activity.info for", language
+ shutil.copyfile('activity/activity.info.' + language,
+ 'activity/activity.info')
+
+ # Create MANIFEST
+ print "Create MANIFEST"
+ list_git_files = subprocess.check_output(['git', 'ls-files'])
+ manifest_file = codecs.open('MANIFEST', 'w', encoding='utf-8')
+ manifest_file.write('activity/activity.info\n')
+ for name_file in list_git_files:
+ manifest_file.write(name_file)
+ for name_file in list_data_files:
+ if not os.path.isdir(name_file):
+ manifest_file.write(name_file + '\n')
+ manifest_file.close()
+
+ prepare_ok = True
+ else:
+ print "MD5 check error"
+
+
+if sys.argv[1] == 'fix_manifest':
+ print "Don't use fix_manifest. The MANIFEST is build in prepare stage"
+ prepare_ok = False
+
+if prepare_ok:
+ bundlebuilder.start('Wikipedia')
diff --git a/setup.py-mwlib b/setup.py-mwlib
new file mode 100755
index 0000000..12fc46e
--- /dev/null
+++ b/setup.py-mwlib
@@ -0,0 +1,71 @@
+#! /usr/bin/env python
+
+# Copyright (c) 2007-2008 PediaPress GmbH
+# See README.txt for additional licensing information.
+
+import sys
+import os
+
+try:
+ from setuptools import setup
+except ImportError:
+ import ez_setup
+ ez_setup.use_setuptools(version="0.6c1")
+
+from setuptools import setup, Extension
+import distutils.util
+
+
+install_requires=["simplejson>=1.3", "pyparsing>=1.4.11"]
+if sys.version_info[:2] < (2,5):
+ install_requires.append("wsgiref>=0.1.2")
+
+execfile(distutils.util.convert_path('mwlib/_version.py'))
+# adds 'version' to local namespace
+
+# we will *not* add support for automatic generation of those files as that
+# might break with source distributions from pypi
+
+if not os.path.exists(distutils.util.convert_path('mwlib/_mwscan.cc')):
+ print "Error: please install re2c from http://re2c.org/ and run make"
+ sys.exit(10)
+
+def mtime(fn):
+ return os.stat(distutils.util.convert_path(fn)).st_mtime
+
+if mtime("mwlib/_mwscan.cc") < mtime("mwlib/_mwscan.re"):
+ print "Warning: _mwscan.cc is older than _mwscan.re. please run make.\n"
+ import time
+ time.sleep(2)
+
+
+def read_long_description():
+ fn = os.path.join(os.path.dirname(os.path.abspath(__file__)), "README.txt")
+ return open(fn).read()
+
+setup(
+ name="mwlib",
+ version=str(version),
+ entry_points = dict(console_scripts=['mw-buildcdb = mwlib.apps:buildcdb',
+ 'mw-zip = mwlib.apps:buildzip',
+ 'mw-parse = mwlib.apps:parse',
+ 'mw-show = mwlib.apps:show',
+ 'mw-html = mwlib.apps:html',
+ 'mw-serve = mwlib.apps:serve',
+ ]),
+ install_requires=install_requires,
+ ext_modules = [Extension("mwlib._mwscan", ["mwlib/_mwscan.cc"]),
+ Extension("mwlib._expander", ["mwlib/_expander.cc"]),
+ ],
+
+ packages=["mwlib", "mwlib.resources"],
+ namespace_packages=['mwlib'],
+ include_package_data = True,
+ zip_safe = False,
+ url = "http://code.pediapress.com/",
+ description="mediawiki parser and utility library",
+ license="BSD License",
+ maintainer="pediapress.com",
+ maintainer_email="info@pediapress.com",
+ #long_description = read_long_description()
+)
diff --git a/setup_new_wiki.py b/setup_new_wiki.py
new file mode 100755
index 0000000..b52c24a
--- /dev/null
+++ b/setup_new_wiki.py
@@ -0,0 +1,126 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2011, One Laptop Per Child
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+import sys
+import os
+import shutil
+import zipfile
+from fnmatch import fnmatch
+from sugar.activity import bundlebuilder
+
+INCLUDE_DIRS = ['activity', 'binarylibs', 'icons', 'locale', 'bin',
+ 'mwlib', 'po', 'seek-bzip2', 'static', 'tools2']
+IGNORE_FILES = ['.gitignore', 'MANIFEST', '*.pyc', '*~', '*.bak', 'pseudo.po']
+
+
+class WikiXOPackager(bundlebuilder.XOPackager):
+
+ def __init__(self, builder, data_file):
+ bundlebuilder.XOPackager.__init__(self, builder)
+ self.data_file = data_file
+
+ def package(self):
+ bundle_zip = zipfile.ZipFile(self.package_path, 'w',
+ zipfile.ZIP_DEFLATED)
+
+ for f in self.list_files(self.config.source_dir, True):
+ if os.path.exists(os.path.join(self.config.source_dir, f)):
+ bundle_zip.write(os.path.join(self.config.source_dir, f),
+ os.path.join(self.config.bundle_root_dir, f))
+
+ if self.data_file is not None:
+ # Add the data files
+ needed_sufix = ['.processed.bz2', '.processed.bz2t']
+ for sufix in needed_sufix:
+ data_file = self.data_file + sufix
+ print "Add %s" % data_file
+ bundle_zip.write(data_file,
+ os.path.join(self.config.bundle_root_dir,
+ data_file))
+
+ data_path = os.path.dirname(self.data_file)
+
+ index_file = os.path.join(data_path, 'search.db')
+ print "Add %s" % index_file
+ bundle_zip.write(index_file,
+ os.path.join(self.config.bundle_root_dir, index_file))
+
+ # add images
+ images_path = os.path.join(data_path, 'images')
+ if os.path.exists(images_path):
+ print "Adding images"
+ for f in self.list_files(images_path):
+ bundle_zip.write(os.path.join(images_path, f),
+ os.path.join(self.config.bundle_root_dir,
+ images_path, f))
+
+ bundle_zip.close()
+
+ def list_files(self, base_dir, filter_directories=False):
+ if filter_directories:
+ include_dirs = INCLUDE_DIRS
+ else:
+ include_dirs = None
+
+ ignore_files = IGNORE_FILES
+ result = []
+
+ base_dir = os.path.abspath(base_dir)
+
+ for root, dirs, files in os.walk(base_dir):
+
+ if ignore_files:
+ for pattern in ignore_files:
+ files = [f for f in files if not fnmatch(f, pattern)]
+
+ rel_path = root[len(base_dir) + 1:]
+ for f in files:
+ result.append(os.path.join(rel_path, f))
+
+ if root == base_dir:
+ n = 0
+ while n < len(dirs):
+ directory = dirs[n]
+ if include_dirs is not None and \
+ not directory in include_dirs:
+ print "** Ignoring directory", directory
+ dirs.remove(directory)
+ else:
+ n = n + 1
+ return result
+
+
+if __name__ == '__main__':
+
+ if len(sys.argv) < 2:
+ data_file = None
+ lang = 'base'
+ else:
+ data_file = sys.argv[1]
+
+ lang = data_file[:data_file.find('/')]
+
+ print "Lang:", lang
+ # copy activty/activity.info.lang as activty/activity.info
+ f = 'activity/activity.info.' + lang
+ if os.path.exists(f):
+ shutil.copyfile(f, 'activity/activity.info')
+
+ config = bundlebuilder.Config()
+ packager = WikiXOPackager(bundlebuilder.Builder(config), data_file)
+ packager.package()
diff --git a/static/MathJax/MathJax.js b/static/MathJax/MathJax.js
new file mode 100644
index 0000000..f05132e
--- /dev/null
+++ b/static/MathJax/MathJax.js
@@ -0,0 +1,30 @@
+/*************************************************************
+ *
+ * MathJax.js
+ *
+ * The main code for the MathJax math-typesetting library. See
+ * http://www.mathjax.org/ for details.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * Copyright (c) 2009-2010 Design Science, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+if (!window.MathJax) {window.MathJax = {}}
+
+MathJax.isPacked = true;
+
+if(document.getElementById&&document.childNodes&&document.createElement){if(!window.MathJax){window.MathJax={}}if(!MathJax.Hub){MathJax.version="1.1a";MathJax.fileversion="1.1.7";(function(d){var b=window[d];if(!b){b=window[d]={}}var f=[];var c=function(g){var h=g.constructor;if(!h){h=new Function("")}for(var i in g){if(i!=="constructor"&&g.hasOwnProperty(i)){h[i]=g[i]}}return h};var a=function(){return new Function("return arguments.callee.Init.call(this,arguments)")};var e=a();e.prototype={bug_test:1};if(!e.prototype.bug_test){a=function(){return function(){return arguments.callee.Init.call(this,arguments)}}}b.Object=c({constructor:a(),Subclass:function(g,i){var h=a();h.SUPER=this;h.Init=this.Init;h.Subclass=this.Subclass;h.Augment=this.Augment;h.protoFunction=this.protoFunction;h.can=this.can;h.has=this.has;h.isa=this.isa;h.prototype=new this(f);h.prototype.constructor=h;h.Augment(g,i);return h},Init:function(g){var h=this;if(g.length===1&&g[0]===f){return h}if(!(h instanceof g.callee)){h=new g.callee(f)}return h.Init.apply(h,g)||h},Augment:function(g,h){var i;if(g!=null){for(i in g){if(g.hasOwnProperty(i)){this.protoFunction(i,g[i])}}if(g.toString!==this.prototype.toString&&g.toString!=={}.toString){this.protoFunction("toString",g.toString)}}if(h!=null){for(i in h){if(h.hasOwnProperty(i)){this[i]=h[i]}}}return this},protoFunction:function(h,g){this.prototype[h]=g;if(typeof g==="function"){g.SUPER=this.SUPER.prototype}},prototype:{Init:function(){},SUPER:function(g){return g.callee.SUPER},can:function(g){return typeof(this[g])==="function"},has:function(g){return typeof(this[g])!=="undefined"},isa:function(g){return(g instanceof Object)&&(this instanceof g)}},can:function(g){return this.prototype.can.call(this,g)},has:function(g){return this.prototype.has.call(this,g)},isa:function(h){var g=this;while(g){if(g===h){return true}else{g=g.SUPER}}return false},SimpleSUPER:c({constructor:function(g){return this.SimpleSUPER.define(g)},define:function(g){var i={};if(g!=null){for(var h in g){if(g.hasOwnProperty(h)){this.protoFunction(h,g[h])}}if(g.toString!==this.prototype.toString&&g.toString!=={}.toString){this.protoFunction("toString",g.toString)}}return i},wrap:function(i,h){if(typeof(h)==="function"&&h.toString().match(/\.\s*SUPER\s*\(/)){var g=new Function(this.wrapper);g.label=i;g.original=h;h=g;g.toString=this.stringify}return h},wrapper:function(){var h=arguments.callee;this.SUPER=h.SUPER[h.label];try{var g=h.original.apply(this,arguments)}catch(i){delete this.SUPER;throw i}delete this.SUPER;return g}.toString().replace(/^\s*function \(\)\s*\{\s*/i,"").replace(/\s*\}\s*$/i,""),toString:function(){return this.original.toString.apply(this.original,arguments)}})})})("MathJax");(function(BASENAME){var BASE=window[BASENAME];if(!BASE){BASE=window[BASENAME]={}}var CALLBACK=function(data){var cb=new Function("return arguments.callee.execute.apply(arguments.callee,arguments)");for(var id in CALLBACK.prototype){if(CALLBACK.prototype.hasOwnProperty(id)){if(typeof(data[id])!=="undefined"){cb[id]=data[id]}else{cb[id]=CALLBACK.prototype[id]}}}cb.toString=CALLBACK.prototype.toString;return cb};CALLBACK.prototype={isCallback:true,hook:function(){},data:[],object:window,execute:function(){if(!this.called||this.autoReset){this.called=!this.autoReset;return this.hook.apply(this.object,this.data.concat([].slice.call(arguments,0)))}},reset:function(){delete this.called},toString:function(){return this.hook.toString.apply(this.hook,arguments)}};var ISCALLBACK=function(f){return(typeof(f)==="function"&&f.isCallback)};var EVAL=function(code){return eval.call(window,code)};EVAL("var __TeSt_VaR__ = 1");if(window.__TeSt_VaR__){try{delete window.__TeSt_VaR__}catch(error){window.__TeSt_VaR__=null}}else{if(window.execScript){EVAL=function(code){BASE.__code=code;code="try {"+BASENAME+".__result = eval("+BASENAME+".__code)} catch(err) {"+BASENAME+".__result = err}";window.execScript(code);var result=BASE.__result;delete BASE.__result;delete BASE.__code;if(result instanceof Error){throw result}return result}}else{EVAL=function(code){BASE.__code=code;code="try {"+BASENAME+".__result = eval("+BASENAME+".__code)} catch(err) {"+BASENAME+".__result = err}";var head=(document.getElementsByTagName("head"))[0];if(!head){head=document.body}var script=document.createElement("script");script.appendChild(document.createTextNode(code));head.appendChild(script);head.removeChild(script);var result=BASE.__result;delete BASE.__result;delete BASE.__code;if(result instanceof Error){throw result}return result}}}var USING=function(args,i){if(arguments.length>1){if(arguments.length===2&&!(typeof arguments[0]==="function")&&arguments[0] instanceof Object&&typeof arguments[1]==="number"){args=[].slice.call(args,i)}else{args=[].slice.call(arguments,0)}}if(args instanceof Array&&args.length===1){args=args[0]}if(typeof args==="function"){if(args.execute===CALLBACK.prototype.execute){return args}return CALLBACK({hook:args})}else{if(args instanceof Array){if(typeof(args[0])==="string"&&args[1] instanceof Object&&typeof args[1][args[0]]==="function"){return CALLBACK({hook:args[1][args[0]],object:args[1],data:args.slice(2)})}else{if(typeof args[0]==="function"){return CALLBACK({hook:args[0],data:args.slice(1)})}else{if(typeof args[1]==="function"){return CALLBACK({hook:args[1],object:args[0],data:args.slice(2)})}}}}else{if(typeof(args)==="string"){return CALLBACK({hook:EVAL,data:[args]})}else{if(args instanceof Object){return CALLBACK(args)}else{if(typeof(args)==="undefined"){return CALLBACK({})}}}}}throw Error("Can't make callback from given data")};var DELAY=function(time,callback){callback=USING(callback);callback.timeout=setTimeout(callback,time);return callback};var WAITFOR=function(callback,signal){callback=USING(callback);if(!callback.called){WAITSIGNAL(callback,signal);signal.pending++}};var WAITEXECUTE=function(){var signals=this.signal;delete this.signal;this.execute=this.oldExecute;delete this.oldExecute;var result=this.execute.apply(this,arguments);if(ISCALLBACK(result)&&!result.called){WAITSIGNAL(result,signals)}else{for(var i=0,m=signals.length;i<m;i++){signals[i].pending--;if(signals[i].pending<=0){signals[i].call()}}}};var WAITSIGNAL=function(callback,signals){if(!(signals instanceof Array)){signals=[signals]}if(!callback.signal){callback.oldExecute=callback.execute;callback.execute=WAITEXECUTE;callback.signal=signals}else{if(signals.length===1){callback.signal.push(signals[0])}else{callback.signal=callback.signal.concat(signals)}}};var AFTER=function(callback){callback=USING(callback);callback.pending=0;for(var i=1,m=arguments.length;i<m;i++){if(arguments[i]){WAITFOR(arguments[i],callback)}}if(callback.pending===0){var result=callback();if(ISCALLBACK(result)){callback=result}}return callback};var HOOKS=function(hooks,data,reset){if(!hooks){return null}if(!(hooks instanceof Array)){hooks=[hooks]}if(!(data instanceof Array)){data=(data==null?[]:[data])}var callbacks=[{}];for(var i=0,m=hooks.length;i<m;i++){if(reset){hooks[i].reset()}var result=hooks[i].apply(window,data);if(ISCALLBACK(result)&&!result.called){callbacks.push(result)}}if(callbacks.length===1){return null}if(callbacks.length===2){return callbacks[1]}return AFTER.apply({},callbacks)};var QUEUE=BASE.Object.Subclass({Init:function(){this.pending=0;this.running=0;this.queue=[];this.Push.apply(this,arguments)},Push:function(){var callback;for(var i=0,m=arguments.length;i<m;i++){callback=USING(arguments[i]);if(callback===arguments[i]&&!callback.called){callback=USING(["wait",this,callback])}this.queue.push(callback)}if(!this.running&&!this.pending){this.Process()}return callback},Process:function(queue){while(!this.running&&!this.pending&&this.queue.length){var callback=this.queue[0];queue=this.queue.slice(1);this.queue=[];this.Suspend();var result=callback();this.Resume();if(queue.length){this.queue=queue.concat(this.queue)}if(ISCALLBACK(result)&&!result.called){WAITFOR(result,this)}}},Suspend:function(){this.running++},Resume:function(){if(this.running){this.running--}},call:function(){this.Process.apply(this,arguments)},wait:function(callback){return callback}});var SIGNAL=QUEUE.Subclass({Init:function(name){QUEUE.prototype.Init.call(this);this.name=name;this.posted=[];this.listeners=[]},Post:function(message,callback,forget){callback=USING(callback);if(this.posting||this.pending){this.Push(["Post",this,message,callback,forget])}else{this.callback=callback;callback.reset();if(!forget){this.posted.push(message)}this.Suspend();this.posting=1;for(var i=0,m=this.listeners.length;i<m;i++){this.listeners[i].reset();var result=(this.listeners[i])(message);if(ISCALLBACK(result)&&!result.called){WAITFOR(result,this)}}this.Resume();delete this.posting;if(!this.pending){this.call()}}return callback},Clear:function(callback){callback=USING(callback);if(this.posting||this.pending){callback=this.Push(["Clear",this,callback])}else{this.posted=[];callback()}return callback},call:function(){this.callback(this);this.Process()},Interest:function(callback,ignorePast){callback=USING(callback);this.listeners[this.listeners.length]=callback;if(!ignorePast){for(var i=0,m=this.posted.length;i<m;i++){callback.reset();var result=callback(this.posted[i]);if(ISCALLBACK(result)&&i===this.posted.length-1){WAITFOR(result,this)}}}return callback},NoInterest:function(callback){for(var i=0,m=this.listeners.length;i<m;i++){if(this.listeners[i]===callback){this.listeners.splice(i,1);return}}},MessageHook:function(msg,callback){callback=USING(callback);if(!this.hooks){this.hooks={};this.Interest(["ExecuteHooks",this])}if(!this.hooks[msg]){this.hooks[msg]=[]}this.hooks[msg].push(callback);for(var i=0,m=this.posted.length;i<m;i++){if(this.posted[i]==msg){callback.reset();callback(this.posted[i])}}return callback},ExecuteHooks:function(msg,more){var type=((msg instanceof Array)?msg[0]:msg);return HOOKS(this.hooks[type],[msg],true)}},{signals:{},find:function(name){if(!SIGNAL.signals[name]){SIGNAL.signals[name]=new SIGNAL(name)}return SIGNAL.signals[name]}});BASE.Callback=BASE.CallBack=USING;BASE.Callback.Delay=DELAY;BASE.Callback.After=AFTER;BASE.Callback.Queue=QUEUE;BASE.Callback.Signal=SIGNAL.find;BASE.Callback.ExecuteHooks=HOOKS})("MathJax");(function(d){var a=window[d];if(!a){a=window[d]={}}var c=(navigator.vendor==="Apple Computer, Inc."&&typeof navigator.vendorSub==="undefined");var f=0;var g=function(h){if(document.styleSheets&&document.styleSheets.length>f){f=document.styleSheets.length}if(!h){h=(document.getElementsByTagName("head"))[0];if(!h){h=document.body}}return h};var e=[];var b=function(){for(var j=0,h=e.length;j<h;j++){a.Ajax.head.removeChild(e[j])}e=[]};a.Ajax={loaded:{},loading:{},loadHooks:{},timeout:15*1000,styleDelay:1,config:{root:""},STATUS:{OK:1,ERROR:-1},rootPattern:new RegExp("^\\["+d+"\\]"),fileURL:function(h){return h.replace(this.rootPattern,this.config.root)},Require:function(j,m){m=a.Callback(m);var k;if(j instanceof Object){for(var h in j){}k=h.toUpperCase();j=j[h]}else{k=j.split(/\./).pop().toUpperCase()}j=this.fileURL(j);if(this.loaded[j]){m(this.loaded[j])}else{var l={};l[k]=j;this.Load(l,m)}return m},Load:function(j,l){l=a.Callback(l);var k;if(j instanceof Object){for(var h in j){}k=h.toUpperCase();j=j[h]}else{k=j.split(/\./).pop().toUpperCase()}j=this.fileURL(j);if(this.loading[j]){if(!this.loadHooks[j]){this.loadHooks[j]=[]}this.loadHooks[j].push(l)}else{this.head=g(this.head);if(this.loader[k]){this.loader[k].call(this,j,l)}else{throw Error("Can't load files of type "+k)}}return l},LoadHook:function(j,k){k=a.Callback(k);if(j instanceof Object){for(var h in j){j=j[h]}}j=this.fileURL(j);if(this.loaded[j]){k(this.loaded[j])}else{if(!this.loadHooks[j]){this.loadHooks[j]=[]}this.loadHooks[j].push(k)}return k},Preloading:function(){for(var k=0,h=arguments.length;k<h;k++){var j=this.fileURL(arguments[k]);if(!this.loading[j]){this.loading[j]={preloaded:true}}}},loader:{JS:function(i,k){var h=document.createElement("script");var j=a.Callback(["loadTimeout",this,i]);this.loading[i]={callback:k,message:a.Message.File(i),timeout:setTimeout(j,this.timeout),status:this.STATUS.OK,script:h};h.onerror=j;h.type="text/javascript";h.src=i;this.head.appendChild(h)},CSS:function(h,j){var i=document.createElement("link");i.rel="stylesheet";i.type="text/css";i.href=h;this.loading[h]={callback:j,message:a.Message.File(h),status:this.STATUS.OK};this.head.appendChild(i);this.timer.create.call(this,[this.timer.file,h],i)}},timer:{create:function(i,h){i=a.Callback(i);if(h.nodeName==="STYLE"&&h.styleSheet&&typeof(h.styleSheet.cssText)!=="undefined"){i(this.STATUS.OK)}else{if(window.chrome&&typeof(window.sessionStorage)!=="undefined"&&h.nodeName==="STYLE"){i(this.STATUS.OK)}else{if(c){this.timer.start(this,[this.timer.checkSafari2,f++,i],this.styleDelay)}else{this.timer.start(this,[this.timer.checkLength,h,i],this.styleDelay)}}}return i},start:function(i,h,j,k){h=a.Callback(h);h.execute=this.execute;h.time=this.time;h.STATUS=i.STATUS;h.timeout=k||i.timeout;h.delay=h.total=0;setTimeout(h,j)},time:function(h){this.total+=this.delay;this.delay=Math.floor(this.delay*1.05+5);if(this.total>=this.timeout){h(this.STATUS.ERROR);return 1}return 0},file:function(i,h){if(h<0){a.Ajax.loadTimeout(i)}else{a.Ajax.loadComplete(i)}},execute:function(){this.hook.call(this.object,this,this.data[0],this.data[1])},checkSafari2:function(h,i,j){if(h.time(j)){return}if(document.styleSheets.length>i&&document.styleSheets[i].cssRules&&document.styleSheets[i].cssRules.length){j(h.STATUS.OK)}else{setTimeout(h,h.delay)}},checkLength:function(h,k,m){if(h.time(m)){return}var l=0;var i=(k.sheet||k.styleSheet);try{if((i.cssRules||i.rules||[]).length>0){l=1}}catch(j){if(j.message.match(/protected variable|restricted URI/)){l=1}else{if(j.message.match(/Security error/)){l=1}}}if(l){setTimeout(a.Callback([m,h.STATUS.OK]),0)}else{setTimeout(h,h.delay)}}},loadComplete:function(h){h=this.fileURL(h);var i=this.loading[h];if(i&&!i.preloaded){a.Message.Clear(i.message);clearTimeout(i.timeout);if(i.script){if(e.length===0){setTimeout(b,0)}e.push(i.script)}this.loaded[h]=i.status;delete this.loading[h];if(!this.loadHooks[h]){this.loadHooks[h]=[]}this.loadHooks[h].push(i.callback)}else{this.loaded[h]=this.STATUS.OK;i={status:this.STATUS.OK}}a.Callback.ExecuteHooks(this.loadHooks[h],i.status)},loadTimeout:function(h){if(this.loading[h].timeout){clearTimeout(this.loading[h].timeout)}this.loading[h].status=this.STATUS.ERROR;this.loadError(h);this.loadComplete(h)},loadError:function(h){a.Message.Set("File failed to load: "+h,null,2000)},Styles:function(j,k){var h=this.StyleString(j);if(h===""){k=a.Callback(k);k()}else{var i=document.createElement("style");i.type="text/css";this.head=g(this.head);this.head.appendChild(i);if(i.styleSheet&&typeof(i.styleSheet.cssText)!=="undefined"){i.styleSheet.cssText=h}else{i.appendChild(document.createTextNode(h))}k=this.timer.create.call(this,k,i)}return k},StyleString:function(m){if(typeof(m)==="string"){return m}var j="",n,l;for(n in m){if(m.hasOwnProperty(n)){if(typeof m[n]==="string"){j+=n+" {"+m[n]+"}\n"}else{if(m[n] instanceof Array){for(var k=0;k<m[n].length;k++){l={};l[n]=m[n][k];j+=this.StyleString(l)}}else{if(n.substr(0,6)==="@media"){j+=n+" {"+this.StyleString(m[n])+"}\n"}else{if(m[n]!=null){l=[];for(var h in m[n]){if(m[n].hasOwnProperty(h)){if(m[n][h]!=null){l[l.length]=h+": "+m[n][h]}}}j+=n+" {"+l.join("; ")+"}\n"}}}}}}return j}}})("MathJax");MathJax.HTML={Element:function(c,e,d){var f=document.createElement(c);if(e){if(e.style){var b=e.style;e.style={};for(var g in b){if(b.hasOwnProperty(g)){e.style[g.replace(/-([a-z])/g,this.ucMatch)]=b[g]}}}MathJax.Hub.Insert(f,e)}if(d){for(var a=0;a<d.length;a++){if(d[a] instanceof Array){f.appendChild(this.Element(d[a][0],d[a][1],d[a][2]))}else{f.appendChild(document.createTextNode(d[a]))}}}return f},ucMatch:function(a,b){return b.toUpperCase()},addElement:function(b,a,d,c){return b.appendChild(this.Element(a,d,c))},TextNode:function(a){return document.createTextNode(a)},addText:function(a,b){return a.appendChild(this.TextNode(b))},setScript:function(a,b){if(this.setScriptBug){a.text=b}else{while(a.firstChild){a.removeChild(a.firstChild)}this.addText(a,b)}},Cookie:{prefix:"mjx",expires:365,Set:function(a,d){var c=[];if(d){for(var f in d){if(d.hasOwnProperty(f)){c.push(f+":"+d[f].toString().replace(/&/g,"&&"))}}}var b=this.prefix+"."+a+"="+escape(c.join("&;"));if(this.expires){var e=new Date();e.setDate(e.getDate()+this.expires);b+="; expires="+e.toGMTString()}document.cookie=b+"; path=/"},Get:function(c,h){if(!h){h={}}var g=new RegExp("(?:^|;\\s*)"+this.prefix+"\\."+c+"=([^;]*)(?:;|$)");var b=g.exec(document.cookie);if(b&&b[1]!==""){var e=unescape(b[1]).split("&;");for(var d=0,a=e.length;d<a;d++){b=e[d].match(/([^:]+):(.*)/);var f=b[2].replace(/&&/g,"&");if(f==="true"){f=true}else{if(f==="false"){f=false}else{if(f.match(/^-?(\d+(\.\d+)?|\.\d+)$/)){f=parseFloat(f)}}}h[b[1]]=f}}return h}}};MathJax.Message={ready:false,log:[{}],current:null,textNodeBug:(navigator.vendor==="Apple Computer, Inc."&&typeof navigator.vendorSub==="undefined")||(window.hasOwnProperty&&window.hasOwnProperty("konqueror")),styles:{"#MathJax_Message":{position:"fixed",left:"1px",bottom:"2px","background-color":"#E6E6E6",border:"1px solid #959595",margin:"0px",padding:"2px 8px","z-index":"102",color:"black","font-size":"80%",width:"auto","white-space":"nowrap"},"#MathJax_MSIE_Frame":{position:"absolute",top:0,left:0,width:"0px","z-index":101,border:"0px",margin:"0px",padding:"0px"}},browsers:{MSIE:function(a){MathJax.Hub.config.styles["#MathJax_Message"].position="absolute";MathJax.Message.quirks=(document.compatMode==="BackCompat")},Chrome:function(a){MathJax.Hub.config.styles["#MathJax_Message"].bottom="1.5em";MathJax.Hub.config.styles["#MathJax_Message"].left="1em"}},Init:function(a){if(a){this.ready=true}if(!document.body||!this.ready){return false}if(this.div&&this.div.parentNode==null){this.div=document.getElementById("MathJax_Message");if(this.div){this.text=this.div.firstChild}}if(!this.div){var b=document.body;if(MathJax.Hub.Browser.isMSIE){b=this.frame=this.addDiv(document.body);b.removeAttribute("id");b.style.position="absolute";b.style.border=b.style.margin=b.style.padding="0px";b.style.zIndex="101";b.style.height="0px";b=this.addDiv(b);b.id="MathJax_MSIE_Frame";window.attachEvent("onscroll",this.MoveFrame);window.attachEvent("onresize",this.MoveFrame);this.MoveFrame()}this.div=this.addDiv(b);this.div.style.display="none";this.text=this.div.appendChild(document.createTextNode(""))}return true},addDiv:function(a){var b=document.createElement("div");b.id="MathJax_Message";if(a.firstChild){a.insertBefore(b,a.firstChild)}else{a.appendChild(b)}return b},MoveFrame:function(){var a=(MathJax.Message.quirks?document.body:document.documentElement);var b=MathJax.Message.frame;b.style.left=a.scrollLeft+"px";b.style.top=a.scrollTop+"px";b.style.width=a.clientWidth+"px";b=b.firstChild;b.style.height=a.clientHeight+"px"},filterText:function(a,b){if(MathJax.Hub.config.messageStyle==="simple"){if(a.match(/^Loading /)){if(!this.loading){this.loading="Loading "}a=this.loading;this.loading+="."}else{if(a.match(/^Processing /)){if(!this.processing){this.processing="Processing "}a=this.processing;this.processing+="."}}}return a},Set:function(b,c,a){if(this.timer){clearTimeout(this.timer);delete this.timeout}if(c==null){c=this.log.length;this.log[c]={}}this.log[c].text=b;this.log[c].filteredText=b=this.filterText(b,c);if(typeof(this.log[c].next)==="undefined"){this.log[c].next=this.current;if(this.current!=null){this.log[this.current].prev=c}this.current=c}if(this.current===c&&MathJax.Hub.config.messageStyle!=="none"){if(this.Init()){if(this.textNodeBug){this.div.innerHTML=b}else{this.text.nodeValue=b}this.div.style.display="";if(this.status){window.status="";delete this.status}}else{window.status=b;this.status=true}}if(a){setTimeout(MathJax.Callback(["Clear",this,c]),a)}return c},Clear:function(b,a){if(this.log[b].prev!=null){this.log[this.log[b].prev].next=this.log[b].next}if(this.log[b].next!=null){this.log[this.log[b].next].prev=this.log[b].prev}if(this.current===b){this.current=this.log[b].next;if(this.text){if(this.div.parentNode==null){this.Init()}if(this.current==null){if(this.timer){clearTimeout(this.timer)}this.timer=setTimeout(MathJax.Callback(["Remove",this]),(a||600))}else{if(MathJax.Hub.config.messageStyle!=="none"){if(this.textNodeBug){this.div.innerHTML=this.log[this.current].filteredText}else{this.text.nodeValue=this.log[this.current].filteredText}}}if(this.status){window.status="";delete this.status}}else{if(this.status){window.status=(this.current==null?"":this.log[this.current].text)}}}delete this.log[b].next;delete this.log[b].prev;delete this.log[b].filteredText},Remove:function(){this.text.nodeValue="";this.div.style.display="none"},File:function(b){var a=MathJax.Ajax.config.root;if(b.substr(0,a.length)===a){b="[MathJax]"+b.substr(a.length)}return this.Set("Loading "+b)},Log:function(){var b=[];for(var c=1,a=this.log.length;c<a;c++){b[c]=this.log[c].text}return b.join("\n")}};MathJax.Hub={config:{root:"",config:[],styleSheets:[],styles:{},jax:[],extensions:[],preJax:null,postJax:null,displayAlign:"center",displayIndent:"0",preRemoveClass:"MathJax_Preview",showProcessingMessages:true,messageStyle:"normal",delayStartupUntil:"none",skipStartupTypeset:false,"v1.0-compatible":true,elements:[],preProcessors:[],inputJax:{},outputJax:{order:{}},menuSettings:{zoom:"None",CTRL:false,ALT:false,CMD:false,Shift:false,zscale:"200%",renderer:"",font:"Auto",context:"MathJax"},errorSettings:{message:["[Math Processing Error]"],style:{color:"#CC0000","font-style":"italic"}}},processUpdateTime:250,signal:MathJax.Callback.Signal("Hub"),Config:function(a){this.Insert(this.config,a);if(this.config.Augment){this.Augment(this.config.Augment)}},CombineConfig:function(c,f){var b=this.config,g,e;c=c.split(/\./);for(var d=0,a=c.length;d<a;d++){g=c[d];if(!b[g]){b[g]={}}e=b;b=b[g]}e[g]=b=this.Insert(f,b);return b},Register:{PreProcessor:function(a){MathJax.Hub.config.preProcessors.push(MathJax.Callback(a))},MessageHook:function(){return MathJax.Hub.signal.MessageHook.apply(MathJax.Hub.signal,arguments)},StartupHook:function(){return MathJax.Hub.Startup.signal.MessageHook.apply(MathJax.Hub.Startup.signal,arguments)},LoadHook:function(){return MathJax.Ajax.LoadHook.apply(MathJax.Ajax,arguments)}},getAllJax:function(e){var c=[],b=this.elementScripts(e);for(var d=0,a=b.length;d<a;d++){if(b[d].MathJax&&b[d].MathJax.elementJax){c.push(b[d].MathJax.elementJax)}}return c},getJaxByType:function(f,e){var c=[],b=this.elementScripts(e);for(var d=0,a=b.length;d<a;d++){if(b[d].MathJax&&b[d].MathJax.elementJax&&b[d].MathJax.elementJax.mimeType===f){c.push(b[d].MathJax.elementJax)}}return c},getJaxByInputType:function(f,e){var c=[],b=this.elementScripts(e);for(var d=0,a=b.length;d<a;d++){if(b[d].MathJax&&b[d].MathJax.elementJax&&b[d].type&&b[d].type.replace(/ *;(.|\s)*/,"")===f){c.push(b[d].MathJax.elementJax)}}return c},getJaxFor:function(a){if(typeof(a)==="string"){a=document.getElementById(a)}if(a&&a.MathJax){return a.MathJax.elementJax}return null},isJax:function(a){if(typeof(a)==="string"){a=document.getElementById(a)}if(a&&a.tagName!=null&&a.tagName.toLowerCase()==="script"){if(a.MathJax){return(a.MathJax.state===MathJax.ElementJax.STATE.PROCESSED?1:-1)}if(a.type&&this.config.inputJax[a.type.replace(/ *;(.|\s)*/,"")]){return -1}}return 0},Queue:function(){return this.queue.Push.apply(this.queue,arguments)},Typeset:function(e,f){if(!MathJax.isReady){return null}var c=this.elementCallback(e,f);var b=MathJax.Callback.Queue();for(var d=0,a=c.elements.length;d<a;d++){if(c.elements[d]){b.Push(["PreProcess",this,c.elements[d]],["Process",this,c.elements[d]])}}return b.Push(c.callback)},PreProcess:function(e,f){var c=this.elementCallback(e,f);var b=MathJax.Callback.Queue();for(var d=0,a=c.elements.length;d<a;d++){if(c.elements[d]){b.Push(["Post",this.signal,["Begin PreProcess",c.elements[d]]],["ExecuteHooks",MathJax.Callback,(arguments.callee.disabled?[]:this.config.preProcessors),c.elements[d],true],["Post",this.signal,["End PreProcess",c.elements[d]]])}}return b.Push(c.callback)},Process:function(a,b){return this.takeAction("Process",a,b)},Update:function(a,b){return this.takeAction("Update",a,b)},Reprocess:function(a,b){return this.takeAction("Reprocess",a,b)},takeAction:function(g,f,h){var d=this.elementCallback(f,h);var c=MathJax.Callback.Queue(["Clear",this.signal]);for(var e=0,b=d.elements.length;e<b;e++){if(d.elements[e]){var a=[];c.Push(["Post",this.signal,["Begin "+g,d.elements[e]]],["Post",this.signal,["Begin Math",d.elements[e]]],["prepareScripts",this,g,d.elements[e],a],["processScripts",this,a],["Post",this.signal,["End Math",d.elements[e]]],["Post",this.signal,["End "+g,d.elements[e]]])}}return c.Push(d.callback)},scriptAction:{Process:function(a){},Update:function(b){var a=b.MathJax.elementJax;if(a&&a.originalText===(b.text==""?b.innerHTML:b.text)){b.MathJax.state=a.STATE.PROCESSED}else{a.outputJax.Remove(a);b.MathJax.state=a.STATE.UPDATE}},Reprocess:function(b){var a=b.MathJax.elementJax;if(a){a.outputJax.Remove(a);b.MathJax.state=a.STATE.UPDATE}}},prepareScripts:function(h,e,f){if(arguments.callee.disabled){return}var b=this.elementScripts(e);var g=MathJax.ElementJax.STATE;for(var d=0,a=b.length;d<a;d++){var c=b[d];if(c.type&&this.config.inputJax[c.type.replace(/ *;(.|\n)*/,"")]){if(c.MathJax&&c.MathJax.state!==g.PENDING){this.scriptAction[h](c)}if(!c.MathJax){c.MathJax={state:g.PENDING}}if(c.MathJax.state!==g.PROCESSED){f.push(c)}}}},checkScriptSiblings:function(a){if(a.MathJax&&a.MathJax.checked){return}var b=this.config;var g=a.previousSibling;if(g&&g.nodeName=="#text"){var d,f;var c=a.nextSibling;if(c&&c.nodeName!="#text"){c=null}if(b.preJax){if(typeof(b.preJax)==="string"){b.preJax=new RegExp(b.preJax+"$")}d=g.nodeValue.match(b.preJax)}if(b.postJax&&c){if(typeof(b.postJax)==="string"){b.postJax=new RegExp("^"+b.postJax)}f=c.nodeValue.match(b.postJax)}if(d&&(!b.postJax||f)){g.nodeValue=g.nodeValue.replace(b.preJax,(d.length>1?d[1]:""));g=null}if(f&&(!b.preJax||d)){c.nodeValue=c.nodeValue.replace(b.postJax,(f.length>1?f[1]:""))}if(g&&!g.nodeValue.match(/\S/)){g=g.previousSibling}}if(b.preRemoveClass&&g&&g.className==b.preRemoveClass){try{g.innerHTML=""}catch(e){}g.style.display="none"}if(a.MathJax){a.MathJax.checked=1}},processScripts:function(h,b,d){if(arguments.callee.disabled){return null}var q,o=MathJax.ElementJax.STATE;var p=this.config.inputJax,c=this.config.outputJax;try{if(!b){b=new Date().getTime()}var j=0,l,f;while(j<h.length){l=h[j];if(!l){j++;continue}f=l.previousSibling;if(f&&f.className==="MathJax_Error"){f.parentNode.removeChild(f)}var k=l.type.replace(/ *;(.|\s)*/,"");if(!l.MathJax||l.MathJax.state===o.PROCESSED){j++;continue}if(!l.MathJax.elementJax||l.MathJax.state===o.UPDATE){this.checkScriptSiblings(l);q=p[k].Process(l);if(typeof q==="function"){if(q.called){continue}this.RestartAfter(q)}q.Attach(l,p[k]);l.MathJax.state=o.OUTPUT}var a=l.MathJax.elementJax;if(!c[a.mimeType]){l.MathJax.state=o.UPDATE;throw Error("No output jax registered for "+a.mimeType)}a.outputJax=c[a.mimeType][0];q=a.outputJax.Process(l);if(typeof q==="function"){if(q.called){continue}this.RestartAfter(q)}l.MathJax.state=o.PROCESSED;this.signal.Post(["New Math",a.inputID]);j++;if(new Date().getTime()-b>this.processUpdateTime&&j<h.length){b=0;this.RestartAfter(MathJax.Callback.Delay(1))}}}catch(g){if(!g.restart){if(!this.config.errorSettings.message){throw g}this.formatError(l,g);j++}if(!d){d=0}var e=Math.floor((d+j)/(d+h.length)*100);d+=j;if(this.config.showProcessingMessages){MathJax.Message.Set("Processing math: "+e+"%",0)}return MathJax.Callback.After(["processScripts",this,h.slice(j),b,d],g.restart)}if((d||h.length)&&this.config.showProcessingMessages){MathJax.Message.Set("Processing Math: 100%",0);MathJax.Message.Clear(0)}return null},formatError:function(a,c){var b=MathJax.HTML.Element("span",{className:"MathJax_Error"},this.config.errorSettings.message);a.parentNode.insertBefore(b,a);this.lastError=c},RestartAfter:function(a){throw this.Insert(Error("restart"),{restart:MathJax.Callback(a)})},elementCallback:function(c,f){if(f==null&&(c instanceof Array||typeof c==="function")){try{MathJax.Callback(c);f=c;c=null}catch(d){}}if(c==null){c=this.config.elements||[]}if(!(c instanceof Array)){c=[c]}c=[].concat(c);for(var b=0,a=c.length;b<a;b++){if(typeof(c[b])==="string"){c[b]=document.getElementById(c[b])}}if(c.length==0){c.push(document.body)}if(!f){f={}}return{elements:c,callback:f}},elementScripts:function(a){if(typeof(a)==="string"){a=document.getElementById(a)}if(a==null){a=document.body}if(a.tagName!=null&&a.tagName.toLowerCase()==="script"){return[a]}return a.getElementsByTagName("script")},Insert:function(c,a){for(var b in a){if(a.hasOwnProperty(b)){if(typeof a[b]==="object"&&!(a[b] instanceof Array)&&(typeof c[b]==="object"||typeof c[b]==="function")){this.Insert(c[b],a[b])}else{c[b]=a[b]}}}return c}};MathJax.Hub.Insert(MathJax.Hub.config.styles,MathJax.Message.styles);MathJax.Hub.Insert(MathJax.Hub.config.styles,{".MathJax_Error":MathJax.Hub.config.errorSettings.style});MathJax.Extension={};MathJax.Hub.Configured=MathJax.Callback({});MathJax.Hub.Startup={script:"",queue:MathJax.Callback.Queue(),signal:MathJax.Callback.Signal("Startup"),params:{},Config:function(){this.queue.Push(["Post",this.signal,"Begin Config"]);var b=MathJax.HTML.Cookie.Get("user");if(b.URL||b.Config){if(confirm("MathJax has found a user-configuration cookie that includes code to be run. Do you want to run it?\n\n(You should press Cancel unless you set up the cookie yourself.)")){if(b.URL){this.queue.Push(["Require",MathJax.Ajax,b.URL])}if(b.Config){this.queue.Push(new Function(b.Config))}}else{MathJax.HTML.Cookie.Set("user",{})}}if(this.params.config){var d=this.params.config.split(/,/);for(var c=0,a=d.length;c<a;c++){if(!d[c].match(/\.js$/)){d[c]+=".js"}this.queue.Push(["Require",MathJax.Ajax,this.URL("config",d[c])])}}if(this.script.match(/\S/)){this.queue.Push(this.script+";\n1;")}this.queue.Push(["ConfigDelay",this],["ConfigBlocks",this],["ConfigDefault",this],[function(e){return e.loadArray(MathJax.Hub.config.config,"config",null,true)},this],["Post",this.signal,"End Config"])},ConfigDelay:function(){var a=this.params.delayStartupUntil||MathJax.Hub.config.delayStartupUntil;if(a==="onload"){return this.onload}if(a==="configured"){return MathJax.Hub.Configured}return a},ConfigBlocks:function(){var c=document.getElementsByTagName("script");var f=null,b=MathJax.Callback.Queue();for(var d=0,a=c.length;d<a;d++){var e=String(c[d].type).replace(/ /g,"");if(e.match(/^text\/x-mathjax-config(;.*)?$/)&&!e.match(/;executed=true/)){c[d].type+=";executed=true";f=b.Push(c[d].innerHTML+";\n1;")}}return f},ConfigDefault:function(){var a=MathJax.Hub.config;if(a["v1.0-compatible"]&&a.jax.length===0){return MathJax.Ajax.Require(this.URL("extensions","v1.0-warning.js"))}},Cookie:function(){return this.queue.Push(["Post",this.signal,"Begin Cookie"],["Get",MathJax.HTML.Cookie,"menu",MathJax.Hub.config.menuSettings],[function(d){var f=d.menuSettings.renderer,b=d.jax;if(f){var c="output/"+f;b.sort();for(var e=0,a=b.length;e<a;e++){if(b[e].substr(0,7)==="output/"){break}}if(e==a-1){b.pop()}else{while(e<a){if(b[e]===c){b.splice(e,1);break}e++}}b.unshift(c)}},MathJax.Hub.config],["Post",this.signal,"End Cookie"])},Styles:function(){return this.queue.Push(["Post",this.signal,"Begin Styles"],["loadArray",this,MathJax.Hub.config.styleSheets,"config"],["Styles",MathJax.Ajax,MathJax.Hub.config.styles],["Post",this.signal,"End Styles"])},Jax:function(){var d=MathJax.Hub.config;for(var e=0,b=d.jax.length,c=0;e<b;e++){if(d.jax[e].substr(0,7)==="output/"){d.outputJax.order[d.jax[e].substr(7)]=c;c++}}var a=MathJax.Callback.Queue();return a.Push(["Post",this.signal,"Begin Jax"],["loadArray",this,d.jax,"jax","config.js"],["Post",this.signal,"End Jax"])},Extensions:function(){var a=MathJax.Callback.Queue();return a.Push(["Post",this.signal,"Begin Extensions"],["loadArray",this,MathJax.Hub.config.extensions,"extensions"],["Post",this.signal,"End Extensions"])},Message:function(){MathJax.Message.Init(true)},Menu:function(){var b=MathJax.Hub.config.menuSettings,a=MathJax.Hub.config.outputJax,d;for(var c in a){if(a.hasOwnProperty(c)){if(a[c].length){d=a[c];break}}}if(d&&d.length){if(b.renderer&&b.renderer!==d[0].id){d.unshift(MathJax.OutputJax[b.renderer])}b.renderer=d[0].id}},onLoad:function(a){var b=this.onload=MathJax.Callback(function(){MathJax.Hub.Startup.signal.Post("onLoad")});if(window.addEventListener){window.addEventListener("load",b,false)}else{if(window.attachEvent){window.attachEvent("onload",b)}else{window.onload=b}}return b},Typeset:function(a,b){if(MathJax.Hub.config.skipStartupTypeset){return function(){}}return this.queue.Push(["Post",this.signal,"Begin Typeset"],["Typeset",MathJax.Hub,a,b],["Post",this.signal,"End Typeset"])},URL:function(b,a){if(!a.match(/^([a-z]+:\/\/|\[|\/)/)){a="[MathJax]/"+b+"/"+a}return a},loadArray:function(b,f,c,a){if(b){if(!(b instanceof Array)){b=[b]}if(b.length){var h=MathJax.Callback.Queue(),j={},e;for(var g=0,d=b.length;g<d;g++){e=this.URL(f,b[g]);if(c){e+="/"+c}if(a){h.Push(["Require",MathJax.Ajax,e,j])}else{h.Push(MathJax.Ajax.Require(e,j))}}return h.Push({})}}return null}};(function(d){var b=window[d],e="["+d+"]";var c=b.Hub,a=b.Ajax,f=b.Callback;var g=MathJax.Object.Subclass({JAXFILE:"jax.js",require:null,config:{},Init:function(i,h){if(arguments.length===0){return this}return(this.constructor.Subclass(i,h))()},Augment:function(k,j){var i=this.constructor,h={};if(k!=null){for(var l in k){if(k.hasOwnProperty(l)){if(typeof k[l]==="function"){i.protoFunction(l,k[l])}else{h[l]=k[l]}}}if(k.toString!==i.prototype.toString&&k.toString!=={}.toString){i.protoFunction("toString",k.toString)}}c.Insert(i.prototype,h);i.Augment(null,j);return this},Process:function(h){var i=a.Require(this.directory+"/"+this.JAXFILE);if(!i.called){this.constructor.prototype.Process=function(j){return i}}return i},Translate:function(h){throw Error(this.directory+"/"+this.JAXFILE+" failed to redefine the Translate() method")},Register:function(h){},Config:function(){this.config=c.CombineConfig(this.id,this.config);if(this.config.Augment){this.Augment(this.config.Augment)}},Startup:function(){},loadComplete:function(i){if(i==="config.js"){a.loadComplete(this.directory+"/"+i)}else{var h=f.Queue();h.Push(c.Register.StartupHook("End Config",{}),["Post",c.Startup.signal,this.id+" Jax Config"],["Config",this],["Post",c.Startup.signal,this.id+" Jax Require"],[function(j){return MathJax.Hub.Startup.loadArray(j.require,this.directory)},this],[function(j,k){return MathJax.Hub.Startup.loadArray(j.extensions,"extensions/"+k)},this.config||{},this.id],["Post",c.Startup.signal,this.id+" Jax Startup"],["Startup",this],["Post",c.Startup.signal,this.id+" Jax Ready"],[function(j){j.Process=j.Translate},this.constructor.prototype],["loadComplete",a,this.directory+"/"+i])}}},{id:"unknown",version:"1.1",directory:e+"/jax",extensionDir:e+"/extensions"});b.InputJax=g.Subclass({elementJax:"mml",Process:function(o){var j=f.Queue();var k=this.elementJax;if(!(k instanceof Array)){k=[k]}for(var n=0,h=k.length;n<h;n++){var l=b.ElementJax.directory+"/"+k[n]+"/"+this.JAXFILE;if(!this.require){this.require=[]}else{if(!(this.require instanceof Array)){this.require=[this.require]}}this.require.push(l);j.Push(a.Require(l))}var p=j.Push(a.Require(this.directory+"/"+this.JAXFILE));if(!p.called){this.constructor.prototype.Process=function(){return p}}k=c.config.outputJax["jax/"+k[0]];if(k){j.Push(a.Require(k[0].directory+"/"+this.JAXFILE))}return j.Push({})},Register:function(h){if(!c.config.inputJax){c.config.inputJax={}}c.config.inputJax[h]=this}},{version:"1.1",directory:g.directory+"/input",extensionDir:g.extensionDir});b.OutputJax=g.Subclass({Register:function(i){var h=c.config.outputJax;if(!h[i]){h[i]=[]}if(h[i].length&&(this.id===c.config.menuSettings.renderer||(h.order[this.id]||0)<(h.order[h[i][0].id]||0))){h[i].unshift(this)}else{h[i].push(this)}if(!this.require){this.require=[]}else{if(!(this.require instanceof Array)){this.require=[this.require]}}this.require.push(b.ElementJax.directory+"/"+(i.split(/\//)[1])+"/"+this.JAXFILE)},Remove:function(h){}},{version:"1.1",directory:g.directory+"/output",extensionDir:g.extensionDir,fontDir:e+(b.isPacked?"":"/..")+"/fonts"});b.ElementJax=g.Subclass({Init:function(i,h){return this.constructor.Subclass(i,h)},inputJax:null,outputJax:null,inputID:null,originalText:"",mimeType:"",Text:function(i,j){var h=this.SourceElement();b.HTML.setScript(h,i);h.MathJax.state=this.STATE.UPDATE;return c.Update(h,j)},Reprocess:function(i){var h=this.SourceElement();h.MathJax.state=this.STATE.UPDATE;return c.Reprocess(h,i)},Update:function(i){var h=this.SourceElement();h.MathJax.state=this.STATE.OUTPUT;return c.Process(h,i)},Remove:function(){this.outputJax.Remove(this);c.signal.Post(["Remove Math",this.inputID]);this.Detach()},SourceElement:function(){return document.getElementById(this.inputID)},Attach:function(i,j){var h=i.MathJax.elementJax;if(i.MathJax.state===this.STATE.UPDATE){h.Clone(this)}else{h=i.MathJax.elementJax=this;if(i.id){this.inputID=i.id}else{i.id=this.inputID=b.ElementJax.GetID();this.newID=1}}h.originalText=(i.text==""?i.innerHTML:i.text);h.inputJax=j;if(h.root){h.root.inputID=h.inputID}},Detach:function(){var h=this.SourceElement();if(!h){return}try{delete h.MathJax}catch(i){h.MathJax=null}if(this.newID){h.id=""}},Clone:function(h){var i;for(i in this){if(!this.hasOwnProperty(i)){continue}if(typeof(h[i])==="undefined"&&i!=="newID"){delete this[i]}}for(i in h){if(!this.hasOwnProperty(i)){continue}if(typeof(this[i])==="undefined"||(this[i]!==h[i]&&i!=="inputID")){this[i]=h[i]}}}},{version:"1.1",directory:g.directory+"/element",extensionDir:g.extensionDir,ID:0,STATE:{PENDING:1,PROCESSED:2,UPDATE:3,OUTPUT:4},GetID:function(){this.ID++;return"MathJax-Element-"+this.ID},Subclass:function(){var h=g.Subclass.apply(this,arguments);h.loadComplete=this.prototype.loadComplete;return h}});b.ElementJax.prototype.STATE=b.ElementJax.STATE})("MathJax");(function(l){var f=window[l];if(!f){f=window[l]={}}var c=f.Hub;var q=c.Startup;var u=c.config;var e=document.getElementsByTagName("head")[0];if(!e){e=document.childNodes[0]}var b=(document.documentElement||document).getElementsByTagName("script");var d=new RegExp("(^|/)"+l+"\\.js(\\?.*)?$");for(var o=b.length-1;o>=0;o--){if(b[o].src.match(d)){q.script=b[o].innerHTML;if(RegExp.$2){var r=RegExp.$2.substr(1).split(/\&/);for(var n=0,h=r.length;n<h;n++){var k=r[n].match(/(.*)=(.*)/);if(k){q.params[unescape(k[1])]=unescape(k[2])}}}u.root=b[o].src.replace(/(^|\/)[^\/]*(\?.*)?$/,"");break}}f.Ajax.config=u;var a={isMac:(navigator.platform.substr(0,3)==="Mac"),isPC:(navigator.platform.substr(0,3)==="Win"),isMSIE:(window.ActiveXObject!=null&&window.clipboardData!=null),isFirefox:(window.netscape!=null&&document.ATTRIBUTE_NODE!=null&&!window.opera),isSafari:(navigator.userAgent.match(/ (Apple)?WebKit\//)!=null&&!window.chrome),isChrome:(window.chrome!=null&&window.chrome.loadTimes!=null),isOpera:(window.opera!=null&&window.opera.version!=null),isKonqueror:(window.hasOwnProperty&&window.hasOwnProperty("konqueror")&&navigator.vendor=="KDE"),versionAtLeast:function(x){var w=(this.version).split(".");x=(new String(x)).split(".");for(var y=0,j=x.length;y<j;y++){if(w[y]!=x[y]){return parseInt(w[y]||"0")>=parseInt(x[y])}}return true},Select:function(j){var i=j[c.Browser];if(i){return i(c.Browser)}return null}};var g=navigator.userAgent.replace(/^Mozilla\/(\d+\.)+\d+ /,"").replace(/[a-z][-a-z0-9._: ]+\/\d+[^ ]*-[^ ]*\.([a-z][a-z])?\d+ /i,"").replace(/Gentoo |Ubuntu\/(\d+\.)*\d+ (\([^)]*\) )?/,"");c.Browser=c.Insert(c.Insert(new String("Unknown"),{version:"0.0"}),a);for(var t in a){if(a.hasOwnProperty(t)){if(a[t]&&t.substr(0,2)==="is"){t=t.slice(2);if(t==="Mac"||t==="PC"){continue}c.Browser=c.Insert(new String(t),a);var p=new RegExp(".*(Version)/((?:\\d+\\.)+\\d+)|.*("+t+")"+(t=="MSIE"?" ":"/")+"((?:\\d+\\.)*\\d+)|(?:^|\\(| )([a-z][-a-z0-9._: ]+|(?:Apple)?WebKit)/((?:\\d+\\.)+\\d+)");var s=p.exec(g)||["","","","unknown","0.0"];c.Browser.name=(s[1]=="Version"?t:(s[3]||s[5]));c.Browser.version=s[2]||s[4]||s[6];break}}}c.Browser.Select({Safari:function(j){var i=parseInt((String(j.version).split("."))[0]);if(i>85){j.webkit=j.version}if(i>=533){j.version="5.0"}else{if(i>=526){j.version="4.0"}else{if(i>=525){j.version="3.1"}else{if(i>500){j.version="3.0"}else{if(i>400){j.version="2.0"}else{if(i>85){j.version="1.0"}}}}}}},Firefox:function(j){if(j.version==="0.0"&&navigator.product==="Gecko"&&navigator.productSub){var i=navigator.productSub.substr(0,8);if(i>="20090630"){j.version="3.5"}else{if(i>="20080617"){j.version="3.0"}else{if(i>="20061024"){j.version="2.0"}}}}},Opera:function(i){i.version=opera.version()},MSIE:function(i){i.isIE9=!!(document.documentMode&&(window.performance||window.msPerformance));MathJax.HTML.setScriptBug=!i.isIE9||document.documentMode<9}});c.Browser.Select(MathJax.Message.browsers);c.queue=f.Callback.Queue();c.queue.Push(["Post",q.signal,"Begin"],["Config",q],["Cookie",q],["Styles",q],["Message",q],function(){var i=f.Callback.Queue(q.Jax(),q.Extensions());return i.Push({})},["Menu",q],q.onLoad(),function(){MathJax.isReady=true},["Typeset",q],["Post",q.signal,"End"])})("MathJax")}};
+
diff --git a/static/MathJax/TeX-AMS_HTML.js b/static/MathJax/TeX-AMS_HTML.js
new file mode 100644
index 0000000..db17cd8
--- /dev/null
+++ b/static/MathJax/TeX-AMS_HTML.js
@@ -0,0 +1,56 @@
+/*
+ * /MathJax/config/TeX-AMS_HTML.js
+ *
+ * Copyright (c) 2010-11 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Ajax.Preloading(
+ "[MathJax]/jax/input/TeX/config.js",
+ "[MathJax]/jax/output/HTML-CSS/config.js",
+ "[MathJax]/extensions/tex2jax.js",
+ "[MathJax]/extensions/MathZoom.js",
+ "[MathJax]/extensions/MathMenu.js",
+ "[MathJax]/jax/element/mml/jax.js",
+ "[MathJax]/extensions/toMathML.js",
+ "[MathJax]/extensions/TeX/noErrors.js",
+ "[MathJax]/extensions/TeX/noUndefined.js",
+ "[MathJax]/jax/input/TeX/jax.js",
+ "[MathJax]/extensions/TeX/AMSmath.js",
+ "[MathJax]/extensions/TeX/AMSsymbols.js"
+);
+
+MathJax.Hub.Config({"v1.0-compatible":false});
+
+MathJax.InputJax.TeX=MathJax.InputJax({id:"TeX",version:"1.1.1",directory:MathJax.InputJax.directory+"/TeX",extensionDir:MathJax.InputJax.extensionDir+"/TeX",config:{TagSide:"right",TagIndent:"0.8em",MultLineWidth:"85%"}});MathJax.InputJax.TeX.Register("math/tex");MathJax.InputJax.TeX.loadComplete("config.js");
+
+MathJax.OutputJax["HTML-CSS"]=MathJax.OutputJax({id:"HTML-CSS",version:"1.1.5",directory:MathJax.OutputJax.directory+"/HTML-CSS",extensionDir:MathJax.OutputJax.extensionDir+"/HTML-CSS",autoloadDir:MathJax.OutputJax.directory+"/HTML-CSS/autoload",fontDir:MathJax.OutputJax.directory+"/HTML-CSS/fonts",webfontDir:MathJax.OutputJax.fontDir+"/HTML-CSS",config:{scale:100,minScaleAdjust:50,availableFonts:["STIX","TeX"],preferredFont:"TeX",webFont:"TeX",imageFont:"TeX",undefinedFamily:"STIXGeneral,'Arial Unicode MS',serif",showMathMenu:true,styles:{".MathJax_Display":{"text-align":"center",margin:"1em 0em"},".MathJax .merror":{"background-color":"#FFFF88",color:"#CC0000",border:"1px solid #CC0000",padding:"1px 3px","font-family":"serif","font-style":"normal","font-size":"90%"},".MathJax_Preview":{color:"#888888"},"#MathJax_Tooltip":{"background-color":"InfoBackground",color:"InfoText",border:"1px solid black","box-shadow":"2px 2px 5px #AAAAAA","-webkit-box-shadow":"2px 2px 5px #AAAAAA","-moz-box-shadow":"2px 2px 5px #AAAAAA","-khtml-box-shadow":"2px 2px 5px #AAAAAA",filter:"progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color='gray', Positive='true')",padding:"3px 4px"}}}});if(MathJax.Hub.Browser.isMSIE&&document.documentMode>=9){delete MathJax.OutputJax["HTML-CSS"].config.styles["#MathJax_Tooltip"].filter}if(!MathJax.Hub.config.delayJaxRegistration){MathJax.OutputJax["HTML-CSS"].Register("jax/mml")}MathJax.Hub.Register.StartupHook("End Config",[function(b,c){var a=b.Insert({minBrowserVersion:{Firefox:3,Opera:9.52,MSIE:6,Chrome:0.3,Safari:2,Konqueror:4},inlineMathDelimiters:["$","$"],displayMathDelimiters:["$$","$$"],multilineDisplay:true,minBrowserTranslate:function(f){var e=b.getJaxFor(f),k=["[Math]"],j;var h=document.createElement("span",{className:"MathJax_Preview"});if(e.inputJax.id==="TeX"){if(e.root.Get("displaystyle")){j=a.displayMathDelimiters;k=[j[0]+e.originalText+j[1]];if(a.multilineDisplay){k=k[0].split(/\n/)}}else{j=a.inlineMathDelimiters;k=[j[0]+e.originalText.replace(/^\s+/,"").replace(/\s+$/,"")+j[1]]}}for(var g=0,d=k.length;g<d;g++){h.appendChild(document.createTextNode(k[g]));if(g<d-1){h.appendChild(document.createElement("br"))}}f.parentNode.insertBefore(h,f)}},(b.config["HTML-CSS"]||{}));if(b.Browser.version!=="0.0"&&!b.Browser.versionAtLeast(a.minBrowserVersion[b.Browser]||0)){c.Translate=a.minBrowserTranslate;b.Config({showProcessingMessages:false});MathJax.Message.Set("Your browser does not support MathJax",null,4000);b.Startup.signal.Post("MathJax not supported")}},MathJax.Hub,MathJax.OutputJax["HTML-CSS"]]);MathJax.OutputJax["HTML-CSS"].loadComplete("config.js");
+
+MathJax.Extension.tex2jax={version:"1.1.3",config:{inlineMath:[["\\(","\\)"]],displayMath:[["$$","$$"],["\\[","\\]"]],skipTags:["script","noscript","style","textarea","pre","code"],ignoreClass:"tex2jax_ignore",processClass:"tex2jax_process",processEscapes:false,processEnvironments:true,preview:"TeX"},PreProcess:function(a){if(!this.configured){this.config=MathJax.Hub.CombineConfig("tex2jax",this.config);if(this.config.Augment){MathJax.Hub.Insert(this,this.config.Augment)}if(typeof(this.config.previewTeX)!=="undefined"&&!this.config.previewTeX){this.config.preview="none"}this.configured=true}if(typeof(a)==="string"){a=document.getElementById(a)}if(!a){a=document.body}this.createPatterns();this.scanElement(a,a.nextSibling)},createPatterns:function(){var d=[],c,a,b=this.config;this.match={};for(c=0,a=b.inlineMath.length;c<a;c++){d.push(this.patternQuote(b.inlineMath[c][0]));this.match[b.inlineMath[c][0]]={mode:"",end:b.inlineMath[c][1],pattern:this.endPattern(b.inlineMath[c][1])}}for(c=0,a=b.displayMath.length;c<a;c++){d.push(this.patternQuote(b.displayMath[c][0]));this.match[b.displayMath[c][0]]={mode:"; mode=display",end:b.displayMath[c][1],pattern:this.endPattern(b.displayMath[c][1])}}this.start=new RegExp(d.sort(this.sortLength).join("|")+(b.processEnvironments?"|\\\\begin\\{([^}]*)\\}":"")+(b.processEscapes?"|\\\\*\\\\\\$":""),"g");this.skipTags=new RegExp("^("+b.skipTags.join("|")+")$","i");this.ignoreClass=new RegExp("(^| )("+b.ignoreClass+")( |$)");this.processClass=new RegExp("(^| )("+b.processClass+")( |$)")},patternQuote:function(a){return a.replace(/([\^$(){}+*?\-|\[\]\:\\])/g,"\\$1")},endPattern:function(a){return new RegExp(this.patternQuote(a)+"|\\\\.","g")},sortLength:function(d,c){if(d.length!==c.length){return c.length-d.length}return(d==c?0:(d<c?-1:1))},scanElement:function(c,b,f){var a,e,d;while(c&&c!=b){if(c.nodeName.toLowerCase()==="#text"){if(!f){c=this.scanText(c)}}else{a=(typeof(c.className)==="undefined"?"":c.className);e=(typeof(c.tagName)==="undefined"?"":c.tagName);if(typeof(a)!=="string"){a=String(a)}if(c.firstChild&&!a.match(/(^| )MathJax/)&&!this.skipTags.exec(e)){d=(f||this.ignoreClass.exec(a))&&!this.processClass.exec(a);this.scanElement(c.firstChild,b,d)}}if(c){c=c.nextSibling}}},scanText:function(b){if(b.nodeValue.replace(/\s+/,"")==""){return b}var a,c;this.search={start:true};this.pattern=this.start;while(b){this.pattern.lastIndex=0;while(b&&b.nodeName.toLowerCase()==="#text"&&(a=this.pattern.exec(b.nodeValue))){if(this.search.start){b=this.startMatch(a,b)}else{b=this.endMatch(a,b)}}if(this.search.matched){b=this.encloseMath(b)}if(b){do{c=b;b=b.nextSibling}while(b&&(b.nodeName.toLowerCase()==="br"||b.nodeName.toLowerCase()==="#comment"));if(!b||b.nodeName!=="#text"){return c}}}return b},startMatch:function(a,b){var f=this.match[a[0]];if(f!=null){this.search={end:f.end,mode:f.mode,open:b,olen:a[0].length,opos:this.pattern.lastIndex-a[0].length};this.switchPattern(f.pattern)}else{if(a[0].substr(0,6)==="\\begin"){this.search={end:"\\end{"+a[1]+"}",mode:"; mode=display",open:b,olen:0,opos:this.pattern.lastIndex-a[0].length,isBeginEnd:true};this.switchPattern(this.endPattern(this.search.end))}else{var d=a[0].substr(0,a[0].length-1),g,c;if(d.length%2===0){c=[d.replace(/\\\\/g,"\\")];g=1}else{c=[d.substr(1).replace(/\\\\/g,"\\"),"$"];g=0}c=MathJax.HTML.Element("span",null,c);var e=MathJax.HTML.TextNode(b.nodeValue.substr(0,a.index));b.nodeValue=b.nodeValue.substr(a.index+a[0].length-g);b.parentNode.insertBefore(c,b);b.parentNode.insertBefore(e,c);this.pattern.lastIndex=g}}return b},endMatch:function(a,b){if(a[0]==this.search.end){this.search.close=b;this.search.cpos=this.pattern.lastIndex;this.search.clen=(this.search.isBeginEnd?0:a[0].length);this.search.matched=true;b=this.encloseMath(b);this.switchPattern(this.start)}return b},switchPattern:function(a){a.lastIndex=this.pattern.lastIndex;this.pattern=a;this.search.start=(a===this.start)},encloseMath:function(b){var a=this.search,f=a.close,e,c;if(a.cpos===f.length){f=f.nextSibling}else{f=f.splitText(a.cpos)}if(!f){e=f=MathJax.HTML.addText(a.close.parentNode,"")}a.close=f;c=(a.opos?a.open.splitText(a.opos):a.open);while(c.nextSibling&&c.nextSibling!==f){if(c.nextSibling.nodeValue!==null){if(c.nextSibling.nodeName==="#comment"){c.nodeValue+=c.nextSibling.nodeValue.replace(/^\[CDATA\[((.|\n|\r)*)\]\]$/,"$1")}else{c.nodeValue+=c.nextSibling.nodeValue}}else{if(this.msieNewlineBug){c.nodeValue+=(c.nextSibling.nodeName.toLowerCase()==="br"?"\n":" ")}else{c.nodeValue+=" "}}c.parentNode.removeChild(c.nextSibling)}var d=c.nodeValue.substr(a.olen,c.nodeValue.length-a.olen-a.clen);c.parentNode.removeChild(c);if(this.config.preview!=="none"){this.createPreview(a.mode,d)}c=this.createMathTag(a.mode,d);this.search={};this.pattern.lastIndex=0;if(e){e.parentNode.removeChild(e)}return c},insertNode:function(b){var a=this.search;a.close.parentNode.insertBefore(b,a.close)},createPreview:function(c,a){var b;if(this.config.preview==="TeX"){b=[this.filterTeX(a)]}else{if(this.config.preview instanceof Array){b=this.config.preview}}if(b){b=MathJax.HTML.Element("span",{className:MathJax.Hub.config.preRemoveClass},b);this.insertNode(b)}},createMathTag:function(c,b){var a=document.createElement("script");a.type="math/tex"+c;MathJax.HTML.setScript(a,b);this.insertNode(a);return a},filterTeX:function(a){return a},msieNewlineBug:(MathJax.Hub.Browser.isMSIE&&document.documentMode<9)};MathJax.Hub.Register.PreProcessor(["PreProcess",MathJax.Extension.tex2jax]);MathJax.Ajax.loadComplete("[MathJax]/extensions/tex2jax.js");
+
+(function(a,c,e,b,h){var i="1.1";var g=a.CombineConfig("MathZoom",{delay:400,styles:{"#MathJax_Zoom":{position:"absolute","background-color":"#F0F0F0",overflow:"auto",display:"block","z-index":301,padding:".5em",border:"1px solid black",margin:0,"font-family":"serif","font-size":"85%","font-weight":"normal","font-style":"normal","text-align":"left","text-indent":0,"text-transform":"none","line-height":"normal","letter-spacing":"normal","word-spacing":"normal","word-wrap":"normal","white-space":"nowrap","float":"none","box-shadow":"5px 5px 15px #AAAAAA","-webkit-box-shadow":"5px 5px 15px #AAAAAA","-moz-box-shadow":"5px 5px 15px #AAAAAA","-khtml-box-shadow":"5px 5px 15px #AAAAAA",filter:"progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color='gray', Positive='true')"},"#MathJax_ZoomOverlay":{position:"absolute",left:0,top:0,"z-index":300,display:"inline-block",width:"100%",height:"100%",border:0,padding:0,margin:0,"background-color":"white",opacity:0,filter:"alpha(opacity=0)"}}});var d=function(j){if(!j){j=window.event}if(j){if(j.preventDefault){j.preventDefault()}if(j.stopPropagation){j.stopPropagation()}j.cancelBubble=true;j.returnValue=false}return false};var f=MathJax.Extension.MathZoom={version:i,settings:a.config.menuSettings,HandleEvent:function(l,j,k){if(!l){l=window.event}if(f.settings.CTRL&&!l.ctrlKey){return true}if(f.settings.ALT&&!l.altKey){return true}if(f.settings.CMD&&!l.metaKey){return true}if(f.settings.Shift&&!l.shiftKey){return true}return f[j](l,k)},Click:function(k,j){if(this.settings.zoom==="Click"){return this.Zoom(j,k)}},DblClick:function(k,j){if(this.settings.zoom==="Double-Click"){return this.Zoom(j,k)}},Mouseover:function(k,j){if(this.settings.zoom==="Hover"){f.oldMouseOver=j.onmouseover;j.onmouseover=null;j.onmousemove=this.Mousemove;j.onmouseout=this.Mouseout;return f.Timer(k,j)}},Mouseout:function(j){this.onmouseover=f.oldMouseOver;delete f.oldMouseOver;this.onmousemove=this.onmouseout=null;f.ClearTimer();return d(j)},Mousemove:function(j){return f.Timer(j||window.event,this)},Timer:function(k,j){this.ClearTimer();this.timer=setTimeout(MathJax.Callback(["Zoom",this,j,{}]),g.delay);return d(k)},ClearTimer:function(){if(this.timer){clearTimeout(this.timer);delete this.timer}},Zoom:function(s,l){this.ClearTimer();this.Remove();var v=s.parentNode;if(v.className==="MathJax_MathContainer"){v=v.parentNode}if(v.parentNode.className==="MathJax_MathContainer"){v=v.parentNode.parentNode}var q=(String(v.className).match(/^MathJax_(MathML|Display)$/)?v:s).nextSibling;var m=a.getJaxFor(q),r=m.root;var o=(b&&m.outputJax.isa(b.constructor)?"HTMLCSS":(h&&m.outputJax.isa(h.constructor)?"MathML":null));if(!o){return}var j=Math.floor(0.85*document.body.clientWidth),p=Math.floor(0.85*document.body.clientHeight);var k=c.Element("span",{style:{position:"relative",display:"inline-block",height:0,width:0},id:"MathJax_ZoomFrame"},[["span",{id:"MathJax_ZoomOverlay",onmousedown:this.Remove}],["span",{id:"MathJax_Zoom",onclick:this.Remove,style:{visibility:"hidden",fontSize:this.settings.zscale,"max-width":j+"px","max-height":p+"px"}},[["span"]]]]);var x=k.lastChild,u=x.firstChild,n=k.firstChild;s.parentNode.insertBefore(k,s);if(this.msieZIndexBug){var t=c.Element("img",{src:"about:blank",id:"MathJax_ZoomTracker",style:{width:0,height:0,position:"relative"}});document.body.appendChild(k);k.style.position="absolute";k.style.zIndex=g.styles["#MathJax_ZoomOverlay"]["z-index"];k=t}var w=(this["Zoom"+o])(r,u,s);if(this.msiePositionBug){if(this.msieIE8Bug){u.style.position="absolute";x.style.height=u.offsetHeight;u.style.position="";if(x.offsetHeight<=p&&x.offsetWidth<=j){x.style.overflow="visible"}}if(this.msieWidthBug){x.style.width=Math.min(j,w.w)}else{if(w.w>j){x.style.width=j}}if(x.offsetHeight>p){x.style.Height=p+"px"}if(s.nextSibling){s.parentNode.insertBefore(k,s.nextSibling)}else{v.appendChild(k)}}else{if(this.operaPositionBug){x.style.width=Math.min(j,u.offsetWidth)+"px"}}this.Position(x,w,(o==="MathML"&&v.nodeName.toLowerCase()==="div"));x.style.visibility="";if(this.settings.zoom==="Hover"){n.onmouseover=this.Remove}if(window.addEventListener){addEventListener("resize",this.Resize,false)}else{if(window.attachEvent){attachEvent("onresize",this.Resize)}else{this.onresize=window.onresize;window.onresize=this.Resize}}return d(l)},ZoomHTMLCSS:function(o,q,p){q.className="MathJax";b.idPostfix="-zoom";b.getScales(q,q);o.toHTML(q,q);var r=o.HTMLspanElement().bbox;b.idPostfix="";if(r.width&&r.width!=="100%"){var j=Math.floor(0.85*document.body.clientWidth);q.style.width=j+"px";q.style.display="inline-block";var k=(o.id||"MathJax-Span-"+o.spanID)+"-zoom";var l=document.getElementById(k).firstChild;while(l&&l.style.width!==r.width){l=l.nextSibling}if(l){l.style.width="100%"}}q.appendChild(this.topImg);var n=this.topImg.offsetTop;q.removeChild(this.topImg);var m=(this.msieWidthBug?b.getW(p)*b.em:p.offsetWidth);return{w:r.w*b.em,Y:-n,W:m}},ZoomMathML:function(k,l,m){k.toNativeMML(l,l);var n;l.appendChild(this.topImg);n=this.topImg.offsetTop;l.removeChild(this.topImg);var j=(this.ffMMLwidthBug?m.parentNode:m).offsetWidth;return{w:l.offsetWidth,Y:-n,W:j}},Position:function(p,n,r){var k=this.Resize(),m=k.x,l=k.y,j=n.W;if(this.msiePositionBug){j=-j}if(r&&this.ffMMLcenterBug){j=0}var q=-Math.floor((p.offsetWidth-j)/2),o=n.Y;p.style.left=Math.max(q,20-m)+"px";p.style.top=Math.max(o,20-l)+"px"},Resize:function(l){if(f.onresize){f.onresize(l)}var j=0,o=0,n=document.getElementById("MathJax_ZoomFrame"),k=document.getElementById("MathJax_ZoomOverlay");var m=(f.msieZIndexBug?document.getElementById("MathJax_ZoomTracker"):n);if(f.operaPositionBug){n.style.border="1px solid"}if(m.offsetParent){do{j+=m.offsetLeft;o+=m.offsetTop}while(m=m.offsetParent)}if(f.operaPositionBug){n.style.border=""}if(f.msieZIndexBug){n.style.left=j+"px";n.style.top=o+"px"}k.style.left=(-j)+"px";k.style.top=(-o)+"px";if(f.msiePositionBug){setTimeout(f.SetWH,0)}else{f.SetWH()}return{x:j,y:o}},SetWH:function(){var j=document.getElementById("MathJax_ZoomOverlay");j.style.width=j.style.height="1px";j.style.width=document.body.scrollWidth+"px";j.style.height=document.body.scrollHeight+"px"},Remove:function(k){var l=document.getElementById("MathJax_ZoomFrame");if(l){l.parentNode.removeChild(l);l=document.getElementById("MathJax_ZoomTracker");if(l){l.parentNode.removeChild(l)}if(f.operaRefreshBug){var j=c.addElement(document.body,"div",{style:{position:"fixed",left:0,top:0,width:"100%",height:"100%",backgroundColor:"white",opacity:0},id:"MathJax_OperaDiv"});document.body.removeChild(j)}if(window.removeEventListener){removeEventListener("resize",f.Resize,false)}else{if(window.detachEvent){detachEvent("onresize",f.Resize)}else{window.onresize=f.onresize;delete f.onresize}}}return d(k)}};a.Register.StartupHook("HTML-CSS Jax Ready",function(){b=MathJax.OutputJax["HTML-CSS"];b.Augment({HandleEvent:f.HandleEvent})});a.Register.StartupHook("NativeMML Jax Ready",function(){h=MathJax.OutputJax.NativeMML;h.Augment({HandleEvent:f.HandleEvent,MSIEmouseup:function(l,k,j){if(this.trapUp){delete this.trapUp;return true}if(this.MSIEzoomKeys(l)){return true}return false},MSIEclick:function(l,k,j){if(this.trapClick){delete this.trapClick;return true}if(!this.MSIEzoomKeys(l)){return false}if(!this.settings.zoom.match(/Click/)){return false}return(f.Click(l,k)===false)},MSIEdblclick:function(l,k,j){if(!this.MSIEzoomKeys(l)){return false}return(f.DblClick(l,k)===false)},MSIEmouseover:function(l,k,j){if(this.settings.zoom!=="Hover"){return false}f.Timer(l,k);return true},MSIEmouseout:function(l,k,j){if(this.settings.zoom!=="Hover"){return false}f.ClearTimer();return true},MSIEmousemove:function(l,k,j){if(this.settings.zoom!=="Hover"){return false}f.Timer(l,k);return true},MSIEzoomKeys:function(j){if(this.settings.CTRL&&!j.ctrlKey){return false}if(this.settings.CMD&&!j.metaKey){return false}if(this.settings.ALT&&!j.altKey){return false}if(this.settings.Shift&&!j.shiftKey){return false}return true}})});a.Browser.Select({MSIE:function(j){var k=(document.compatMode==="BackCompat");var l=j.versionAtLeast("8.0")&&document.documentMode>7;f.msiePositionBug=true;f.msieWidthBug=!k;f.msieIE8Bug=l;f.msieZIndexBug=!l;f.msieInlineBlockAlignBug=(!l||k);if(document.documentMode>=9){delete g.styles["#MathJax_Zoom"].filter}},Opera:function(j){f.operaPositionBug=true;f.operaRefreshBug=true},Firefox:function(j){f.ffMMLwidthBug=true;f.ffMMLcenterBug=true}});f.topImg=(f.msieInlineBlockAlignBug?c.Element("img",{style:{width:0,height:0},src:"about:blank"}):c.Element("span",{style:{width:0,height:0,display:"inline-block"}}));if(f.operaPositionBug){f.topImg.style.border="1px solid"}MathJax.Callback.Queue(["Styles",e,g.styles],["Post",a.Startup.signal,"MathZoom Ready"],["loadComplete",e,"[MathJax]/extensions/MathZoom.js"])})(MathJax.Hub,MathJax.HTML,MathJax.Ajax,MathJax.OutputJax["HTML-CSS"],MathJax.OutputJax.NativeMML);
+
+(function(b,c,f){var k="1.1.4";MathJax.Extension.MathMenu={version:k};var i=b.Browser.isPC,g=b.Browser.isMSIE;var e=(i?null:"5px");var j=b.CombineConfig("MathMenu",{delay:150,helpURL:"http://www.mathjax.org/help/user/",showRenderer:true,showFontMenu:false,showContext:false,windowSettings:{status:"no",toolbar:"no",locationbar:"no",menubar:"no",directories:"no",personalbar:"no",resizable:"yes",scrollbars:"yes",width:100,height:50},styles:{"#MathJax_About":{position:"fixed",left:"50%",width:"auto","text-align":"center",border:"3px outset",padding:"1em 2em","background-color":"#DDDDDD",color:"black",cursor:"default","font-family":"message-box","font-size":"120%","font-style":"normal","text-indent":0,"text-transform":"none","line-height":"normal","letter-spacing":"normal","word-spacing":"normal","word-wrap":"normal","white-space":"nowrap","float":"none","z-index":201,"border-radius":"15px","-webkit-border-radius":"15px","-moz-border-radius":"15px","-khtml-border-radius":"15px","box-shadow":"0px 10px 20px #808080","-webkit-box-shadow":"0px 10px 20px #808080","-moz-box-shadow":"0px 10px 20px #808080","-khtml-box-shadow":"0px 10px 20px #808080",filter:"progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color='gray', Positive='true')"},".MathJax_Menu":{position:"absolute","background-color":"white",color:"black",width:"auto",padding:(i?"2px":"5px 0px"),border:"1px solid #CCCCCC",margin:0,cursor:"default",font:"menu","text-align":"left","text-indent":0,"text-transform":"none","line-height":"normal","letter-spacing":"normal","word-spacing":"normal","word-wrap":"normal","white-space":"nowrap","float":"none","z-index":201,"border-radius":e,"-webkit-border-radius":e,"-moz-border-radius":e,"-khtml-border-radius":e,"box-shadow":"0px 10px 20px #808080","-webkit-box-shadow":"0px 10px 20px #808080","-moz-box-shadow":"0px 10px 20px #808080","-khtml-box-shadow":"0px 10px 20px #808080",filter:"progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color='gray', Positive='true')"},".MathJax_MenuItem":{padding:(i?"2px 2em":"1px 2em"),background:"transparent"},".MathJax_MenuTitle":{"background-color":"#CCCCCC",margin:(i?"-1px -1px 1px -1px":"-5px 0 0 0"),"text-align":"center","font-style":"italic","font-size":"80%",color:"#444444",padding:"2px 0",overflow:"hidden"},".MathJax_MenuArrow":{position:"absolute",right:".5em",color:"#666666","font-family":(g?"'Arial unicode MS'":null)},".MathJax_MenuActive .MathJax_MenuArrow":{color:"white"},".MathJax_MenuCheck":{position:"absolute",left:".7em","font-family":(g?"'Arial unicode MS'":null)},".MathJax_MenuRadioCheck":{position:"absolute",left:(i?"1em":".7em")},".MathJax_MenuLabel":{padding:(i?"2px 2em 4px 1.33em":"1px 2em 3px 1.33em"),"font-style":"italic"},".MathJax_MenuRule":{"border-top":(i?"1px solid #CCCCCC":"1px solid #DDDDDD"),margin:(i?"4px 1px 0px":"4px 3px")},".MathJax_MenuDisabled":{color:"GrayText"},".MathJax_MenuActive":{"background-color":(i?"Highlight":"#606872"),color:(i?"HighlightText":"white")}}});var d=function(l){if(!l){l=window.event}if(l){if(l.preventDefault){l.preventDefault()}if(l.stopPropagation){l.stopPropagation()}l.cancelBubble=true;l.returnValue=false}return false};var a=MathJax.Menu=MathJax.Object.Subclass({version:k,items:[],posted:false,title:null,margin:5,Init:function(l){this.items=[].slice.call(arguments,0)},With:function(l){if(l){b.Insert(this,l)}return this},Post:function(n,v){if(!n){n=window.event}var t=(!this.title?null:[["div",{className:"MathJax_MenuTitle"},[this.title]]]);var l=document.getElementById("MathJax_MenuFrame");if(!l){l=a.Background(this)}var o=c.addElement(l,"div",{onmouseup:a.Mouseup,ondblclick:this.False,ondragstart:this.False,onselectstart:this.False,oncontextmenu:this.False,menuItem:this,className:"MathJax_Menu"},t);for(var q=0,p=this.items.length;q<p;q++){this.items[q].Create(o)}this.posted=true;o.style.width=(o.offsetWidth+2)+"px";var u=n.pageX,s=n.pageY;if(!u&&!s){u=n.clientX+document.body.scrollLeft+document.documentElement.scrollLeft;s=n.clientY+document.body.scrollTop+document.documentElement.scrollTop}if(!v){if(u+o.offsetWidth>document.body.offsetWidth-this.margin){u=document.body.offsetWidth-o.offsetWidth-this.margin}a.skipUp=true}else{var r="left",w=v.offsetWidth;u=v.offsetWidth-2;s=0;while(v&&v!==l){u+=v.offsetLeft;s+=v.offsetTop;v=v.parentNode}if(u+o.offsetWidth>document.body.offsetWidth-this.margin){r="right";u=Math.max(this.margin,u-w-o.offsetWidth+6)}if(!i){o.style["borderRadiusTop"+r]=0;o.style["WebkitBorderRadiusTop"+r]=0;o.style["MozBorderRadiusTop"+r]=0;o.style["KhtmlBorderRadiusTop"+r]=0}}o.style.left=u+"px";o.style.top=s+"px";if(document.selection&&document.selection.empty){document.selection.empty()}return this.False(n)},Remove:function(l,m){var n=document.getElementById("MathJax_MenuFrame");if(n){n.parentNode.removeChild(n);if(this.msieBackgroundBug){detachEvent("onresize",a.Resize)}}},Mouseup:function(l,m){if(a.skipUp){delete a.skipUp}else{this.Remove(l,m)}},False:d},{config:j,div:null,Remove:function(l){a.Event(l,this,"Remove")},Mouseover:function(l){a.Event(l,this,"Mouseover")},Mouseout:function(l){a.Event(l,this,"Mouseout")},Mousedown:function(l){a.Event(l,this,"Mousedown")},Mouseup:function(l){a.Event(l,this,"Mouseup")},Mousemove:function(l){a.Event(l,this,"Mousemove")},Event:function(n,o,l){if(!n){n=window.event}var m=o.menuItem;if(m&&m[l]){return m[l](n,o)}return null},BGSTYLE:{position:"absolute",left:0,top:0,"z-index":200,width:"100%",height:"100%",border:0,padding:0,margin:0},Background:function(m){var n=c.addElement(document.body,"div",{style:this.BGSTYLE,id:"MathJax_MenuFrame"},[["div",{style:this.BGSTYLE,menuItem:m,onmousedown:this.Remove}]]);var l=n.firstChild;if(m.msieBackgroundBug){l.style.backgroundColor="white";l.style.filter="alpha(opacity=0)";n.width=n.height=0;this.Resize();attachEvent("onresize",this.Resize)}else{l.style.position="fixed"}return n},Resize:function(){setTimeout(a.SetWH,0)},SetWH:function(){var l=document.getElementById("MathJax_MenuFrame");if(l){l=l.firstChild;l.style.width=l.style.height="1px";l.style.width=document.body.scrollWidth+"px";l.style.height=document.body.scrollHeight+"px"}},saveCookie:function(){c.Cookie.Set("menu",this.cookie)},getCookie:function(){this.cookie=c.Cookie.Get("menu")}});var h=a.ITEM=MathJax.Object.Subclass({name:"",Create:function(m){if(!this.hidden){var l={onmouseover:a.Mouseover,onmouseout:a.Mouseout,onmouseup:a.Mouseup,onmousedown:this.False,ondragstart:this.False,onselectstart:this.False,onselectend:this.False,className:"MathJax_MenuItem",menuItem:this};if(this.disabled){l.className+=" MathJax_MenuDisabled"}c.addElement(m,"div",l,this.Label(l,m))}},Mouseover:function(q,s){if(!this.disabled){this.Activate(s)}if(!this.menu||!this.menu.posted){var r=document.getElementById("MathJax_MenuFrame").childNodes,n=s.parentNode.childNodes;for(var o=0,l=n.length;o<l;o++){var p=n[o].menuItem;if(p&&p.menu&&p.menu.posted){p.Deactivate(n[o])}}l=r.length-1;while(l>=0&&s.parentNode.menuItem!==r[l].menuItem){r[l].menuItem.posted=false;r[l].parentNode.removeChild(r[l]);l--}if(this.Timer){this.Timer(q,s)}}},Mouseout:function(l,m){if(!this.menu||!this.menu.posted){this.Deactivate(m)}if(this.timer){clearTimeout(this.timer);delete this.timer}},Mouseup:function(l,m){return this.Remove(l,m)},Remove:function(l,m){m=m.parentNode.menuItem;return m.Remove(l,m)},Activate:function(l){this.Deactivate(l);l.className+=" MathJax_MenuActive"},Deactivate:function(l){l.className=l.className.replace(/ MathJax_MenuActive/,"")},With:function(l){if(l){b.Insert(this,l)}return this},False:d});a.ITEM.COMMAND=a.ITEM.Subclass({action:function(){},Init:function(l,n,m){this.name=l;this.action=n;this.With(m)},Label:function(l,m){return[this.name]},Mouseup:function(l,m){if(!this.disabled){this.Remove(l,m);this.action.call(this,l)}return this.False(l)}});a.ITEM.SUBMENU=a.ITEM.Subclass({menu:null,marker:(i&&!b.Browser.isSafari?"\u25B6":"\u25B8"),Init:function(l,n){this.name=l;var m=1;if(!(n instanceof a.ITEM)){this.With(n),m++}this.menu=a.apply(a,[].slice.call(arguments,m))},Label:function(l,m){l.onmousemove=a.Mousemove;this.menu.posted=false;return[this.name+" ",["span",{className:"MathJax_MenuArrow"},[this.marker]]]},Timer:function(l,m){if(this.timer){clearTimeout(this.timer)}l={clientX:l.clientX,clientY:l.clientY};this.timer=setTimeout(MathJax.Callback(["Mouseup",this,l,m]),j.delay)},Mouseup:function(n,p){if(!this.disabled){if(!this.menu.posted){if(this.timer){clearTimeout(this.timer);delete this.timer}this.menu.Post(n,p)}else{var o=document.getElementById("MathJax_MenuFrame").childNodes,l=o.length-1;while(l>=0){var q=o[l];q.menuItem.posted=false;q.parentNode.removeChild(q);if(q.menuItem===this.menu){break}l--}}}return this.False(n)}});a.ITEM.RADIO=a.ITEM.Subclass({variable:null,marker:(i?"\u25CF":"\u2713"),Init:function(m,l,n){this.name=m;this.variable=l;this.With(n);if(this.value==null){this.value=this.name}},Label:function(m,n){var l={className:"MathJax_MenuRadioCheck"};if(j.settings[this.variable]!==this.value){l={style:{display:"none"}}}return[["span",l,[this.marker]]," "+this.name]},Mouseup:function(p,q){if(!this.disabled){var r=q.parentNode.childNodes;for(var n=0,l=r.length;n<l;n++){var o=r[n].menuItem;if(o&&o.variable===this.variable){r[n].firstChild.style.display="none"}}q.firstChild.display="";j.settings[this.variable]=this.value;a.cookie[this.variable]=j.settings[this.variable];a.saveCookie();if(this.action){this.action.call(a)}}this.Remove(p,q);return this.False(p)}});a.ITEM.CHECKBOX=a.ITEM.Subclass({variable:null,marker:"\u2713",Init:function(m,l,n){this.name=m;this.variable=l;this.With(n)},Label:function(m,n){var l={className:"MathJax_MenuCheck"};if(!j.settings[this.variable]){l={style:{display:"none"}}}return[["span",l,[this.marker]]," "+this.name]},Mouseup:function(l,m){if(!this.disabled){m.firstChild.display=(j.settings[this.variable]?"none":"");j.settings[this.variable]=!j.settings[this.variable];a.cookie[this.variable]=j.settings[this.variable];a.saveCookie();if(this.action){this.action.call(a)}}this.Remove(l,m);return this.False(l)}});a.ITEM.LABEL=a.ITEM.Subclass({Init:function(l,m){this.name=l;this.With(m)},Label:function(l,m){delete l.onmouseover,delete l.onmouseout;delete l.onmousedown;l.className+=" MathJax_MenuLabel";return[this.name]}});a.ITEM.RULE=a.ITEM.Subclass({Label:function(l,m){delete l.onmouseover,delete l.onmouseout;delete l.onmousedown;l.className+=" MathJax_MenuRule";return null}});a.About=function(){var o=MathJax.OutputJax["HTML-CSS"]||{fontInUse:""};var q=(o.webFonts?"":"local "),m=(o.webFonts?" web":"");var n=(o.imgFonts?"Image":q+o.fontInUse+m)+" fonts";var l=["MathJax.js v"+MathJax.fileversion,["br"]];l.push(["div",{style:{"border-top":"groove 2px",margin:".25em 0"}}]);a.About.GetJax(l,MathJax.InputJax,"Input Jax");a.About.GetJax(l,MathJax.OutputJax,"Output Jax");a.About.GetJax(l,MathJax.ElementJax,"Element Jax");l.push(["div",{style:{"border-top":"groove 2px",margin:".25em 0"}}]);a.About.GetJax(l,MathJax.Extension,"Extension",true);l.push(["div",{style:{"border-top":"groove 2px",margin:".25em 0"}}],["center",{},[b.Browser+" v"+b.Browser.version+(o.webFonts?" \u2014 "+o.allowWebFonts+" fonts":"")]]);a.About.div=a.Background(a.About);var r=MathJax.HTML.addElement(a.About.div,"div",{id:"MathJax_About",onclick:a.About.Remove},[["b",{style:{fontSize:"120%"}},["MathJax"]]," v"+MathJax.version,["br"],"using "+n,["br"],["br"],["span",{style:{display:"inline-block","text-align":"left","font-size":"80%","background-color":"#E4E4E4",padding:".4em .6em",border:"1px inset"}},l],["br"],["br"],["a",{href:"http://www.mathjax.org/"},["www.mathjax.org"]]]);var s=(document.documentElement||{});var p=window.innerHeight||s.clientHeight||s.scrollHeight||0;if(a.prototype.msieAboutBug){r.style.width="20em";r.style.position="absolute";r.style.left=Math.floor((document.documentElement.scrollWidth-r.offsetWidth)/2)+"px";r.style.top=(Math.floor((p-r.offsetHeight)/3)+document.body.scrollTop)+"px"}else{r.style.marginLeft=Math.floor(-r.offsetWidth/2)+"px";r.style.top=Math.floor((p-r.offsetHeight)/3)+"px"}};a.About.Remove=function(l){if(a.About.div){document.body.removeChild(a.About.div);delete a.About.div}};a.About.GetJax=function(l,o,n,m){for(var p in o){if(o.hasOwnProperty(p)&&o[p]){if((m&&o[p].version)||(o[p].isa&&o[p].isa(o))){l.push((o[p].id||p)+" "+n+" v"+o[p].version,["br"])}}}return l};a.Help=function(){window.open(j.helpURL,"MathJaxHelp")};a.ShowSource=function(o){if(!o){o=window.event}var n={screenX:o.screenX,screenY:o.screenY};if(!a.jax){return}if(j.settings.format==="MathML"){var l=MathJax.ElementJax.mml;if(l&&typeof(l.mbase.prototype.toMathML)!=="undefined"){try{a.ShowSource.Text(a.jax.root.toMathML(),o)}catch(m){if(!m.restart){throw m}MathJax.Callback.After([this,arguments.callee,n])}}else{if(!f.loadingToMathML){f.loadingToMathML=true;a.ShowSource.Window(o);MathJax.Callback.Queue(f.Require("[MathJax]/extensions/toMathML.js"),function(){delete f.loadingToMathML},[this,arguments.callee,n]);return}}}else{if(a.jax.originalText==null){alert("No TeX form available");return}a.ShowSource.Text(a.jax.originalText,o)}};a.ShowSource.Window=function(m){if(!a.ShowSource.w){var n=[],l=j.windowSettings;for(var o in l){if(l.hasOwnProperty(o)){n.push(o+"="+l[o])}}a.ShowSource.w=window.open("","_blank",n.join(","))}return a.ShowSource.w};a.ShowSource.Text=function(r,q){var n=a.ShowSource.Window(q);r=r.replace(/^\s*/,"").replace(/\s*$/,"");r=r.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");n.document.open();n.document.write("<html><head><title>MathJax Equation Source</title></head><body style='font-size:85%'>");n.document.write("<table><tr><td><pre>"+r+"</pre></td></tr></table>");n.document.write("</body></html>");n.document.close();var p=n.document.body.firstChild;var o=(n.outerHeight-n.innerHeight)||30,m=(n.outerWidth-n.innerWidth)||30;m=Math.min(Math.floor(0.5*screen.width),p.offsetWidth+m+25);o=Math.min(Math.floor(0.5*screen.height),p.offsetHeight+o+25);n.resizeTo(m,o);if(q&&q.screenX!=null){var l=Math.max(0,Math.min(q.screenX-Math.floor(m/2),screen.width-m-20)),s=Math.max(0,Math.min(q.screenY-Math.floor(o/2),screen.height-o-20));n.moveTo(l,s)}delete a.ShowSource.w};a.Scale=function(){var m=MathJax.OutputJax["HTML-CSS"],l=MathJax.OutputJax.NativeMML;var o=(m?m.config.scale:l.config.scale);var n=prompt("Scale all mathematics (compared to surrounding text) by",o+"%");if(n){if(n.match(/^\s*\d+\s*%?\s*$/)){n=parseInt(n);if(n){if(n!==o){if(m){m.config.scale=n}if(l){l.config.scale=n}a.cookie.scale=n;a.saveCookie();b.Reprocess()}}else{alert("The scale should not be zero")}}else{alert("The scale should be a perentage (e.g., 120%)")}}};a.Zoom=function(){if(!MathJax.Extension.MathZoom){f.Require("[MathJax]/extensions/MathZoom.js")}};a.Renderer=function(){var l=b.config.outputJax["jax/mml"];if(l[0]!==j.settings.renderer){MathJax.Callback.Queue(["Require",f,"[MathJax]/jax/output/"+j.settings.renderer+"/config.js"],["Post",b.Startup.signal,j.settings.renderer+" output selected"],[function(){var p=MathJax.OutputJax[j.settings.renderer];for(var o=0,n=l.length;o<n;o++){if(l[o]===p){l.splice(o,1);break}}l.unshift(p)}],["Reprocess",b])}};a.Font=function(){var l=MathJax.OutputJax["HTML-CSS"];if(!l){return}document.location.reload()};b.Browser.Select({MSIE:function(l){var m=(document.compatMode==="BackCompat");var n=l.versionAtLeast("8.0")&&document.documentMode>7;a.Augment({margin:20,msieBackgroundBug:(m||!n),msieAboutBug:m});if(document.documentMode>=9){delete j.styles["#MathJax_About"].filter;delete j.styles[".MathJax_Menu"].filter}}});b.Register.StartupHook("End Config",function(){j.settings=b.config.menuSettings;if(!j.settings.format){j.settings.format=(MathJax.InputJax.TeX?"Original":"MathML")}if(typeof(j.settings.showRenderer)!=="undefined"){j.showRenderer=j.settings.showRenderer}if(typeof(j.settings.showFontMenu)!=="undefined"){j.showFontMenu=j.settings.showFontMenu}if(typeof(j.settings.showContext)!=="undefined"){j.showContext=j.settings.showContext}a.getCookie();a.menu=a(h.COMMAND("Show Source",a.ShowSource),h.SUBMENU("Format",h.RADIO("MathML","format"),h.RADIO("Original","format",{value:"Original"})),h.RULE(),h.SUBMENU("Settings",h.SUBMENU("Zoom Trigger",h.RADIO("Hover","zoom",{action:a.Zoom}),h.RADIO("Click","zoom",{action:a.Zoom}),h.RADIO("Double-Click","zoom",{action:a.Zoom}),h.RADIO("No Zoom","zoom",{value:"None"}),h.RULE(),h.LABEL("Trigger Requires:"),h.CHECKBOX((b.Browser.isMac?"Option":"Alt"),"ALT"),h.CHECKBOX("Command","CMD",{hidden:!b.Browser.isMac}),h.CHECKBOX("Control","CTRL",{hidden:b.Browser.isMac}),h.CHECKBOX("Shift","Shift")),h.SUBMENU("Zoom Factor",h.RADIO("125%","zscale"),h.RADIO("133%","zscale"),h.RADIO("150%","zscale"),h.RADIO("175%","zscale"),h.RADIO("200%","zscale"),h.RADIO("250%","zscale"),h.RADIO("300%","zscale"),h.RADIO("400%","zscale")),h.RULE(),h.SUBMENU("Math Renderer",{hidden:!j.showRenderer},h.RADIO("HTML-CSS","renderer",{action:a.Renderer}),h.RADIO("MathML","renderer",{action:a.Renderer,value:"NativeMML"})),h.SUBMENU("Font Preference",{hidden:!j.showFontMenu},h.LABEL("For HTML-CSS:"),h.RADIO("Auto","font",{action:a.Font}),h.RULE(),h.RADIO("TeX (local)","font",{action:a.Font}),h.RADIO("TeX (web)","font",{action:a.Font}),h.RADIO("TeX (image)","font",{action:a.Font}),h.RULE(),h.RADIO("STIX (local)","font",{action:a.Font})),h.SUBMENU("Contextual Menu",{hidden:!j.showContext},h.RADIO("MathJax","context"),h.RADIO("Browser","context")),h.COMMAND("Scale All Math ...",a.Scale)),h.RULE(),h.COMMAND("About MathJax",a.About),h.COMMAND("MathJax Help",a.Help))});a.showRenderer=function(l){a.cookie.showRenderer=j.showRenderer=l;a.saveCookie();a.menu.items[3].menu.item[3].hidden=!l};a.showFontMenu=function(l){a.cookie.showFontMenu=j.showFontMenu=l;a.saveCookie();a.menu.items[3].menu.items[4].hidden=!l};a.showContext=function(l){a.cookie.showContext=j.showContext=l;a.saveCookie();a.menu.items[3].menu.items[5].hidden=!l};MathJax.Callback.Queue(["Styles",f,j.styles],["Post",b.Startup.signal,"MathMenu Ready"],["loadComplete",f,"[MathJax]/extensions/MathMenu.js"])})(MathJax.Hub,MathJax.HTML,MathJax.Ajax);
+
+MathJax.ElementJax.mml=MathJax.ElementJax({mimeType:"jax/mml"},{id:"mml",version:"1.1.1",directory:MathJax.ElementJax.directory+"/mml",extensionDir:MathJax.ElementJax.extensionDir+"/mml",optableDir:MathJax.ElementJax.directory+"/mml/optable"});MathJax.ElementJax.mml.Augment({Init:function(){if(arguments.length===1&&arguments[0].type==="math"){this.root=arguments[0]}else{this.root=MathJax.ElementJax.mml.math.apply(this,arguments)}if(this.root.mode){if(!this.root.display&&this.root.mode==="display"){this.root.display="block"}delete this.root.mode}}},{INHERIT:"_inherit_",AUTO:"_auto_",SIZE:{INFINITY:"infinity",SMALL:"small",NORMAL:"normal",BIG:"big"},COLOR:{TRANSPARENT:"transparent"},VARIANT:{NORMAL:"normal",BOLD:"bold",ITALIC:"italic",BOLDITALIC:"bold-italic",DOUBLESTRUCK:"double-struck",FRAKTUR:"fraktur",BOLDFRAKTUR:"bold-fraktur",SCRIPT:"script",BOLDSCRIPT:"bold-script",SANSSERIF:"sans-serif",BOLDSANSSERIF:"bold-sans-serif",SANSSERIFITALIC:"sans-serif-italic",SANSSERIFBOLDITALIC:"sans-serif-bold-italic",MONOSPACE:"monospace",INITIAL:"inital",TAILED:"tailed",LOOPED:"looped",STRETCHED:"stretched",CALIGRAPHIC:"-tex-caligraphic",OLDSTYLE:"-tex-oldstyle"},FORM:{PREFIX:"prefix",INFIX:"infix",POSTFIX:"postfix"},LINEBREAK:{AUTO:"auto",NEWLINE:"newline",NOBREAK:"nobreak",GOODBREAK:"goodbreak",BADBREAK:"badbreak"},LINEBREAKSTYLE:{BEFORE:"before",AFTER:"after",DUPLICATE:"duplicate",INFIXLINBREAKSTYLE:"infixlinebreakstyle"},INDENTALIGN:{LEFT:"left",CENTER:"center",RIGHT:"right",AUTO:"auto",ID:"id",INDENTALIGN:"indentalign"},INDENTSHIFT:{INDENTSHIFT:"indentshift"},LINETHICKNESS:{THIN:"thin",MEDIUM:"medium",THICK:"thick"},NOTATION:{LONGDIV:"longdiv",ACTUARIAL:"actuarial",RADICAL:"radical",BOX:"box",ROUNDEDBOX:"roundedbox",CIRCLE:"circle",LEFT:"left",RIGHT:"right",TOP:"top",BOTTOM:"bottom",UPDIAGONALSTRIKE:"updiagonalstrike",DOWNDIAGONALSTRIKE:"downdiagonalstrike",VERTICALSTRIKE:"verticalstrike",HORIZONTALSTRIKE:"horizontalstrike",MADRUWB:"madruwb"},ALIGN:{TOP:"top",BOTTOM:"bottom",CENTER:"center",BASELINE:"baseline",AXIS:"axis",LEFT:"left",RIGHT:"right"},LINES:{NONE:"none",SOLID:"solid",DASHED:"dashed"},SIDE:{LEFT:"left",RIGHT:"right",LEFTOVERLAP:"leftoverlap",RIGHTOVERLAP:"rightoverlap"},WIDTH:{AUTO:"auto",FIT:"fit"},ACTIONTYPE:{TOGGLE:"toggle",STATUSLINE:"statusline",TOOLTIP:"tooltip",INPUT:"input"},LENGTH:{VERYVERYTHINMATHSPACE:"veryverythinmathspace",VERYTHINMATHSPACE:"verythinmathspace",THINMATHSPACE:"thinmathspace",MEDIUMMATHSPACE:"mediummathspace",THICKMATHSPACE:"thickmathspace",VERYTHICKMATHSPACE:"verythickmathspace",VERYVERYTHICKMATHSPACE:"veryverythickmathspace",NEGATIVEVERYVERYTHINMATHSPACE:"negativeveryverythinmathspace",NEGATIVEVERYTHINMATHSPACE:"negativeverythinmathspace",NEGATIVETHINMATHSPACE:"negativethinmathspace",NEGATIVEMEDIUMMATHSPACE:"negativemediummathspace",NEGATIVETHICKMATHSPACE:"negativethickmathspace",NEGATIVEVERYTHICKMATHSPACE:"negativeverythickmathspace",NEGATIVEVERYVERYTHICKMATHSPACE:"negativeveryverythickmathspace"},OVERFLOW:{LINBREAK:"linebreak",SCROLL:"scroll",ELIDE:"elide",TRUNCATE:"truncate",SCALE:"scale"},UNIT:{EM:"em",EX:"ex",PX:"px",IN:"in",CM:"cm",MM:"mm",PT:"pt",PC:"pc"},TEXCLASS:{ORD:0,OP:1,BIN:2,REL:3,OPEN:4,CLOSE:5,PUNCT:6,INNER:7,VCENTER:8,NONE:-1},PLANE1:String.fromCharCode(55349)});(function(a){var d=false;var b=true;a.mbase=MathJax.Object.Subclass({type:"base",isToken:d,defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT},noInherit:{},Init:function(){this.data=[];if(this.inferRow&&!(arguments.length===1&&arguments[0].inferred)){this.Append(a.mrow().With({inferred:b}))}this.Append.apply(this,arguments)},With:function(f){for(var g in f){if(f.hasOwnProperty(g)){this[g]=f[g]}}return this},Append:function(){if(this.inferRow&&this.data.length){this.data[0].Append.apply(this.data[0],arguments)}else{for(var g=0,f=arguments.length;g<f;g++){this.SetData(this.data.length,arguments[g])}}},SetData:function(f,g){if(g!=null){if(!(g instanceof a.mbase)){g=(this.isToken?a.chars(g):a.mtext(g))}g.parent=this;g.setInherit(this.inheritFromMe?this:this.inherit)}this.data[f]=g},Parent:function(){var f=this.parent;while(f&&f.inferred){f=f.parent}return f},Get:function(g,k){if(typeof(this[g])!=="undefined"){return this[g]}var h=this.Parent();if(h&&h["adjustChild_"+g]!=null){return(h["adjustChild_"+g])(h.childPosition(this))}var j=this.inherit;var f=j;while(j){if(typeof(j[g])!=="undefined"){var i=j.noInherit[this.type];if(!(i&&i[g])){return j[g]}}f=j;j=j.inherit}if(!k){if(this.defaults[g]===a.AUTO){return this.autoDefault(g)}if(this.defaults[g]!==a.INHERIT&&this.defaults[g]!=null){return this.defaults[g]}if(f){return f.defaults[g]}}return null},hasValue:function(f){return(this.Get(f,true)!=null)},getValues:function(){var g={};for(var h=0,f=arguments.length;h<f;h++){g[arguments[h]]=this.Get(arguments[h])}return g},adjustChild_scriptlevel:function(f){return this.Get("scriptlevel")},adjustChild_displaystyle:function(f){return this.Get("displaystyle")},adjustChild_texprimestyle:function(f){return this.Get("texprimestyle")},childPosition:function(h){if(h.parent.inferred){h=h.parent}for(var g=0,f=this.data.length;g<f;g++){if(this.data[g]===h){return g}}return null},setInherit:function(h){if(h!==this.inherit&&this.inherit==null){this.inherit=h;for(var g=0,f=this.data.length;g<f;g++){if(this.data[g]&&this.data[g].setInherit){this.data[g].setInherit(h)}}}},setTeXclass:function(f){this.getPrevClass(f);return(typeof(this.texClass)!=="undefined"?this:f)},getPrevClass:function(f){if(f){this.prevClass=f.Get("texClass");this.prevLevel=f.Get("scriptlevel")}},updateTeXclass:function(f){if(f){this.prevClass=f.prevClass;delete f.prevClass;this.prevLevel=f.prevLevel;delete f.prevLevel;this.texClass=f.Get("texClass")}},texSpacing:function(){var g=(this.prevClass!=null?this.prevClass:a.TEXCLASS.NONE);var f=(this.Get("texClass")||a.TEXCLASS.ORD);if(g===a.TEXCLASS.NONE||f===a.TEXCLASS.NONE){return""}if(g===a.TEXCLASS.VCENTER){g=a.TEXCLASS.ORD}if(f===a.TEXCLASS.VCENTER){f=a.TEXCLASS.ORD}var h=this.TEXSPACE[g][f];if(this.prevLevel>0&&this.Get("scriptlevel")>0&&h>=0){return""}return this.TEXSPACELENGTH[Math.abs(h)]},TEXSPACELENGTH:["",a.LENGTH.THINMATHSPACE,a.LENGTH.MEDIUMMATHSPACE,a.LENGTH.THICKMATHSPACE],TEXSPACE:[[0,-1,2,3,0,0,0,1],[-1,-1,0,3,0,0,0,1],[2,2,0,0,2,0,0,2],[3,3,0,0,3,0,0,3],[0,0,0,0,0,0,0,0],[0,-1,2,3,0,0,0,1],[1,1,0,1,1,1,1,1],[1,-1,2,3,1,0,1,1]],autoDefault:function(f){return""},isSpacelike:function(){return d},isEmbellished:function(){return d},Core:function(){return this},CoreMO:function(){return this},lineBreak:function(){if(this.isEmbellished()){return this.CoreMO().lineBreak()}else{return"none"}},array:function(){if(this.inferred){return this.data}else{return[this]}},toString:function(){return this.type+"("+this.data.join(",")+")"}},{childrenSpacelike:function(){for(var f=0;f<this.data.length;f++){if(!this.data[f].isSpacelike()){return d}}return b},childEmbellished:function(){return(this.data[0]&&this.data[0].isEmbellished())},childCore:function(){return this.data[0]},childCoreMO:function(){return(this.data[0]?this.data[0].CoreMO():null)},setChildTeXclass:function(f){if(this.data[0]){f=this.data[0].setTeXclass(f);this.updateTeXclass(this.data[0])}return f},setBaseTeXclasses:function(h){this.getPrevClass(h);this.texClass=null;if(this.isEmbellished()){h=this.data[0].setTeXclass(h);this.updateTeXclass(this.Core())}else{if(this.data[0]){this.data[0].setTeXclass()}h=this}for(var g=1,f=this.data.length;g<f;g++){if(this.data[g]){this.data[g].setTeXclass()}}return h},setSeparateTeXclasses:function(h){this.getPrevClass(h);for(var g=0,f=this.data.length;g<f;g++){if(this.data[g]){this.data[g].setTeXclass()}}if(this.isEmbellished()){this.updateTeXclass(this.Core())}return this}});a.mi=a.mbase.Subclass({type:"mi",isToken:b,texClass:a.TEXCLASS.ORD,defaults:{mathvariant:a.AUTO,mathsize:a.INHERIT,mathbackground:a.INHERIT,mathcolor:a.INHERIT},autoDefault:function(g){if(g==="mathvariant"){var f=(this.data[0]||"").toString();return(f.length===1||(f.length===2&&f.charCodeAt(0)===this.PLANE1)?a.VARIANT.ITALIC:a.VARIANT.NORMAL)}return""}});a.mn=a.mbase.Subclass({type:"mn",isToken:b,texClass:a.TEXCLASS.ORD,defaults:{mathvariant:a.INHERIT,mathsize:a.INHERIT,mathbackground:a.INHERIT,mathcolor:a.INHERIT}});a.mo=a.mbase.Subclass({type:"mo",isToken:b,defaults:{mathvariant:a.INHERIT,mathsize:a.INHERIT,mathbackground:a.INHERIT,mathcolor:a.INHERIT,form:a.AUTO,fence:a.AUTO,separator:a.AUTO,lspace:a.AUTO,rspace:a.AUTO,stretchy:a.AUTO,symmetric:a.AUTO,maxsize:a.AUTO,minsize:a.AUTO,largeop:a.AUTO,movablelimits:a.AUTO,accent:a.AUTO,linebreak:a.LINEBREAK.AUTO,lineleading:a.INHERIT,linebreakstyle:a.AUTO,linebreakmultchar:a.INHERIT,indentalign:a.INHERIT,indentshift:a.INHERIT,indenttarget:a.INHERIT,indentalignfirst:a.INHERIT,indentshiftfirst:a.INHERIT,indentalignlast:a.INHERIT,indentshiftlast:a.INHERIT,texClass:a.AUTO},defaultDef:{form:a.FORM.INFIX,fence:d,separator:d,lspace:a.LENGTH.THICKMATHSPACE,rspace:a.LENGTH.THICKMATHSPACE,stretchy:d,symmetric:b,maxsize:a.SIZE.INFINITY,minsize:"0em",largeop:d,movablelimits:d,accent:d,linebreak:a.LINEBREAK.AUTO,lineleading:"1ex",linebreakstyle:"before",indentalign:a.INDENTALIGN.AUTO,indentshift:"0",indenttarget:"",indentalignfirst:a.INDENTALIGN.INDENTALIGN,indentshiftfirst:a.INDENTSHIFT.INDENTSHIFT,indentalignlast:a.INDENTALIGN.INDENTALIGN,indentshiftlast:a.INDENTSHIFT.INDENTSHIFT,texClass:a.TEXCLASS.REL},SPACE_ATTR:{lspace:1,rspace:2,form:4},useMMLspacing:7,autoDefault:function(h,o){var n=this.def;if(!n){if(h==="form"){this.useMMLspacing&=~this.SPACE_ATTR.form;return this.getForm()}var l=this.data.join("");var g=[this.Get("form"),a.FORM.INFIX,a.FORM.POSTFIX,a.FORM.PREFIX];for(var j=0,f=g.length;j<f;j++){var k=this.OPTABLE[g[j]][l];if(k){n=this.makeDef(k);break}}if(!n){n=this.CheckRange(l)}if(!n&&o){n={}}else{if(!n){n=MathJax.Hub.Insert({},this.defaultDef)}n.form=g[0];this.def=n}}this.useMMLspacing&=~(this.SPACE_ATTR[h]||0);if(n[h]!=null){return n[h]}else{if(!o){return this.defaultDef[h]}}return""},CheckRange:function(k){var l=k.charCodeAt(0);if(k.charAt(0)===a.PLANE1){l=k.charCodeAt(1)+119808-56320}for(var h=0,f=this.RANGES.length;h<f&&this.RANGES[h][0]<=l;h++){if(l<=this.RANGES[h][1]){if(this.RANGES[h][3]){var g=a.optableDir+"/"+this.RANGES[h][3]+".js";this.RANGES[h][3]=null;MathJax.Hub.RestartAfter(MathJax.Ajax.Require(g))}var j=(["ORD","OP","BIN","REL","OPEN","CLOSE","PUNCT","INNER"])[this.RANGES[h][2]];j=this.OPTABLE.infix[k]=a.mo.OPTYPES[j==="BIN"?"BIN3":j];return this.makeDef(j)}}return null},makeDef:function(g){if(g[2]==null){g[2]=this.defaultDef.texClass}if(!g[3]){g[3]={}}var f=MathJax.Hub.Insert({},g[3]);f.lspace=this.SPACE[g[0]];f.rspace=this.SPACE[g[1]];f.texClass=g[2];return f},getForm:function(){var f=this,h=this.parent,g=this.Parent();while(g&&g.isEmbellished()){f=h;h=g.parent;g=g.Parent()}if(h&&h.type==="mrow"&&h.NonSpaceLength()!==1){if(h.FirstNonSpace()===f){return a.FORM.PREFIX}if(h.LastNonSpace()===f){return a.FORM.POSTFIX}}return a.FORM.INFIX},isEmbellished:function(){return b},lineBreak:function(){var f=this.getValues("linebreak","linebreakstyle");if(f.linebreak===a.LINEBREAK.NEWLINE){if(f.linebreakstyle===a.LINEBREAKSTYLE.INFIXLINEBREAKSTYLE){f.linebreakstyle=this.Get("infixlinebreakstyle")}return f.linebreakstyle}return"none"},setTeXclass:function(f){this.getValues("lspace","rspace");if(this.useMMLspacing){this.texClass=a.TEXCLASS.NONE;return this}this.texClass=this.Get("texClass");if(f){this.prevClass=f.texClass||a.TEXCLASS.ORD;this.prevLevel=f.Get("scriptlevel")}else{this.prevClass=a.TEXCLASS.NONE}if(this.texClass===a.TEXCLASS.BIN&&(this.prevClass===a.TEXCLASS.NONE||this.prevClass===a.TEXCLASS.BIN||this.prevClass===a.TEXCLASS.OP||this.prevClass===a.TEXCLASS.REL||this.prevClass===a.TEXCLASS.OPEN||this.prevClass===a.TEXCLASS.PUNCT)){this.texClass=a.TEXCLASS.ORD}else{if(this.prevClass===a.TEXCLASS.BIN&&(this.texClass===a.TEXCLASS.REL||this.texClass===a.TEXCLASS.CLOSE||this.texClass===a.TEXCLASS.PUNCT)){f.texClass=this.prevClass=a.TEXCLASS.ORD}}return this}});a.mtext=a.mbase.Subclass({type:"mtext",isToken:b,isSpacelike:function(){return b},texClass:a.TEXCLASS.ORD,defaults:{mathvariant:a.INHERIT,mathsize:a.INHERIT,mathbackground:a.INHERIT,mathcolor:a.INHERIT}});a.mspace=a.mbase.Subclass({type:"mspace",isToken:b,isSpacelike:function(){return b},defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,width:"0em",height:"0ex",depth:"0ex",linebreak:a.LINEBREAK.AUTO},lineBreak:function(){return(this.Get("linebreak")===a.LINEBREAK.NEWLINE?a.LINEBREAKSTYLE.AFTER:"none")}});a.ms=a.mbase.Subclass({type:"ms",isToken:b,texClass:a.TEXCLASS.ORD,defaults:{mathvariant:a.INHERIT,mathsize:a.INHERIT,mathbackground:a.INHERIT,mathcolor:a.INHERIT,lquote:'"',rquote:'"'}});a.mglyph=a.mbase.Subclass({type:"mglyph",isToken:b,texClass:a.TEXCLASS.ORD,defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,alt:"",src:"",width:a.AUTO,height:a.AUTO,valign:"0em"}});a.mrow=a.mbase.Subclass({type:"mrow",isSpacelike:a.mbase.childrenSpacelike,inferred:d,isEmbellished:function(){var g=d;for(var h=0,f=this.data.length;h<f;h++){if(this.data[h]==null){continue}if(this.data[h].isEmbellished()){if(g){return d}g=b;this.core=h}else{if(!this.data[h].isSpacelike()){return d}}}return g},NonSpaceLength:function(){var h=0;for(var g=0,f=this.data.length;g<f;g++){if(this.data[g]&&!this.data[g].isSpacelike()){h++}}return h},FirstNonSpace:function(){for(var g=0,f=this.data.length;g<f;g++){if(this.data[g]&&!this.data[g].isSpacelike()){return this.data[g]}}return null},LastNonSpace:function(){for(var f=this.data.length-1;f>=0;f--){if(this.data[0]&&!this.data[f].isSpacelike()){return this.data[f]}}return null},Core:function(){if(!(this.isEmbellished())||typeof(this.core)==="undefined"){return this}return this.data[this.core]},CoreMO:function(){if(!(this.isEmbellished())||typeof(this.core)==="undefined"){return this}return this.data[this.core].CoreMO()},toString:function(){if(this.inferred){return"["+this.data.join(",")+"]"}return this.SUPER(arguments).toString.call(this)},setTeXclass:function(h){for(var g=0,f=this.data.length;g<f;g++){if(this.data[g]){h=this.data[g].setTeXclass(h)}}if(this.data[0]){this.updateTeXclass(this.data[0])}return h}});a.mfrac=a.mbase.Subclass({type:"mfrac",num:0,den:1,texClass:a.TEXCLASS.INNER,isEmbellished:a.mbase.childEmbellished,Core:a.mbase.childCore,CoreMO:a.mbase.childCoreMO,defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,linethickness:a.LINETHICKNESS.MEDIUM,numalign:a.ALIGN.CENTER,denomalign:a.ALIGN.CENTER,bevelled:d},adjustChild_displaystyle:function(f){return d},adjustChild_scriptlevel:function(g){var f=this.Get("scriptlevel");if(!this.Get("displaystyle")||f>0){f++}return f},adjustChild_texprimestyle:function(f){if(f==this.den){return true}return this.Get("texprimestyle")},setTeXclass:a.mbase.setSeparateTeXclasses});a.msqrt=a.mbase.Subclass({type:"msqrt",inferRow:b,texClass:a.TEXCLASS.ORD,setTeXclass:a.mbase.setSeparateTeXclasses,adjustChild_texprimestyle:function(f){return b}});a.mroot=a.mbase.Subclass({type:"mroot",texClass:a.TEXCLASS.ORD,adjustChild_displaystyle:function(f){if(f===1){return d}return this.Get("displaystyle")},adjustChild_scriptlevel:function(g){var f=this.Get("scriptlevel");if(g===1){f+=2}return f},adjustChild_texprimestyle:function(f){if(f===0){return b}return this.Get("texprimestyle")},setTeXclass:a.mbase.setSeparateTeXclasses});a.mstyle=a.mbase.Subclass({type:"mstyle",isSpacelike:a.mbase.childrenSpacelike,isEmbellished:a.mbase.childEmbellished,Core:a.mbase.childCore,CoreMO:a.mbase.childCoreMO,inferRow:b,defaults:{scriptlevel:a.INHERIT,displaystyle:a.INHERIT,scriptsizemultiplier:Math.sqrt(1/2),scriptminsize:"8pt",mathbackground:a.INHERIT,mathcolor:a.INHERIT,infixlinebreakstyle:a.LINEBREAKSTYLE.BEFORE,decimalseparator:"."},adjustChild_scriptlevel:function(h){var g=this.scriptlevel;if(g==null){g=this.Get("scriptlevel")}else{if(String(g).match(/^ *[-+]/)){delete this.scriptlevel;var f=this.Get("scriptlevel");this.scriptlevel=g;g=f+parseInt(g)}}return g},inheritFromMe:b,noInherit:{mpadded:{width:b,height:b,depth:b,lspace:b,voffset:b},mtable:{width:b,height:b,depth:b,align:b}},setTeXclass:a.mbase.setChildTeXclass});a.merror=a.mbase.Subclass({type:"merror",inferRow:b,texClass:a.TEXCLASS.ORD});a.mpadded=a.mbase.Subclass({type:"mpadded",inferRow:b,isSpacelike:a.mbase.childrenSpacelike,isEmbellished:a.mbase.childEmbellished,Core:a.mbase.childCore,CoreMO:a.mbase.childCoreMO,defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,width:"",height:"",depth:"",lspace:0,voffset:0},setTeXclass:a.mbase.setChildTeXclass});a.mphantom=a.mbase.Subclass({type:"mphantom",texClass:a.TEXCLASS.ORD,inferRow:b,isSpacelike:a.mbase.childrenSpacelike,isEmbellished:a.mbase.childEmbellished,Core:a.mbase.childCore,CoreMO:a.mbase.childCoreMO,setTeXclass:a.mbase.setChildTeXclass});a.mfenced=a.mbase.Subclass({type:"mfenced",defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,open:"(",close:")",separators:","},texClass:a.TEXCLASS.OPEN,setTeXclass:function(j){this.getPrevClass(j);var g=this.getValues("open","close","separators");g.open=g.open.replace(/[ \t\n\r]/g,"");g.close=g.close.replace(/[ \t\n\r]/g,"");g.separators=g.separators.replace(/[ \t\n\r]/g,"");if(g.open!==""){this.SetData("open",a.mo(g.open).With({stretchy:true,texClass:a.TEXCLASS.OPEN}));j=this.data.open.setTeXclass(j)}if(g.separators!==""){while(g.separators.length<this.data.length){g.separators+=g.separators.charAt(g.separators.length-1)}}if(this.data[0]){j=this.data[0].setTeXclass(j)}for(var h=1,f=this.data.length;h<f;h++){if(this.data[h]){if(g.separators!==""){this.SetData("sep"+h,a.mo(g.separators.charAt(h-1)));j=this.data["sep"+h].setTeXclass(j)}j=this.data[h].setTeXclass(j)}}if(g.close!==""){this.SetData("close",a.mo(g.close).With({stretchy:true,texClass:a.TEXCLASS.CLOSE}));j=this.data.close.setTeXclass(j)}this.updateTeXclass(this.data.open);return j}});a.menclose=a.mbase.Subclass({type:"menclose",inferRow:b,defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,notation:a.NOTATION.LONGDIV,texClass:a.TEXCLASS.ORD},setTeXclass:a.mbase.setSeparateTeXclasses});a.msubsup=a.mbase.Subclass({type:"msubsup",base:0,sub:1,sup:2,isEmbellished:a.mbase.childEmbellished,Core:a.mbase.childCore,CoreMO:a.mbase.childCoreMO,defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,subscriptshift:"",superscriptshift:"",texClass:a.AUTO},autoDefault:function(f){if(f==="texClass"){return(this.isEmbellished()?this.CoreMO().Get(f):a.TEXCLASS.ORD)}return 0},adjustChild_displaystyle:function(f){if(f>0){return d}return this.Get("displaystyle")},adjustChild_scriptlevel:function(g){var f=this.Get("scriptlevel");if(g>0){f++}return f},adjustChild_texprimestyle:function(f){if(f===this.sub){return b}return this.Get("texprimestyle")},setTeXclass:a.mbase.setBaseTeXclasses});a.msub=a.msubsup.Subclass({type:"msub"});a.msup=a.msubsup.Subclass({type:"msup",sub:2,sup:1});a.mmultiscripts=a.msubsup.Subclass({type:"mmultiscripts",adjustChild_texprimestyle:function(f){if(f%2===1){return b}return this.Get("texprimestyle")}});a.mprescripts=a.mbase.Subclass({type:"mprescripts"});a.none=a.mbase.Subclass({type:"none"});a.munderover=a.mbase.Subclass({type:"munderover",base:0,under:1,over:2,sub:1,sup:2,ACCENTS:["","accentunder","accent"],isEmbellished:a.mbase.childEmbellished,Core:a.mbase.childCore,CoreMO:a.mbase.childCoreMO,defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,accent:a.AUTO,accentunder:a.AUTO,align:a.ALIGN.CENTER,texClass:a.AUTO,subscriptshift:"",superscriptshift:""},autoDefault:function(f){if(f==="texClass"){return(this.isEmbellished()?this.CoreMO().Get(f):a.TEXCLASS.ORD)}if(f==="accent"&&this.data[this.over]){return this.data[this.over].CoreMO().Get("accent")}if(f==="accentunder"&&this.data[this.under]){return this.data[this.under].CoreMO().Get("accent")}return d},adjustChild_displaystyle:function(f){if(f>0){return d}return this.Get("displaystyle")},adjustChild_scriptlevel:function(g){var f=this.Get("scriptlevel");if(g==this.under&&!this.Get("accentunder")){f++}if(g==this.over&&!this.Get("accent")){f++}return f},adjustChild_texprimestyle:function(f){if(f===this.base&&this.data[this.over]){return b}return this.Get("texprimestyle")},setTeXclass:a.mbase.setBaseTeXclasses});a.munder=a.munderover.Subclass({type:"munder"});a.mover=a.munderover.Subclass({type:"mover",over:1,under:2,sup:1,sub:2,ACCENTS:["","accent","accentunder"]});a.mtable=a.mbase.Subclass({type:"mtable",defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,align:a.ALIGN.AXIS,rowalign:a.ALIGN.BASELINE,columnalign:a.ALIGN.CENTER,groupalign:"{left}",alignmentscope:b,columnwidth:a.WIDTH.AUTO,width:a.WIDTH.AUTO,rowspacing:"1ex",columnspacing:".8em",rowlines:a.LINES.NONE,columnlines:a.LINES.NONE,frame:a.LINES.NONE,framespacing:"0.4em 0.5ex",equalrows:d,equalcolumns:d,displaystyle:d,side:a.SIDE.RIGHT,minlabelspacing:"0.8em",texClass:a.TEXCLASS.ORD,useHeight:1},inheritFromMe:b,noInherit:{mtable:{align:b,rowalign:b,columnalign:b,groupalign:b,alignmentscope:b,columnwidth:b,width:b,rowspacing:b,columnspacing:b,rowlines:b,columnlines:b,frame:b,framespacing:b,equalrows:b,equalcolumns:b,side:b,minlabelspacing:b,texClass:b,useHeight:1}},Append:function(){for(var g=0,f=arguments.length;g<f;g++){if(!((arguments[g] instanceof a.mtr)||(arguments[g] instanceof a.mlabeledtr))){arguments[g]=a.mtd(arguments[g])}}this.SUPER(arguments).Append.apply(this,arguments)},setTeXclass:a.mbase.setSeparateTeXclasses});a.mtr=a.mbase.Subclass({type:"mtr",defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,rowalign:a.INHERIT,columnalign:a.INHERIT,groupalign:a.INHERIT},inheritFromMe:b,noInherit:{mrow:{rowalign:b,columnalign:b,groupalign:b},mtable:{rowalign:b,columnalign:b,groupalign:b}},Append:function(){for(var g=0,f=arguments.length;g<f;g++){if(!(arguments[g] instanceof a.mtd)){arguments[g]=a.mtd(arguments[g])}}this.SUPER(arguments).Append.apply(this,arguments)},setTeXclass:a.mbase.setSeparateTeXclasses});a.mtd=a.mbase.Subclass({type:"mtd",inferRow:b,isEmbellished:a.mbase.childEmbellished,Core:a.mbase.childCore,CoreMO:a.mbase.childCoreMO,defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,rowspan:1,columnspan:1,rowalign:a.INHERIT,columnalign:a.INHERIT,groupalign:a.INHERIT},setTeXclass:a.mbase.setSeparateTeXclasses});a.maligngroup=a.mbase.Subclass({type:"malign",isSpacelike:function(){return b},defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,groupalign:a.INHERIT},inheritFromMe:b,noInherit:{mrow:{groupalign:b},mtable:{groupalign:b}}});a.malignmark=a.mbase.Subclass({type:"malignmark",defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,edge:a.SIDE.LEFT},isSpacelike:function(){return b}});a.mlabeledtr=a.mtr.Subclass({type:"mlabeledtr"});a.maction=a.mbase.Subclass({type:"maction",defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,actiontype:a.ACTIONTYPE.TOGGLE,selection:1},selected:function(){return this.data[this.Get("selection")-1]||a.NULL},isEmbellished:function(){return this.selected().isEmbellished()},isSpacelike:function(){return this.selected().isSpacelike()},Core:function(){return this.selected().Core()},CoreMO:function(){return this.selected().CoreMO()},setTeXclass:function(f){return this.selected().setTeXclass(f)}});a.semantics=a.mbase.Subclass({type:"semantics",isEmbellished:a.mbase.childEmbellished,Core:a.mbase.childCore,CoreMO:a.mbase.childCoreMO,defaults:{definitionURL:null,encoding:null},setTeXclass:a.mbase.setChildTeXclass});a.annotation=a.mbase.Subclass({type:"annotation",isToken:b,defaults:{definitionURL:null,encoding:null,cd:"mathmlkeys",name:"",src:null}});a["annotation-xml"]=a.mbase.Subclass({type:"annotation-xml",defaults:{definitionURL:null,encoding:null,cd:"mathmlkeys",name:"",src:null}});a.math=a.mstyle.Subclass({type:"math",defaults:{mathvariant:a.VARIANT.NORMAL,mathsize:a.SIZE.NORMAL,mathcolor:"",mathbackground:a.COLOR.TRANSPARENT,scriptlevel:0,displaystyle:a.AUTO,display:"inline",maxwidth:"",overflow:a.OVERFLOW.LINEBREAK,altimg:"","altimg-width":"","altimg-height":"","altimg-valign":"",alttext:"",cdgroup:"",scriptsizemultiplier:Math.sqrt(1/2),scriptminsize:"8px",infixlinebreakstyle:a.LINEBREAKSTYLE.BEFORE,lineleading:"1ex",indentshift:"auto",indentalign:a.INDENTALIGN.AUTO,indentalignfirst:a.INDENTALIGN.INDENTALIGN,indentshiftfirst:a.INDENTSHIFT.INDENTSHIFT,decimalseparator:".",texprimestyle:d},autoDefault:function(f){if(f==="displaystyle"){return this.Get("display")==="block"}return""},setTeXclass:a.mbase.setChildTeXclass});a.chars=a.mbase.Subclass({type:"chars",Append:function(){this.data.push.apply(this.data,arguments)},value:function(){return this.data.join("")},toString:function(){return this.data.join("")}});a.entity=a.mbase.Subclass({type:"entity",Append:function(){this.data.push.apply(this.data,arguments)},value:function(){if(this.data[0].substr(0,2)==="#x"){return parseInt(this.data[0].substr(2),16)}else{if(this.data[0].substr(0,1)==="#"){return parseInt(this.data[0].substr(1))}else{return 0}}},toString:function(){var f=this.value();if(f<=65535){return String.fromCharCode(f)}return this.PLANE1+String.fromCharCode(f-119808+56320)}});a.xml=a.mbase.Subclass({type:"xml",Init:function(){this.div=document.createElement("div");return this.SUPER(arguments).Init.apply(this,arguments)},Append:function(){for(var g=0,f=arguments.length;g<f;g++){var h=this.Import(arguments[g]);this.data.push(h);this.div.appendChild(h)}},Import:function(k){if(document.importNode){return document.importNode(k,true)}var g,h,f;if(k.nodeType===1){g=document.createElement(k.nodeName);if(k.className){g.className=iNode.className}for(h=0,f=k.attributes.length;h<f;h++){var j=k.attributes[h];if(j.specified&&j.nodeValue!=null&&j.nodeValue!=""){g.setAttribute(j.nodeName,j.nodeValue)}if(j.nodeName==="style"){g.style.cssText=j.nodeValue}}if(k.className){g.className=k.className}}else{if(k.nodeType===3||k.nodeType===4){g=document.createTextNode(k.nodeValue)}else{if(k.nodeType===8){g=document.createComment(k.nodeValue)}else{return document.createTextNode("")}}}for(h=0,f=k.childNodes.length;h<f;h++){g.appendChild(this.Import(k.childNodes[h]))}return g},value:function(){return this.div},toString:function(){return this.div.innerHTML}});a.TeXAtom=a.mbase.Subclass({type:"texatom",inferRow:b,texClass:a.TEXCLASS.ORD,setTeXclass:function(f){this.getPrevClass(f);this.data[0].setTeXclass();return this}});a.NULL=a.mbase().With({type:"null"});var c=a.TEXCLASS;var e={ORD:[0,0,c.ORD],ORD11:[1,1,c.ORD],ORD21:[2,1,c.ORD],ORD02:[0,2,c.ORD],ORD55:[5,5,c.ORD],OP:[1,2,c.OP,{largeop:true,movablelimits:true,symmetric:true}],OPFIXED:[1,2,c.OP,{largeop:true,movablelimits:true}],INTEGRAL:[0,1,c.OP,{largeop:true,symmetric:true}],INTEGRAL2:[1,2,c.OP,{largeop:true,symmetric:true}],BIN3:[3,3,c.BIN],BIN4:[4,4,c.BIN],BIN01:[0,1,c.BIN],TALLBIN:[4,4,c.BIN,{stretchy:true}],BINOP:[4,4,c.BIN,{largeop:true,movablelimits:true}],REL:[5,5,c.REL],REL1:[1,1,c.REL,{stretchy:true}],REL4:[4,4,c.REL],WIDEREL:[5,5,c.REL,{stretchy:true}],RELACCENT:[5,5,c.REL,{accent:true,stretchy:true}],OPEN:[0,0,c.OPEN,{fence:true,stretchy:true,symmetric:true}],CLOSE:[0,0,c.CLOSE,{fence:true,stretchy:true,symmetric:true}],INNER:[0,0,c.INNER],PUNCT:[0,3,c.PUNCT],ACCENT:[0,0,c.ORD,{accent:true}],WIDEACCENT:[0,0,c.ORD,{accent:true,stretchy:true}]};a.mo.Augment({SPACE:["0em","0.1111em","0.1667em","0.2222em","0.2667em","0.3333em"],RANGES:[[32,127,c.REL,"BasicLatin"],[160,255,c.ORD,"Latin1Supplement"],[256,383,c.ORD],[384,591,c.ORD],[688,767,c.ORD,"SpacingModLetters"],[768,879,c.ORD,"CombDiacritMarks"],[880,1023,c.ORD,"GreekAndCoptic"],[7680,7935,c.ORD],[8192,8303,c.PUNCT,"GeneralPunctuation"],[8304,8351,c.ORD],[8352,8399,c.ORD],[8400,8447,c.ORD,"CombDiactForSymbols"],[8448,8527,c.ORD,"LetterlikeSymbols"],[8528,8591,c.ORD],[8592,8703,c.REL,"Arrows"],[8704,8959,c.BIN,"MathOperators"],[8960,9215,c.ORD,"MiscTechnical"],[9312,9471,c.ORD],[9632,9727,c.ORD,"GeometricShapes"],[9984,10175,c.ORD,"Dingbats"],[10176,10223,c.ORD,"MiscMathSymbolsA"],[10496,10623,c.REL,"SupplementalArrowsB"],[10624,10751,c.ORD,"MiscMathSymbolsB"],[10752,11007,c.BIN,"SuppMathOperators"],[11008,11263,c.ORD],[119808,120831,c.ORD]],OPTABLE:{prefix:{"\u2111":e.ORD11,"\u2113":e.ORD11,"\u211C":e.ORD11,"\u2200":e.ORD21,"\u2202":e.ORD21,"\u2203":e.ORD21,"\u2207":e.ORD21,"\u220F":e.OP,"\u2210":e.OP,"\u2211":e.OP,"\u2212":e.BIN01,"\u2213":e.BIN01,"\u221A":[1,1,c.ORD,{stretchy:true}],"\u2220":e.ORD,"\u222B":e.INTEGRAL,"\u222E":e.INTEGRAL,"\u22C0":e.OP,"\u22C1":e.OP,"\u22C2":e.OP,"\u22C3":e.OP,"\u2308":e.OPEN,"\u230A":e.OPEN,"\u27E8":e.OPEN,"\u2A00":e.OP,"\u2A01":e.OP,"\u2A02":e.OP,"\u2A04":e.OP,"\u2A06":e.OP,"\u00AC":e.ORD21,"\u00B1":e.BIN01,"(":e.OPEN,"+":e.BIN01,"-":e.BIN01,"[":e.OPEN,"{":e.OPEN,"|":e.OPEN},postfix:{"!":[1,0,c.CLOSE],"&":e.ORD,"\u2032":e.ORD02,"\u203E":e.WIDEACCENT,"\u2309":e.CLOSE,"\u230B":e.CLOSE,"\u23DE":e.WIDEACCENT,"\u23DF":e.WIDEACCENT,"\u266D":e.ORD02,"\u266E":e.ORD02,"\u266F":e.ORD02,"\u27E9":e.CLOSE,"\u02C6":e.WIDEACCENT,"\u02C7":e.WIDEACCENT,"\u02D8":e.ACCENT,"\u02D9":e.ACCENT,"\u02DC":e.WIDEACCENT,"\u0302":e.ACCENT,"\u00A8":e.ACCENT,"\u00AF":e.WIDEACCENT,")":e.CLOSE,"]":e.CLOSE,"^":e.WIDEACCENT,_:e.WIDEACCENT,"`":e.ACCENT,"|":e.CLOSE,"}":e.CLOSE,"~":e.WIDEACCENT},infix:{"%":[3,3,c.ORD],"\u2022":e.BIN4,"\u2026":e.INNER,"\u2044":e.TALLBIN,"\u2061":e.ORD,"\u2062":e.ORD,"\u2063":[0,0,c.ORD,{separator:true}],"\u2064":e.ORD,"\u2190":e.RELACCENT,"\u2191":e.WIDEREL,"\u2192":e.RELACCENT,"\u2193":e.WIDEREL,"\u2194":e.RELACCENT,"\u2195":e.WIDEREL,"\u2196":e.WIDEREL,"\u2197":e.WIDEREL,"\u2198":e.WIDEREL,"\u2199":e.WIDEREL,"\u21A6":e.WIDEREL,"\u21A9":e.WIDEREL,"\u21AA":e.WIDEREL,"\u21BC":e.RELACCENT,"\u21BD":e.WIDEREL,"\u21C0":e.RELACCENT,"\u21C1":e.WIDEREL,"\u21CC":e.WIDEREL,"\u21D0":e.WIDEREL,"\u21D1":e.WIDEREL,"\u21D2":e.WIDEREL,"\u21D3":e.WIDEREL,"\u21D4":e.WIDEREL,"\u21D5":e.WIDEREL,"\u2208":e.REL,"\u2209":e.REL,"\u220B":e.REL,"\u2212":e.BIN4,"\u2213":e.BIN4,"\u2215":e.TALLBIN,"\u2216":e.BIN4,"\u2217":e.BIN4,"\u2218":e.BIN4,"\u2219":e.BIN4,"\u221D":e.REL,"\u2223":e.REL,"\u2225":e.REL,"\u2227":e.BIN4,"\u2228":e.BIN4,"\u2229":e.BIN4,"\u222A":e.BIN4,"\u223C":e.REL,"\u2240":e.BIN4,"\u2243":e.REL,"\u2245":e.REL,"\u2248":e.REL,"\u224D":e.REL,"\u2250":e.REL,"\u2260":e.REL,"\u2261":e.REL,"\u2264":e.REL,"\u2265":e.REL,"\u226A":e.REL,"\u226B":e.REL,"\u227A":e.REL,"\u227B":e.REL,"\u2282":e.REL,"\u2283":e.REL,"\u2286":e.REL,"\u2287":e.REL,"\u228E":e.BIN4,"\u2291":e.REL,"\u2292":e.REL,"\u2293":e.BIN4,"\u2294":e.BIN4,"\u2295":e.BIN4,"\u2296":e.BIN4,"\u2297":e.BIN4,"\u2298":e.BIN4,"\u2299":e.BIN4,"\u22A2":e.REL,"\u22A3":e.REL,"\u22A4":e.ORD55,"\u22A5":e.REL,"\u22A8":e.REL,"\u22C4":e.BIN4,"\u22C5":e.BIN4,"\u22C6":e.BIN4,"\u22C8":e.REL,"\u22EE":e.ORD55,"\u22EF":e.INNER,"\u22F1":[5,5,c.INNER],"\u2500":[0,0,c.ORD,{stretchy:true}],"\u25B3":e.BIN4,"\u25B5":e.BIN4,"\u25B9":e.BIN4,"\u25BD":e.BIN4,"\u25BF":e.BIN4,"\u25C3":e.BIN4,"\u2758":[4,4,c.REL,{fence:true,stretchy:true,symmetric:true}],"\u27F5":e.REL1,"\u27F6":e.REL1,"\u27F7":e.REL1,"\u27F8":e.REL1,"\u27F9":e.REL1,"\u27FA":e.REL1,"\u2A2F":e.BIN4,"\u2A3F":e.BIN4,"\u2AAF":e.REL,"\u2AB0":e.REL,"\u00B1":e.BIN4,"\u00B7":e.BIN4,"\u00D7":e.BIN4,"\u00F7":e.BIN4,"*":e.BIN3,"+":e.BIN4,",":[0,3,c.PUNCT,{separator:true}],"-":e.BIN4,".":[3,3,c.ORD],"/":e.ORD11,":":[1,2,c.REL],";":[0,3,c.PUNCT,{separator:true}],"<":e.REL,"=":e.REL,">":e.REL,"?":[1,1,c.CLOSE],"\\":e.ORD,_:e.ORD11,"|":[2,2,c.ORD,{fence:true,stretchy:true,symmetric:true}],"#":e.ORD,"$":e.ORD,"\u002E":[0,3,c.PUNCT,{separator:true}],"\u02B9":e.ORD,"\u02C9":e.ACCENT,"\u02CA":e.ACCENT,"\u02CB":e.ACCENT,"\u0300":e.ACCENT,"\u0301":e.ACCENT,"\u0303":e.WIDEACCENT,"\u0304":e.ACCENT,"\u0306":e.ACCENT,"\u0307":e.ACCENT,"\u0308":e.ACCENT,"\u030C":e.ACCENT,"\u0332":e.WIDEACCENT,"\u0338":e.REL4,"\u2015":[0,0,c.ORD,{stretchy:true}],"\u2017":[0,0,c.ORD,{stretchy:true}],"\u2020":e.BIN3,"\u2021":e.BIN3,"\u20D7":e.ACCENT,"\u2118":e.ORD,"\u2205":e.ORD,"\u221E":e.ORD,"\u2305":e.BIN3,"\u2306":e.BIN3,"\u2322":e.REL4,"\u2323":e.REL4,"\u2329":e.OPEN,"\u232A":e.CLOSE,"\u23AA":e.ORD,"\u23AF":[0,0,c.ORD,{stretchy:true}],"\u23B0":e.OPEN,"\u23B1":e.CLOSE,"\u25EF":e.BIN3,"\u2660":e.ORD,"\u2661":e.ORD,"\u2662":e.ORD,"\u2663":e.ORD,"\u27EE":e.OPEN,"\u27EF":e.CLOSE,"\u27FC":e.REL4,"\u3008":e.OPEN,"\u3009":e.CLOSE,"\uFE37":e.WIDEACCENT,"\uFE38":e.WIDEACCENT}}},{OPTYPES:e})})(MathJax.ElementJax.mml);MathJax.ElementJax.mml.loadComplete("jax.js");
+
+MathJax.Hub.Register.LoadHook("[MathJax]/jax/element/mml/jax.js",function(){var b="1.1.1";var a=MathJax.ElementJax.mml;a.mbase.Augment({toMathML:function(k){var g=(this.inferred&&this.parent.inferRow);if(k==null){k=""}var e=this.type,d=this.MathMLattributes();if(e==="mspace"){return k+"<"+e+d+" />"}var j=[];var h=(this.isToken?"":k+(g?"":" "));for(var f=0,c=this.data.length;f<c;f++){if(this.data[f]){j.push(this.data[f].toMathML(h))}else{if(!this.isToken){j.push(h+"<mrow />")}}}if(this.isToken){return k+"<"+e+d+">"+j.join("")+"</"+e+">"}if(g){return j.join("\n")}if(j.length===0||(j.length===1&&j[0]==="")){return k+"<"+e+d+" />"}return k+"<"+e+d+">\n"+j.join("\n")+"\n"+k+"</"+e+">"},MathMLattributes:function(){var j=[],g=this.defaults;var c=this.copyAttributes,l=this.skipAttributes;if(this.type==="math"){j.push('xmlns="http://www.w3.org/1998/Math/MathML"')}if(this.type==="mstyle"){g=a.math.prototype.defaults}for(var d in g){if(!l[d]&&g.hasOwnProperty(d)){var e=(d==="open"||d==="close");if(this[d]!=null&&(e||this[d]!==g[d])){var k=this[d];delete this[d];if(e||this.Get(d)!==k){j.push(d+'="'+this.quoteHTML(k)+'"')}this[d]=k}}}for(var h=0,f=c.length;h<f;h++){if(this[c[h]]!=null){j.push(c[h]+'="'+this.quoteHTML(this[c[h]])+'"')}}if(j.length){return" "+j.join(" ")}else{return""}},copyAttributes:["fontfamily","fontsize","fontweight","fontstyle","color","background","id","class","href","style"],skipAttributes:{texClass:1,useHeight:1,texprimestyle:1},quoteHTML:function(e){e=String(e).split("");for(var f=0,d=e.length;f<d;f++){var h=e[f].charCodeAt(0);if(h<32||h>126){e[f]="&#x"+h.toString(16).toUpperCase()+";"}else{var g={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"}[e[f]];if(g){e[f]=g}}}return e.join("")}});a.msubsup.Augment({toMathML:function(h){var e=this.type;if(this.data[this.sup]==null){e="msub"}if(this.data[this.sub]==null){e="msup"}var d=this.MathMLattributes();delete this.data[0].inferred;var g=[];for(var f=0,c=this.data.length;f<c;f++){if(this.data[f]){g.push(this.data[f].toMathML(h+" "))}}return h+"<"+e+d+">\n"+g.join("\n")+"\n"+h+"</"+e+">"}});a.munderover.Augment({toMathML:function(h){var e=this.type;if(this.data[this.under]==null){e="mover"}if(this.data[this.over]==null){e="munder"}var d=this.MathMLattributes();delete this.data[0].inferred;var g=[];for(var f=0,c=this.data.length;f<c;f++){if(this.data[f]){g.push(this.data[f].toMathML(h+" "))}}return h+"<"+e+d+">\n"+g.join("\n")+"\n"+h+"</"+e+">"}});a.TeXAtom.Augment({toMathML:function(c){return c+"<mrow>\n"+this.data[0].toMathML(c+" ")+"\n"+c+"</mrow>"}});a.chars.Augment({toMathML:function(c){return(c||"")+this.quoteHTML(this.toString())}});a.entity.Augment({toMathML:function(c){return(c||"")+"&"+this.data[0]+";<!-- "+this.toString()+" -->"}});a.xml.Augment({toMathML:function(c){return(c||"")+this.toString()}});MathJax.Hub.Register.StartupHook("TeX mathchoice Ready",function(){a.TeXmathchoice.Augment({toMathML:function(c){return this.Core().toMathML(c)}})});MathJax.Hub.Startup.signal.Post("toMathML Ready")});MathJax.Ajax.loadComplete("[MathJax]/extensions/toMathML.js");
+
+(function(){var c="1.1";var a=MathJax.Hub.CombineConfig("TeX.noErrors",{multiLine:true,inlineDelimiters:["",""],style:{"font-family":"serif","font-size":"80%","text-align":"left",color:"black",padding:"1px 3px",border:"1px solid"}});var b="\u00A0";MathJax.Extension["TeX/noErrors"]={version:c,config:a};MathJax.Hub.Register.StartupHook("TeX Jax Ready",function(){MathJax.InputJax.TeX.Augment({formatError:function(f,e,g,d){var i=a.inlineDelimiters;var h=(g||a.multiLine);if(!g){e=i[0]+e+i[1]}if(h){e=e.replace(/ /g,b)}else{e=e.replace(/\n/g," ")}return MathJax.ElementJax.mml.merror(e).With({isError:true,multiLine:h})}})});MathJax.Hub.Register.StartupHook("HTML-CSS Jax Config",function(){MathJax.Hub.Config({"HTML-CSS":{styles:{".MathJax .merror":MathJax.Hub.Insert({"font-style":null,"background-color":null,"vertical-align":(MathJax.Hub.Browser.isMSIE&&a.multiLine?"-2px":"")},a.style)}}})})})();MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function(){var a=MathJax.ElementJax.mml;var b=MathJax.OutputJax["HTML-CSS"];var c=a.math.prototype.toHTML;a.math.Augment({toHTML:function(d,e){if(this.data[0]&&this.data[0].data[0]&&this.data[0].data[0].isError){return this.data[0].data[0].toHTML(d)}return c.call(this,d,e)}});a.merror.Augment({toHTML:function(j){if(!this.isError){return a.mbase.prototype.toHTML.call(this,j)}j=this.HTMLcreateSpan(j);if(this.multiLine){j.style.display="inline-block"}var l=this.data[0].data[0].data.join("").split(/\n/);for(var g=0,e=l.length;g<e;g++){b.addText(j,l[g]);if(g!==e-1){b.addElement(j,"br")}}var n=b.getHD(j.parentNode),d=b.getW(j.parentNode);if(e>1){var k=(n.h+n.d)/2,h=b.TeX.x_height/2;var f=b.config.styles[".MathJax .merror"]["font-size"];if(f&&f.match(/%/)){h*=parseInt(f)/100}j.parentNode.style.verticalAlign=b.Em(n.d+(h-k));n.h=h+k;n.d=k-h}j.bbox={h:n.h,d:n.d,w:d,lw:0,rw:d};return j}});MathJax.Hub.Startup.signal.Post("TeX noErrors Ready")});MathJax.Hub.Register.StartupHook("NativeMML Jax Ready",function(){var b=MathJax.ElementJax.mml;var a=MathJax.Extension["TeX/noErrors"].config;var c=b.math.prototype.toNativeMML;b.math.Augment({toNativeMML:function(d){if(this.data[0]&&this.data[0].data[0]&&this.data[0].data[0].isError){return this.data[0].data[0].toNativeMML(d)}return c.call(this,d)}});b.merror.Augment({toNativeMML:function(g){if(!this.isError){return b.mbase.prototype.toNativeMML.call(this,g)}g=g.appendChild(document.createElement("span"));var h=this.data[0].data[0].data.join("").split(/\n/);for(var f=0,e=h.length;f<e;f++){g.appendChild(document.createTextNode(h[f]));if(f!==e-1){g.appendChild(document.createElement("br"))}}if(this.multiLine){g.style.display="inline-block";if(e>1){g.style.verticalAlign="middle"}}for(var j in a.style){if(a.style.hasOwnProperty(j)){var d=j.replace(/-./g,function(i){return i.charAt(1).toUpperCase()});g.style[d]=a.style[j]}}return g}});MathJax.Hub.Startup.signal.Post("TeX noErrors Ready")});MathJax.Ajax.loadComplete("[MathJax]/extensions/TeX/noErrors.js");
+
+MathJax.Extension["TeX/noUndefined"]={version:"1.1",config:MathJax.Hub.CombineConfig("TeX.noUndefined",{attributes:{mathcolor:"red"}})};MathJax.Hub.Register.StartupHook("TeX Jax Ready",function(){var b=MathJax.Extension["TeX/noUndefined"].config;var a=MathJax.ElementJax.mml;MathJax.InputJax.TeX.Parse.Augment({csUndefined:function(c){this.Push(a.mtext(c).With(b.attributes))}});MathJax.Hub.Startup.signal.Post("TeX noUndefined Ready")});MathJax.Ajax.loadComplete("[MathJax]/extensions/TeX/noUndefined.js");
+
+(function(d){var c=true,f=false,i,h=String.fromCharCode(160);var e=MathJax.Object.Subclass({Init:function(k){this.global={};this.data=[b.start().With({global:this.global})];if(k){this.data[0].env=k}this.env=this.data[0].env},Push:function(){var l,k,n,o;for(l=0,k=arguments.length;l<k;l++){n=arguments[l];if(n instanceof i.mbase){n=b.mml(n)}n.global=this.global;o=(this.data.length?this.Top().checkItem(n):c);if(o instanceof Array){this.Pop();this.Push.apply(this,o)}else{if(o instanceof b){this.Pop();this.Push(o)}else{if(o){this.data.push(n);if(n.env){for(var p in this.env){if(this.env.hasOwnProperty(p)){n.env[p]=this.env[p]}}this.env=n.env}else{n.env=this.env}}}}}},Pop:function(){var k=this.data.pop();if(!k.isOpen){delete k.env}this.env=(this.data.length?this.Top().env:{});return k},Top:function(k){if(k==null){k=1}if(this.data.length<k){return null}return this.data[this.data.length-k]},Prev:function(k){var l=this.Top();if(k){return l.data[l.data.length-1]}else{return l.Pop()}},toString:function(){return"stack[\n "+this.data.join("\n ")+"\n]"}});var b=e.Item=MathJax.Object.Subclass({type:"base",closeError:"Extra close brace or missing open brace",rightError:"Missing \\left or extra \\right",Init:function(){if(this.isOpen){this.env={}}this.data=[];this.Push.apply(this,arguments)},Push:function(){this.data.push.apply(this.data,arguments)},Pop:function(){return this.data.pop()},mmlData:function(k,l){if(k==null){k=c}if(this.data.length===1&&!l){return this.data[0]}return i.mrow.apply(i,this.data).With((k?{inferred:c}:{}))},checkItem:function(k){if(k.type==="over"&&this.isOpen){k.num=this.mmlData(f);this.data=[]}if(k.type==="cell"&&this.isOpen){d.Error("Misplaced "+k.name)}if(k.isClose&&this[k.type+"Error"]){d.Error(this[k.type+"Error"])}if(!k.isNotStack){return c}this.Push(k.data[0]);return f},With:function(k){for(var l in k){if(k.hasOwnProperty(l)){this[l]=k[l]}}return this},toString:function(){return this.type+"["+this.data.join("; ")+"]"}});b.start=b.Subclass({type:"start",isOpen:c,checkItem:function(k){if(k.type==="stop"){return b.mml(this.mmlData())}return this.SUPER(arguments).checkItem.call(this,k)}});b.stop=b.Subclass({type:"stop",isClose:c});b.open=b.Subclass({type:"open",isOpen:c,stopError:"Extra open brace or missing close brace",checkItem:function(l){if(l.type==="close"){var k=this.mmlData();return b.mml(i.TeXAtom(k))}return this.SUPER(arguments).checkItem.call(this,l)}});b.close=b.Subclass({type:"close",isClose:c});b.subsup=b.Subclass({type:"subsup",stopError:"Missing superscript or subscript argument",checkItem:function(l){var k=["","subscript","superscript"][this.position];if(l.type==="open"||l.type==="left"){return c}if(l.type==="mml"){this.data[0].SetData(this.position,l.data[0]);return b.mml(this.data[0])}if(this.SUPER(arguments).checkItem.call(this,l)){d.Error("Missing open brace for "+k)}},Pop:function(){}});b.over=b.Subclass({type:"over",isClose:c,name:"\\over",checkItem:function(m,k){if(m.type==="over"){d.Error("Ambiguous use of "+m.name)}if(m.isClose){var l=i.mfrac(this.num,this.mmlData(f));if(this.thickness!=null){l.linethickness=this.thickness}if(this.open||this.close){l.texClass=i.TEXCLASS.INNER;l.texWithDelims=c;l=i.mfenced(l).With({open:this.open,close:this.close})}return[b.mml(l),m]}return this.SUPER(arguments).checkItem.call(this,m)},toString:function(){return"over["+this.num+" / "+this.data.join("; ")+"]"}});b.left=b.Subclass({type:"left",isOpen:c,delim:"(",stopError:"Extra \\left or missing \\right",checkItem:function(l){if(l.type==="right"){var k=i.mfenced(this.data.length===1?this.data[0]:i.mrow.apply(i,this.data));return b.mml(k.With({open:this.delim,close:l.delim}))}return this.SUPER(arguments).checkItem.call(this,l)}});b.right=b.Subclass({type:"right",isClose:c,delim:")"});b.begin=b.Subclass({type:"begin",isOpen:c,checkItem:function(k){if(k.type==="end"){if(k.name!==this.name){d.Error("\\begin{"+this.name+"} ended with \\end{"+k.name+"}")}if(!this.end){return b.mml(this.mmlData())}return this.parse[this.end].call(this.parse,this,this.data)}if(k.type==="stop"){d.Error("Missing \\end{"+this.name+"}")}return this.SUPER(arguments).checkItem.call(this,k)}});b.end=b.Subclass({type:"end",isClose:c});b.style=b.Subclass({type:"style",checkItem:function(l){if(!l.isClose){return this.SUPER(arguments).checkItem.call(this,l)}var k=i.mstyle.apply(i,this.data).With(this.styles);return[b.mml(k),l]}});b.position=b.Subclass({type:"position",checkItem:function(l){if(l.isClose){d.Error("Missing box for "+this.name)}if(l.isNotStack){var k=l.mmlData();switch(this.move){case"vertical":k=i.mpadded(k).With({height:this.dh,depth:this.dd,voffset:this.dh});return[b.mml(k)];case"horizontal":return[b.mml(this.left),l,b.mml(this.right)]}}return this.SUPER(arguments).checkItem.call(this,l)}});b.array=b.Subclass({type:"array",isOpen:c,arraydef:{},Init:function(){this.table=[];this.row=[];this.env={};this.SUPER(arguments).Init.apply(this,arguments)},checkItem:function(l){if(l.isClose&&l.type!=="over"){if(l.isEntry){this.EndEntry();this.clearEnv();return f}if(l.isCR){this.EndEntry();this.EndRow();this.clearEnv();return f}this.EndTable();this.clearEnv();var k=i.mtable.apply(i,this.table).With(this.arraydef);if(this.open||this.close){k=i.mfenced(k).With({open:this.open,close:this.close})}k=b.mml(k);if(this.requireClose){if(l.type==="close"){return k}d.Error("Missing close brace")}return[k,l]}return this.SUPER(arguments).checkItem.call(this,l)},EndEntry:function(){this.row.push(i.mtd.apply(i,this.data));this.data=[]},EndRow:function(){this.table.push(i.mtr.apply(i,this.row));this.row=[]},EndTable:function(){if(this.data.length||this.row.length){this.EndEntry();this.EndRow()}this.checkLines()},checkLines:function(){if(this.arraydef.rowlines){var k=this.arraydef.rowlines.split(/ /);if(k.length===this.table.length){this.arraydef.frame=k.pop();this.arraydef.rowlines=k.join(" ")}else{if(k.length<this.table.length-1){this.arraydef.rowlines+=" none"}}}},clearEnv:function(){for(var k in this.env){if(this.env.hasOwnProperty(k)){delete this.env[k]}}}});b.cell=b.Subclass({type:"cell",isClose:c});b.mml=b.Subclass({type:"mml",isNotStack:c,Push:function(){for(var l=0,k=arguments.length;l<k;l++){if(arguments[l].type!=="mo"&&arguments[l].isEmbellished()){arguments[l]=i.TeXAtom(arguments[l]).With({isEmbellishedWrapper:c})}}this.data.push.apply(this.data,arguments)},Add:function(){this.data.push.apply(this.data,arguments);return this}});var g={};var j=function(){i=MathJax.ElementJax.mml;MathJax.Hub.Insert(g,{letter:/[a-z]/i,digit:/[0-9.]/,number:/^(?:[0-9]+(?:\{,\}[0-9]{3})*(?:\.[0-9]*)*|\.[0-9]+)/,special:{"\\":"ControlSequence","{":"Open","}":"Close","~":"Tilde","^":"Superscript",_:"Subscript"," ":"Space","\t":"Space","\r":"Space","\n":"Space","'":"Prime","%":"Comment","&":"Entry","#":"Hash","\u2019":"Prime"},remap:{"-":"2212","*":"2217"},mathchar0mi:{alpha:"03B1",beta:"03B2",gamma:"03B3",delta:"03B4",epsilon:"03F5",zeta:"03B6",eta:"03B7",theta:"03B8",iota:"03B9",kappa:"03BA",lambda:"03BB",mu:"03BC",nu:"03BD",xi:"03BE",omicron:"03BF",pi:"03C0",rho:"03C1",sigma:"03C3",tau:"03C4",upsilon:"03C5",phi:"03D5",chi:"03C7",psi:"03C8",omega:"03C9",varepsilon:"03B5",vartheta:"03D1",varpi:"03D6",varrho:"03F1",varsigma:"03C2",varphi:"03C6",S:"00A7",aleph:["2135",{mathvariant:i.VARIANT.NORMAL}],hbar:"210F",imath:"0131",jmath:"0237",ell:"2113",wp:["2118",{mathvariant:i.VARIANT.NORMAL}],Re:["211C",{mathvariant:i.VARIANT.NORMAL}],Im:["2111",{mathvariant:i.VARIANT.NORMAL}],partial:["2202",{mathvariant:i.VARIANT.NORMAL}],infty:["221E",{mathvariant:i.VARIANT.NORMAL}],prime:["2032",{mathvariant:i.VARIANT.NORMAL}],emptyset:["2205",{mathvariant:i.VARIANT.NORMAL}],nabla:["2207",{mathvariant:i.VARIANT.NORMAL}],top:["22A4",{mathvariant:i.VARIANT.NORMAL}],bot:["22A5",{mathvariant:i.VARIANT.NORMAL}],angle:["2220",{mathvariant:i.VARIANT.NORMAL}],triangle:["25B3",{mathvariant:i.VARIANT.NORMAL}],backslash:["2216",{mathvariant:i.VARIANT.NORMAL}],forall:["2200",{mathvariant:i.VARIANT.NORMAL}],exists:["2203",{mathvariant:i.VARIANT.NORMAL}],neg:["00AC",{mathvariant:i.VARIANT.NORMAL}],lnot:["00AC",{mathvariant:i.VARIANT.NORMAL}],flat:["266D",{mathvariant:i.VARIANT.NORMAL}],natural:["266E",{mathvariant:i.VARIANT.NORMAL}],sharp:["266F",{mathvariant:i.VARIANT.NORMAL}],clubsuit:["2663",{mathvariant:i.VARIANT.NORMAL}],diamondsuit:["2662",{mathvariant:i.VARIANT.NORMAL}],heartsuit:["2661",{mathvariant:i.VARIANT.NORMAL}],spadesuit:["2660",{mathvariant:i.VARIANT.NORMAL}]},mathchar0mo:{surd:"221A",coprod:["2210",{texClass:i.TEXCLASS.OP,movesupsub:c}],bigvee:["22C1",{texClass:i.TEXCLASS.OP,movesupsub:c}],bigwedge:["22C0",{texClass:i.TEXCLASS.OP,movesupsub:c}],biguplus:["2A04",{texClass:i.TEXCLASS.OP,movesupsub:c}],bigcap:["22C2",{texClass:i.TEXCLASS.OP,movesupsub:c}],bigcup:["22C3",{texClass:i.TEXCLASS.OP,movesupsub:c}],"int":["222B",{texClass:i.TEXCLASS.OP}],intop:["222B",{texClass:i.TEXCLASS.OP,movesupsub:c,movablelimits:c}],iint:["222C",{texClass:i.TEXCLASS.OP}],iiint:["222D",{texClass:i.TEXCLASS.OP}],prod:["220F",{texClass:i.TEXCLASS.OP,movesupsub:c}],sum:["2211",{texClass:i.TEXCLASS.OP,movesupsub:c}],bigotimes:["2A02",{texClass:i.TEXCLASS.OP,movesupsub:c}],bigoplus:["2A01",{texClass:i.TEXCLASS.OP,movesupsub:c}],bigodot:["2A00",{texClass:i.TEXCLASS.OP,movesupsub:c}],oint:["222E",{texClass:i.TEXCLASS.OP}],bigsqcup:["2A06",{texClass:i.TEXCLASS.OP,movesupsub:c}],smallint:["222B",{largeop:f}],triangleleft:"25C3",triangleright:"25B9",bigtriangleup:"25B3",bigtriangledown:"25BD",wedge:"2227",land:"2227",vee:"2228",lor:"2228",cap:"2229",cup:"222A",ddagger:"2021",dagger:"2020",sqcap:"2293",sqcup:"2294",uplus:"228E",amalg:"2A3F",diamond:"22C4",bullet:"2219",wr:"2240",div:"00F7",odot:["2299",{largeop:f}],oslash:["2298",{largeop:f}],otimes:["2297",{largeop:f}],ominus:["2296",{largeop:f}],oplus:["2295",{largeop:f}],mp:"2213",pm:"00B1",circ:"2218",bigcirc:"25EF",setminus:"2216",cdot:"22C5",ast:"2217",times:"00D7",star:"22C6",propto:"221D",sqsubseteq:"2291",sqsupseteq:"2292",parallel:"2225",mid:"2223",dashv:"22A3",vdash:"22A2",leq:"2264",le:"2264",geq:"2265",ge:"2265",lt:"003C",gt:"003E",succ:"227B",prec:"227A",approx:"2248",succeq:"2AB0",preceq:"2AAF",supset:"2283",subset:"2282",supseteq:"2287",subseteq:"2286","in":"2208",ni:"220B",notin:"2209",owns:"220B",gg:"226B",ll:"226A",sim:"223C",simeq:"2243",perp:"22A5",equiv:"2261",asymp:"224D",smile:"2323",frown:"2322",ne:"2260",neq:"2260",cong:"2245",doteq:"2250",bowtie:"22C8",models:"22A8",notChar:"0338",Leftrightarrow:"21D4",Leftarrow:"21D0",Rightarrow:"21D2",leftrightarrow:"2194",leftarrow:"2190",gets:"2190",rightarrow:"2192",to:"2192",mapsto:"21A6",leftharpoonup:"21BC",leftharpoondown:"21BD",rightharpoonup:"21C0",rightharpoondown:"21C1",nearrow:"2197",searrow:"2198",nwarrow:"2196",swarrow:"2199",rightleftharpoons:"21CC",hookrightarrow:"21AA",hookleftarrow:"21A9",longleftarrow:"27F5",Longleftarrow:"27F8",longrightarrow:"27F6",Longrightarrow:"27F9",Longleftrightarrow:"27FA",longleftrightarrow:"27F7",longmapsto:"27FC",ldots:"2026",cdots:"22EF",vdots:"22EE",ddots:"22F1",dots:"2026",dotsc:"2026",dotsb:"22EF",dotsm:"22EF",dotsi:"22EF",dotso:"2026",ldotp:["002E",{texClass:i.TEXCLASS.PUNCT}],cdotp:["22C5",{texClass:i.TEXCLASS.PUNCT}],colon:["003A",{texClass:i.TEXCLASS.PUNCT}]},mathchar7:{Gamma:"0393",Delta:"0394",Theta:"0398",Lambda:"039B",Xi:"039E",Pi:"03A0",Sigma:"03A3",Upsilon:"03A5",Phi:"03A6",Psi:"03A8",Omega:"03A9",_:"005F","#":"0023","$":"0024","%":"0025","&":"0026",And:"0026"},delimiter:{"(":"(",")":")","[":"[","]":"]","<":"27E8",">":"27E9","\\lt":"27E8","\\gt":"27E9","/":"/","|":["|",{texClass:i.TEXCLASS.ORD}],".":"","\\\\":"\\","\\lmoustache":"23B0","\\rmoustache":"23B1","\\lgroup":"27EE","\\rgroup":"27EF","\\arrowvert":"23D0","\\Arrowvert":"2016","\\bracevert":"23AA","\\Vert":["2225",{texClass:i.TEXCLASS.ORD}],"\\|":["2225",{texClass:i.TEXCLASS.ORD}],"\\vert":["|",{texClass:i.TEXCLASS.ORD}],"\\uparrow":"2191","\\downarrow":"2193","\\updownarrow":"2195","\\Uparrow":"21D1","\\Downarrow":"21D3","\\Updownarrow":"21D5","\\backslash":"\\","\\rangle":"27E9","\\langle":"27E8","\\rbrace":"}","\\lbrace":"{","\\}":"}","\\{":"{","\\rceil":"2309","\\lceil":"2308","\\rfloor":"230B","\\lfloor":"230A","\\lbrack":"[","\\rbrack":"]"},macros:{displaystyle:["SetStyle","D",c,0],textstyle:["SetStyle","T",f,0],scriptstyle:["SetStyle","S",f,1],scriptscriptstyle:["SetStyle","SS",f,2],rm:["SetFont",i.VARIANT.NORMAL],mit:["SetFont",i.VARIANT.ITALIC],oldstyle:["SetFont",i.VARIANT.OLDSTYLE],cal:["SetFont",i.VARIANT.CALIGRAPHIC],it:["SetFont",i.VARIANT.ITALIC],bf:["SetFont",i.VARIANT.BOLD],bbFont:["SetFont",i.VARIANT.DOUBLESTRUCK],scr:["SetFont",i.VARIANT.SCRIPT],frak:["SetFont",i.VARIANT.FRAKTUR],sf:["SetFont",i.VARIANT.SANSSERIF],tt:["SetFont",i.VARIANT.MONOSPACE],tiny:["SetSize",0.5],Tiny:["SetSize",0.6],scriptsize:["SetSize",0.7],small:["SetSize",0.85],normalsize:["SetSize",1],large:["SetSize",1.2],Large:["SetSize",1.44],LARGE:["SetSize",1.73],huge:["SetSize",2.07],Huge:["SetSize",2.49],arcsin:["NamedOp",0],arccos:["NamedOp",0],arctan:["NamedOp",0],arg:["NamedOp",0],cos:["NamedOp",0],cosh:["NamedOp",0],cot:["NamedOp",0],coth:["NamedOp",0],csc:["NamedOp",0],deg:["NamedOp",0],det:"NamedOp",dim:["NamedOp",0],exp:["NamedOp",0],gcd:"NamedOp",hom:["NamedOp",0],inf:"NamedOp",ker:["NamedOp",0],lg:["NamedOp",0],lim:"NamedOp",liminf:["NamedOp",null,"lim&thinsp;inf"],limsup:["NamedOp",null,"lim&thinsp;sup"],ln:["NamedOp",0],log:["NamedOp",0],max:"NamedOp",min:"NamedOp",Pr:"NamedOp",sec:["NamedOp",0],sin:["NamedOp",0],sinh:["NamedOp",0],sup:"NamedOp",tan:["NamedOp",0],tanh:["NamedOp",0],limits:["Limits",1],nolimits:["Limits",0],overline:["UnderOver","203E"],underline:["UnderOver","005F"],overbrace:["UnderOver","23DE",1],underbrace:["UnderOver","23DF",1],overrightarrow:["UnderOver","2192"],underrightarrow:["UnderOver","2192"],overleftarrow:["UnderOver","2190"],underleftarrow:["UnderOver","2190"],overleftrightarrow:["UnderOver","2194"],underleftrightarrow:["UnderOver","2194"],overset:"Overset",underset:"Underset",stackrel:["Macro","\\mathrel{\\mathop{#2}\\limits^{#1}}",2],over:"Over",overwithdelims:"Over",atop:"Over",atopwithdelims:"Over",above:"Over",abovewithdelims:"Over",brace:["Over","{","}"],brack:["Over","[","]"],choose:["Over","(",")"],frac:"Frac",sqrt:"Sqrt",root:"Root",uproot:["MoveRoot","upRoot"],leftroot:["MoveRoot","leftRoot"],left:"LeftRight",right:"LeftRight",llap:"Lap",rlap:"Lap",raise:"RaiseLower",lower:"RaiseLower",moveleft:"MoveLeftRight",moveright:"MoveLeftRight",",":["Spacer",i.LENGTH.THINMATHSPACE],":":["Spacer",i.LENGTH.THINMATHSPACE],">":["Spacer",i.LENGTH.MEDIUMMATHSPACE],";":["Spacer",i.LENGTH.THICKMATHSPACE],"!":["Spacer",i.LENGTH.NEGATIVETHINMATHSPACE],enspace:["Spacer",".5em"],quad:["Spacer","1em"],qquad:["Spacer","2em"],thinspace:["Spacer",i.LENGTH.THINMATHSPACE],negthinspace:["Spacer",i.LENGTH.NEGATIVETHINMATHSPACE],hskip:"Hskip",hspace:"Hskip",kern:"Hskip",mskip:"Hskip",mspace:"Hskip",mkern:"Hskip",Rule:["Rule"],Space:["Rule","blank"],big:["MakeBig",i.TEXCLASS.ORD,0.85],Big:["MakeBig",i.TEXCLASS.ORD,1.15],bigg:["MakeBig",i.TEXCLASS.ORD,1.45],Bigg:["MakeBig",i.TEXCLASS.ORD,1.75],bigl:["MakeBig",i.TEXCLASS.OPEN,0.85],Bigl:["MakeBig",i.TEXCLASS.OPEN,1.15],biggl:["MakeBig",i.TEXCLASS.OPEN,1.45],Biggl:["MakeBig",i.TEXCLASS.OPEN,1.75],bigr:["MakeBig",i.TEXCLASS.CLOSE,0.85],Bigr:["MakeBig",i.TEXCLASS.CLOSE,1.15],biggr:["MakeBig",i.TEXCLASS.CLOSE,1.45],Biggr:["MakeBig",i.TEXCLASS.CLOSE,1.75],bigm:["MakeBig",i.TEXCLASS.REL,0.85],Bigm:["MakeBig",i.TEXCLASS.REL,1.15],biggm:["MakeBig",i.TEXCLASS.REL,1.45],Biggm:["MakeBig",i.TEXCLASS.REL,1.75],mathord:["TeXAtom",i.TEXCLASS.ORD],mathop:["TeXAtom",i.TEXCLASS.OP],mathopen:["TeXAtom",i.TEXCLASS.OPEN],mathclose:["TeXAtom",i.TEXCLASS.CLOSE],mathbin:["TeXAtom",i.TEXCLASS.BIN],mathrel:["TeXAtom",i.TEXCLASS.REL],mathpunct:["TeXAtom",i.TEXCLASS.PUNCT],mathinner:["TeXAtom",i.TEXCLASS.INNER],vcenter:["TeXAtom",i.TEXCLASS.VCENTER],mathchoice:["Extension","mathchoice"],buildrel:"BuildRel",hbox:["HBox",0],text:"HBox",mbox:["HBox",0],fbox:"FBox",strut:"Strut",mathstrut:["Macro","\\vphantom{(}"],phantom:"Phantom",vphantom:["Phantom",1,0],hphantom:["Phantom",0,1],smash:"Smash",acute:["Accent","02CA"],grave:["Accent","02CB"],ddot:["Accent","00A8"],tilde:["Accent","02DC"],bar:["Accent","02C9"],breve:["Accent","02D8"],check:["Accent","02C7"],hat:["Accent","02C6"],vec:["Accent","20D7"],dot:["Accent","02D9"],widetilde:["Accent","02DC",1],widehat:["Accent","02C6",1],matrix:"Matrix",array:"Matrix",pmatrix:["Matrix","(",")"],cases:["Matrix","{","","left left",null,".1em"],eqalign:["Matrix",null,null,"right left",i.LENGTH.THICKMATHSPACE,".5em","D"],displaylines:["Matrix",null,null,"center",null,".5em","D"],cr:"Cr","\\":"Cr",newline:"Cr",hline:["HLine","solid"],hdashline:["HLine","dashed"],eqalignno:["Matrix",null,null,"right left right",i.LENGTH.THICKMATHSPACE+" 3em",".5em","D"],leqalignno:["Matrix",null,null,"right left right",i.LENGTH.THICKMATHSPACE+" 3em",".5em","D"],bmod:["Macro","\\mathbin{\\rm mod}"],pmod:["Macro","\\pod{{\\rm mod}\\kern 6mu #1}",1],mod:["Macro","\\mathchoice{\\kern18mu}{\\kern12mu}{\\kern12mu}{\\kern12mu}{\\rm mod}\\,\\,#1",1],pod:["Macro","\\mathchoice{\\kern18mu}{\\kern8mu}{\\kern8mu}{\\kern8mu}(#1)",1],iff:["Macro","\\;\\Longleftrightarrow\\;"],skew:["Macro","{{#2{#3\\mkern#1mu}\\mkern-#1mu}{}}",3],mathcal:["Macro","{\\cal #1}",1],mathscr:["Macro","{\\scr #1}",1],mathrm:["Macro","{\\rm #1}",1],mathbf:["Macro","{\\bf #1}",1],mathbb:["Macro","{\\bbFont #1}",1],Bbb:["Macro","{\\bbFont #1}",1],mathit:["Macro","{\\it #1}",1],mathfrak:["Macro","{\\frak #1}",1],mathsf:["Macro","{\\sf #1}",1],mathtt:["Macro","{\\tt #1}",1],textrm:["Macro","\\mathord{\\rm\\text{#1}}",1],textit:["Macro","\\mathord{\\it{\\text{#1}}}",1],textbf:["Macro","\\mathord{\\bf{\\text{#1}}}",1],pmb:["Macro","\\rlap{#1}\\kern1px{#1}",1],TeX:["Macro","T\\kern-.14em\\lower.5ex{E}\\kern-.115em X"],LaTeX:["Macro","L\\kern-.325em\\raise.21em{\\scriptstyle{A}}\\kern-.17em\\TeX"],not:["Macro","\\mathrel{\\rlap{\\kern.5em\\notChar}}"]," ":["Macro","\\text{ }"],space:"Tilde",begin:"Begin",end:"End",newcommand:["Extension","newcommand"],renewcommand:["Extension","newcommand"],newenvironment:["Extension","newcommand"],def:["Extension","newcommand"],verb:["Extension","verb"],boldsymbol:["Extension","boldsymbol"],tag:["Extension","AMSmath"],notag:["Extension","AMSmath"],label:["Macro","",1],nonumber:["Macro",""],unicode:["Extension","unicode"],color:"Color",href:["Extension","HTML"],"class":["Extension","HTML"],style:["Extension","HTML"],cssId:["Extension","HTML"],require:"Require"},environment:{array:["Array"],matrix:["Array",null,null,null,"c"],pmatrix:["Array",null,"(",")","c"],bmatrix:["Array",null,"[","]","c"],Bmatrix:["Array",null,"\\{","\\}","c"],vmatrix:["Array",null,"\\vert","\\vert","c"],Vmatrix:["Array",null,"\\Vert","\\Vert","c"],cases:["Array",null,"\\{",".","ll",null,".1em"],eqnarray:["Array",null,null,null,"rcl",i.LENGTH.THICKMATHSPACE,".5em","D"],"eqnarray*":["Array",null,null,null,"rcl",i.LENGTH.THICKMATHSPACE,".5em","D"],equation:[null,"Equation"],"equation*":[null,"Equation"],align:["ExtensionEnv",null,"AMSmath"],"align*":["ExtensionEnv",null,"AMSmath"],aligned:["ExtensionEnv",null,"AMSmath"],multline:["ExtensionEnv",null,"AMSmath"],"multline*":["ExtensionEnv",null,"AMSmath"],split:["ExtensionEnv",null,"AMSmath"],gather:["ExtensionEnv",null,"AMSmath"],"gather*":["ExtensionEnv",null,"AMSmath"],gathered:["ExtensionEnv",null,"AMSmath"],alignat:["ExtensionEnv",null,"AMSmath"],"alignat*":["ExtensionEnv",null,"AMSmath"],alignedat:["ExtensionEnv",null,"AMSmath"]},p_height:1.2/0.85});if(this.config.Macros){var k=this.config.Macros;for(var l in k){if(k.hasOwnProperty(l)){if(typeof(k[l])==="string"){g.macros[l]=["Macro",k[l]]}else{g.macros[l]=["Macro"].concat(k[l])}}}}};var a=MathJax.Object.Subclass({Init:function(l,m){this.string=l;this.i=0;this.macroCount=0;var k;if(m){k={};for(var n in m){if(m.hasOwnProperty(n)){k[n]=m[n]}}}this.stack=d.Stack(k);this.Parse();this.Push(b.stop())},Parse:function(){var k;while(this.i<this.string.length){k=this.string.charAt(this.i++);if(g.special[k]){this[g.special[k]](k)}else{if(g.letter.test(k)){this.Variable(k)}else{if(g.digit.test(k)){this.Number(k)}else{this.Other(k)}}}}},Push:function(){this.stack.Push.apply(this.stack,arguments)},mml:function(){if(this.stack.Top().type!=="mml"){return null}return this.stack.Top().data[0]},mmlToken:function(k){return k},ControlSequence:function(q){var k=this.GetCS(),p,n;if(g.macros[k]){var m=g.macros[k];if(!(m instanceof Array)){m=[m]}var l=m[0];if(!(l instanceof Function)){l=this[l]}l.apply(this,["\\"+k].concat(m.slice(1)))}else{if(g.mathchar0mi[k]){p=g.mathchar0mi[k];n={mathvariant:i.VARIANT.ITALIC};if(p instanceof Array){n=p[1];p=p[0]}this.Push(this.mmlToken(i.mi(i.entity("#x"+p)).With(n)))}else{if(g.mathchar0mo[k]){p=g.mathchar0mo[k];n={stretchy:f};if(p instanceof Array){n=p[1];n.stretchy=f;p=p[0]}this.Push(this.mmlToken(i.mo(i.entity("#x"+p)).With(n)))}else{if(g.mathchar7[k]){p=g.mathchar7[k];n={mathvariant:i.VARIANT.NORMAL};if(p instanceof Array){n=p[1];p=p[0]}if(this.stack.env.font){n.mathvariant=this.stack.env.font}this.Push(this.mmlToken(i.mi(i.entity("#x"+p)).With(n)))}else{if(g.delimiter["\\"+k]!=null){var o=g.delimiter["\\"+k];n={};if(o instanceof Array){n=o[1];o=o[0]}if(o.length===4){o=i.entity("#x"+o)}else{o=i.chars(o)}this.Push(this.mmlToken(i.mo(o).With({fence:f,stretchy:f}).With(n)))}else{this.csUndefined("\\"+k)}}}}}},csUndefined:function(k){d.Error("Undefined control sequence "+k)},Variable:function(l){var k={};if(this.stack.env.font){k.mathvariant=this.stack.env.font}this.Push(this.mmlToken(i.mi(i.chars(l)).With(k)))},Number:function(m){var k,l=this.string.slice(this.i-1).match(g.number);if(l){k=i.mn(l[0].replace(/[{}]/g,""));this.i+=l[0].length-1}else{k=i.mo(i.chars(m))}if(this.stack.env.font){k.mathvariant=this.stack.env.font}this.Push(this.mmlToken(k))},Open:function(k){this.Push(b.open())},Close:function(k){this.Push(b.close())},Tilde:function(k){this.Push(i.mtext(i.chars(h)))},Space:function(k){},Superscript:function(m){var k,l=this.stack.Prev();if(!l){l=i.mi("")}if(l.isEmbellishedWrapper){l=l.data[0].data[0]}if(l.type==="msubsup"){if(l.data[l.sup]){if(!l.data[l.sup].isPrime){d.Error("Double exponent: use braces to clarify")}l=i.msubsup(l,null,null)}k=l.sup}else{if(l.movesupsub){if(l.type!=="munderover"||l.data[l.over]){l=i.munderover(l,null,null).With({movesupsub:c})}k=l.over}else{l=i.msubsup(l,null,null);k=l.sup}}this.Push(b.subsup(l).With({position:k}))},Subscript:function(m){var k,l=this.stack.Prev();if(!l){l=i.mi("")}if(l.isEmbellishedWrapper){l=l.data[0].data[0]}if(l.type==="msubsup"){if(l.data[l.sub]){d.Error("Double subscripts: use braces to clarify")}k=l.sub}else{if(l.movesupsub){if(l.type!=="munderover"||l.data[l.under]){l=i.munderover(l,null,null).With({movesupsub:c})}k=l.under}else{l=i.msubsup(l,null,null);k=l.sub}}this.Push(b.subsup(l).With({position:k}))},PRIME:String.fromCharCode(8242),SMARTQUOTE:String.fromCharCode(8217),Prime:function(m){var l=this.stack.Prev();if(!l){l=i.mi()}if(l.type==="msubsup"&&l.data[l.sup]){d.Error("Prime causes double exponent: use braces to clarify")}var k="";this.i--;do{k+=this.PRIME;this.i++,m=this.GetNext()}while(m==="'"||m===this.SMARTQUOTE);k=this.mmlToken(i.mo(i.chars(k)).With({isPrime:c,variantForm:d.isSTIX}));this.Push(i.msubsup(l,null,k))},Comment:function(k){while(this.i<this.string.length&&this.string.charAt(this.i)!="\n"){this.i++}},Hash:function(k){d.Error("You can't use 'macro parameter character #' in math mode")},Other:function(m){var l={stretchy:false},k;if(this.stack.env.font){l.mathvariant=this.stack.env.font}if(g.remap[m]){m=g.remap[m];if(m instanceof Array){l=m[1];m=m[0]}k=i.mo(i.entity("#x"+m))}else{k=i.mo(m)}if(k.autoDefault("texClass",true)==""){k=i.TeXAtom(k)}this.Push(this.mmlToken(k.With(l)))},SetFont:function(l,k){this.stack.env.font=k},SetStyle:function(l,k,m,n){this.stack.env.style=k;this.stack.env.level=n;this.Push(b.style().With({styles:{displaystyle:m,scriptlevel:n}}))},SetSize:function(k,l){this.stack.env.size=l;this.Push(b.style().With({styles:{mathsize:l+"em"}}))},Color:function(m){var l=this.GetArgument(m);var k=this.stack.env.color;this.stack.env.color=l;var n=this.ParseArg(m);if(k){this.stack.env.color}else{delete this.stack.env.color}this.Push(i.mstyle(n).With({mathcolor:l}))},Spacer:function(k,l){this.Push(i.mspace().With({width:l,mathsize:i.SIZE.NORMAL,scriptlevel:1}))},LeftRight:function(k){this.Push(b[k.substr(1)]().With({delim:this.GetDelimiter(k)}))},NamedOp:function(m,l,o){var n=(l!=null&&l===0?f:c);if(!o){o=m.substr(1)}l=((l||l==null)?c:f);o=o.replace(/&thinsp;/,String.fromCharCode(8198));var k=i.mo(o).With({movablelimits:l,movesupsub:n,form:i.FORM.PREFIX,texClass:i.TEXCLASS.OP});k.useMMLspacing&=~k.SPACE_ATTR.form;this.Push(this.mmlToken(k))},Limits:function(l,k){var m=this.stack.Prev("nopop");if(m.texClass!==i.TEXCLASS.OP){d.Error(l+" is allowed only on operators")}m.movesupsub=(k?c:f);m.movablelimits=f},Over:function(m,l,n){var k=b.over().With({name:m});if(l||n){k.open=l;k.close=n}else{if(m.match(/withdelims$/)){k.open=this.GetDelimiter(m);k.close=this.GetDelimiter(m)}}if(m.match(/^\\above/)){k.thickness=this.GetDimen(m)}else{if(m.match(/^\\atop/)||l||n){k.thickness=0}}this.Push(k)},Frac:function(l){var k=this.ParseArg(l);var m=this.ParseArg(l);this.Push(i.mfrac(k,m))},Sqrt:function(l){var m=this.GetBrackets(l),k=this.ParseArg(l);if(m==""){k=i.msqrt.apply(i,k.array())}else{k=i.mroot(k,this.parseRoot(m))}this.Push(k)},Root:function(l){var m=this.GetUpTo(l,"\\of");var k=this.ParseArg(l);this.Push(i.mroot(k,this.parseRoot(m)))},parseRoot:function(p){var l=this.stack.env,k=l.inRoot;l.inRoot=true;var o=d.Parse(p,l);p=o.mml();var m=o.stack.global;if(m.leftRoot||m.upRoot){p=i.mpadded(p);if(m.leftRoot){p.width=m.leftRoot}if(m.upRoot){p.voffset=m.upRoot;p.height=m.upRoot}}l.inRoot=k;return p},MoveRoot:function(k,m){if(!this.stack.env.inRoot){d.Error(k+" can appear only within a root")}if(this.stack.global[m]){d.Error("Multiple use of "+k)}var l=this.GetArgument(k);if(!l.match(/-?[0-9]+/)){d.Error("The argument to "+k+" must be an integer")}l=(l/15)+"em";if(l.substr(0,1)!=="-"){l="+"+l}this.stack.global[m]=l},Accent:function(m,k,p){var o=this.ParseArg(m);var n={accent:true};if(this.stack.env.font){n.mathvariant=this.stack.env.font}var l=this.mmlToken(i.mo(i.entity("#x"+k)).With(n));l.stretchy=(p?c:f);this.Push(i.munderover(o,null,l).With({accent:c}))},UnderOver:function(m,p,k){var o={o:"over",u:"under"}[m.charAt(1)];var n=this.ParseArg(m);if(n.Get("movablelimits")){n.movablelimits=false}var l=i.munderover(n,null,null);if(k){l.movesupsub=c}l.data[l[o]]=this.mmlToken(i.mo(i.entity("#x"+p)).With({stretchy:c,accent:(o=="under")}));this.Push(l)},Overset:function(k){var m=this.ParseArg(k),l=this.ParseArg(k);this.Push(i.munderover(l,null,m))},Underset:function(k){var m=this.ParseArg(k),l=this.ParseArg(k);this.Push(i.munderover(l,m,null))},TeXAtom:function(n,p){var o={texClass:p},m;if(p==i.TEXCLASS.OP){o.movesupsub=o.movablelimits=c;var k=this.GetArgument(n);var l=k.match(/^\s*\\rm\s+([a-zA-Z0-9 ]+)$/);if(l){m=this.mmlToken(i.mo(l[1]).With({movablelimits:c,movesupsub:c,mathvariant:i.VARIANT.NORMAL,form:i.FORM.PREFIX,texClass:i.TEXCLASS.OP}));m.useMMLspacing&=~m.SPACE_ATTR.form}else{m=i.TeXAtom(d.Parse(k,this.stack.env).mml()).With(o)}}else{m=i.TeXAtom(this.ParseArg(n)).With(o)}this.Push(m)},Strut:function(k){this.Push(i.mpadded(i.mrow()).With({height:"8.6pt",depth:"3pt",width:0}))},Phantom:function(l,k,m){var n=i.mphantom(this.ParseArg(l));if(k||m){n=i.mpadded(n);if(m){n.height=n.depth=0}if(k){n.width=0}}this.Push(n)},Smash:function(m){var l=this.trimSpaces(this.GetBrackets(m));var k=i.mpadded(this.ParseArg(m));switch(l){case"b":k.depth=0;break;case"t":k.height=0;break;default:k.height=k.depth=0}this.Push(k)},Lap:function(l){var k=i.mpadded(this.ParseArg(l)).With({width:0});if(l==="\\llap"){k.lspace="-1 width"}this.Push(k)},RaiseLower:function(k){var l=this.GetDimen(k);var m=b.position().With({name:k,move:"vertical"});if(l.charAt(0)==="-"){l=l.slice(1);k={raise:"\\lower",lower:"\\raise"}[k.substr(1)]}if(k==="\\lower"){m.dh="-"+l;m.dd="+"+l}else{m.dh="+"+l;m.dd="-"+l}this.Push(m)},MoveLeftRight:function(k){var n=this.GetDimen(k);var m=(n.charAt(0)==="-"?n.slice(1):"-"+n);if(k==="\\moveleft"){var l=n;n=m;m=l}this.Push(b.position().With({name:k,move:"horizontal",left:i.mspace().With({width:n,mathsize:i.SIZE.NORMAL,scriptlevel:1}),right:i.mspace().With({width:m,mathsize:i.SIZE.NORMAL,scriptlevel:1})}))},Hskip:function(k){this.Push(i.mspace().With({width:this.GetDimen(k),mathsize:i.SIZE.NORMAL,scriptlevel:0}))},Rule:function(m,o){var k=this.GetDimen(m),n=this.GetDimen(m),q=this.GetDimen(m);var l,p={width:k,height:n,depth:q};if(o!=="blank"){l=i.mpadded(i.mrow()).With(p);if(parseFloat(k)&&parseFloat(n)+parseFloat(q)){l=i.mstyle(l).With({mathbackground:(this.stack.env.color||"black")})}}else{l=i.mspace().With(p)}this.Push(l)},MakeBig:function(k,n,l){l*=g.p_height;l=String(l).replace(/(\.\d\d\d).+/,"$1")+"em";var m=this.GetDelimiter(k);this.Push(i.TeXAtom(i.mo(m).With({minsize:l,maxsize:l,scriptlevel:0,fence:c,stretchy:c,symmetric:c})).With({texClass:n}))},BuildRel:function(k){var l=this.ParseUpTo(k,"\\over");var m=this.ParseArg(k);this.Push(i.TeXAtom(i.munderover(m,null,l)).With({mclass:i.TEXCLASS.REL}))},HBox:function(k,l){this.Push.apply(this,this.InternalMath(this.GetArgument(k),l))},FBox:function(k){this.Push(i.menclose.apply(i,this.InternalMath(this.GetArgument(k))).With({notation:"box"}))},Require:function(k){var l=this.GetArgument(k);this.Extension(null,l)},Extension:function(k,l,m){if(k&&!typeof(k)==="string"){k=k.name}l=d.extensionDir+"/"+l;if(!l.match(/\.js$/)){l+=".js"}if(!MathJax.Ajax.loaded[MathJax.Ajax.fileURL(l)]){if(k!=null){delete g[m||"macros"][k.replace(/^\\/,"")]}MathJax.Hub.RestartAfter(MathJax.Ajax.Require(l))}},Macro:function(l,o,n){if(n){var k=[];for(var m=0;m<n;m++){k.push(this.GetArgument(l))}o=this.SubstituteArgs(k,o)}this.string=this.AddArgs(o,this.string.slice(this.i));this.i=0;if(++this.macroCount>d.config.MAXMACROS){d.Error("MathJax maximum macro substitution count exceeded; is there a recursive macro call?")}},Matrix:function(l,n,s,p,q,m,k){var r=this.GetNext();if(r===""){d.Error("Missing argument for "+l)}if(r==="{"){this.i++}else{this.string=r+"}"+this.string.slice(this.i+1);this.i=0}var o=b.array().With({requireClose:c,arraydef:{rowspacing:(m||"4pt"),columnspacing:(q||"1em")}});if(n||s){o.open=n;o.close=s}if(k==="D"){o.arraydef.displaystyle=c}if(p!=null){o.arraydef.columnalign=p}this.Push(o)},Entry:function(k){this.Push(b.cell().With({isEntry:c,name:k}))},Cr:function(k){this.Push(b.cell().With({isCR:c,name:k}))},HLine:function(l,m){if(m==null){m="solid"}var n=this.stack.Top();if(n.type!=="array"||n.data.length){d.Error("Misplaced "+l)}if(n.table.length==0){n.arraydef.frame=m}else{var k=(n.arraydef.rowlines?n.arraydef.rowlines.split(/ /):[]);while(k.length<n.table.length){k.push("none")}k[n.table.length-1]=m;n.arraydef.rowlines=k.join(" ")}},Begin:function(l){var m=this.GetArgument(l);if(m.match(/[^a-z*]/i)){d.Error('Invalid environment name "'+m+'"')}if(!g.environment[m]){d.Error('Unknown environment "'+m+'"')}if(++this.macroCount>d.config.MAXMACROS){d.Error("MathJax maximum substitution count exceeded; is there a recursive latex environment?")}var n=g.environment[m];if(!(n instanceof Array)){n=[n]}var k=b.begin().With({name:m,end:n[1],parse:this});if(n[0]&&this[n[0]]){k=this[n[0]].apply(this,[k].concat(n.slice(2)))}this.Push(k)},End:function(k){this.Push(b.end().With({name:this.GetArgument(k)}))},Equation:function(k,l){return l},ExtensionEnv:function(l,k){this.Extension(l.name,k,"environment")},Array:function(m,o,t,r,s,n,k,p){if(!r){r=this.GetArgument("\\begin{"+m.name+"}")}var u=("c"+r).replace(/[^clr|:]/g,"").replace(/[^|:]([|:])+/g,"$1");r=r.replace(/[^clr]/g,"").split("").join(" ");r=r.replace(/l/g,"left").replace(/r/g,"right").replace(/c/g,"center");var q=b.array().With({arraydef:{columnalign:r,columnspacing:(s||"1em"),rowspacing:(n||"4pt")}});if(u.match(/[|:]/)){var l=(u.charAt(0)+u.charAt(u.length-1)).replace(/[^|:]/g,"");if(l!==""){q.arraydef.frame={"|":"solid",":":"dashed"}[l.charAt(0)];q.arraydef.framespacing=".5em .5ex"}u=u.substr(1,u.length-2);q.arraydef.columnlines=u.split("").join(" ").replace(/[^|: ]/g,"none").replace(/\|/g,"solid").replace(/:/g,"dashed")}if(o){q.open=this.convertDelimiter(o)}if(t){q.close=this.convertDelimiter(t)}if(k==="D"){q.arraydef.displaystyle=c}if(k==="S"){q.arraydef.scriptlevel=1}if(p){q.arraydef.useHeight=f}this.Push(m);return q},convertDelimiter:function(k){if(k){k=g.delimiter[k]}if(k==null){return null}if(k instanceof Array){k=k[0]}if(k.length===4){k=String.fromCharCode(parseInt(k,16))}return k},trimSpaces:function(k){if(typeof(k)!="string"){return k}return k.replace(/^\s+|\s+$/g,"")},nextIsSpace:function(){return this.string.charAt(this.i).match(/[ \n\r\t]/)},GetNext:function(){while(this.nextIsSpace()){this.i++}return this.string.charAt(this.i)},GetCS:function(){var k=this.string.slice(this.i).match(/^([a-z]+|.) ?/i);if(k){this.i+=k[1].length;return k[1]}else{this.i++;return" "}},GetArgument:function(l,m){switch(this.GetNext()){case"":if(!m){d.Error("Missing argument for "+l)}return null;case"}":if(!m){d.Error("Extra close brace or missing open brace")}return null;case"\\":this.i++;return"\\"+this.GetCS();case"{":var k=++this.i,n=1;while(this.i<this.string.length){switch(this.string.charAt(this.i++)){case"\\":this.i++;break;case"{":n++;break;case"}":if(n==0){d.Error("Extra close brace")}if(--n==0){return this.string.slice(k,this.i-1)}break}}d.Error("Missing close brace");break}return this.string.charAt(this.i++)},GetBrackets:function(l){if(this.GetNext()!="["){return""}var k=++this.i,m=0;while(this.i<this.string.length){switch(this.string.charAt(this.i++)){case"{":m++;break;case"\\":this.i++;break;case"}":if(m--<=0){d.Error("Extra close brace while looking for ']'")}break;case"]":if(m==0){return this.string.slice(k,this.i-1)}break}}d.Error("Couldn't find closing ']' for argument to "+l)},GetDelimiter:function(k){while(this.nextIsSpace()){this.i++}var l=this.string.charAt(this.i);if(this.i<this.string.length){this.i++;if(l=="\\"){l+=this.GetCS(k)}if(g.delimiter[l]!=null){return this.convertDelimiter(l)}}d.Error("Missing or unrecognized delimiter for "+k)},GetDimen:function(l){var m;if(this.nextIsSpace()){this.i++}if(this.string.charAt(this.i)=="{"){m=this.GetArgument(l);if(m.match(/^\s*([-+]?(\.\d+|\d+(\.\d*)?))\s*(pt|em|ex|mu|px|mm|cm|in|pc)\s*$/)){return m.replace(/ /g,"")}}else{m=this.string.slice(this.i);var k=m.match(/^\s*(([-+]?(\.\d+|\d+(\.\d*)?))\s*(pt|em|ex|mu|px|mm|cm|in|pc)) ?/);if(k){this.i+=k[0].length;return k[1].replace(/ /g,"")}}d.Error("Missing dimension or its units for "+l)},GetUpTo:function(n,o){while(this.nextIsSpace()){this.i++}var m=this.i,l,q,p=0;while(this.i<this.string.length){l=this.i;q=this.string.charAt(this.i++);switch(q){case"\\":q+=this.GetCS();break;case"{":p++;break;case"}":if(p==0){d.Error("Extra close brace while looking for "+o)}p--;break}if(p==0&&q==o){return this.string.slice(m,l)}}d.Error("Couldn't find "+o+" for "+n)},ParseArg:function(k){return d.Parse(this.GetArgument(k),this.stack.env).mml()},ParseUpTo:function(k,l){return d.Parse(this.GetUpTo(k,l),this.stack.env).mml()},InternalMath:function(q,s){var p={displaystyle:f};if(s!=null){p.scriptlevel=s}if(this.stack.env.font){p.mathvariant=this.stack.env.font}if(!q.match(/\$|\\\(/)){return[this.InternalText(q,p)]}var o=0,l=0,r,n="";var m=[];while(o<q.length){r=q.charAt(o++);if(r==="$"){if(n==="$"){m.push(i.TeXAtom(d.Parse(q.slice(l,o-1)).mml().With(p)));n="";l=o}else{if(n===""){if(l<o-1){m.push(this.InternalText(q.slice(l,o-1),p))}n="$";l=o}}}else{if(r==="\\"){r=q.charAt(o++);if(r==="("&&n===""){if(l<o-2){m.push(this.InternalText(q.slice(l,o-2),p))}n=")";l=o}else{if(r===")"&&n===")"){m.push(i.TeXAtom(d.Parse(q.slice(l,o-2)).mml().With(p)));n="";l=o}}}}}if(n!==""){d.Error("Math not terminated in text box")}if(l<q.length){m.push(this.InternalText(q.slice(l),p))}return m},InternalText:function(l,k){l=l.replace(/^\s+/,h).replace(/\s+$/,h);return i.mtext(i.chars(l)).With(k)},SubstituteArgs:function(l,k){var o="";var n="";var p;var m=0;while(m<k.length){p=k.charAt(m++);if(p==="\\"){o+=p+k.charAt(m++)}else{if(p==="#"){p=k.charAt(m++);if(p==="#"){o+=p}else{if(!p.match(/[1-9]/)||p>l.length){d.Error("Illegal macro parameter reference")}n=this.AddArgs(this.AddArgs(n,o),l[p-1]);o=""}}else{o+=p}}}return this.AddArgs(n,o)},AddArgs:function(l,k){if(k.match(/^[a-z]/i)&&l.match(/(^|[^\\])(\\\\)*\\[a-z]+$/i)){l+=" "}if(l.length+k.length>d.config.MAXBUFFER){d.Error("MathJax internal buffer size exceeded; is there a recursive macro call?")}return l+k}});d.Augment({Stack:e,Parse:a,Definitions:g,Startup:j,config:{MAXMACROS:10000,MAXBUFFER:5*1024},Translate:function(k){var l,n=k.innerHTML.replace(/^\s+/,"").replace(/\s+$/,"");if(MathJax.Hub.Browser.isKonqueror){n=n.replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&")}var o=(k.type.replace(/\n/g," ").match(/(;|\s|\n)mode\s*=\s*display(;|\s|\n|$)/)!=null);n=d.prefilterMath(n,o,k);try{l=d.Parse(n).mml()}catch(m){if(!m.texError){throw m}l=this.formatError(m,n,o,k)}if(l.inferred){l=i.apply(MathJax.ElementJax,l.data)}else{l=i(l)}if(o){l.root.display="block"}return this.postfilterMath(l,o,k)},prefilterMath:function(l,m,k){return l.replace(/([_^]\s*\d)([0-9.,])/g,"$1 $2")},postfilterMath:function(l,m,k){this.combineRelations(l.root);return l},formatError:function(m,l,n,k){return i.merror(m.message.replace(/\n.*/,""))},Error:function(k){throw MathJax.Hub.Insert(Error(k),{texError:c})},Macro:function(k,l,m){g.macros[k]=["Macro"].concat([].slice.call(arguments,1))},combineRelations:function(l){for(var n=0,k=l.data.length;n<k;n++){if(l.data[n]){if(l.isa(i.mrow)){while(n+1<k&&l.data[n+1]&&l.data[n].isa(i.mo)&&l.data[n+1].isa(i.mo)&&l.data[n].Get("texClass")===i.TEXCLASS.REL&&l.data[n+1].Get("texClass")===i.TEXCLASS.REL){l.data[n].Append.apply(l.data[n],l.data[n+1].data);l.data.splice(n+1,1);k--}}if(!l.data[n].isToken){this.combineRelations(l.data[n])}}}}});d.loadComplete("jax.js")})(MathJax.InputJax.TeX);
+
+MathJax.Hub.Register.StartupHook("TeX Jax Ready",function(){var e="1.1";var a=MathJax.ElementJax.mml;var f=MathJax.InputJax.TeX;var c=f.Definitions;var d=f.Stack.Item;var b=function(g){return g.join("em ")+"em"};MathJax.Hub.Insert(c,{macros:{mathring:["Accent","2DA"],nobreakspace:"Tilde",negmedspace:["Spacer",a.LENGTH.NEGATIVEMEDIUMMATHSPACE],negthickspace:["Spacer",a.LENGTH.NEGATIVETHICKMATHSPACE],intI:["Macro","\\mathchoice{\\!}{}{}{}\\!\\!\\int"],iiiint:["MultiIntegral","\\int\\intI\\intI\\intI"],idotsint:["MultiIntegral","\\int\\cdots\\int"],dddot:["Macro","\\mathop{#1}\\limits^{\\textstyle \\mathord{.}\\mathord{.}\\mathord{.}}",1],ddddot:["Macro","\\mathop{#1}\\limits^{\\textstyle \\mathord{.}\\mathord{.}\\mathord{.}\\mathord{.}}",1],sideset:["Macro","\\mathop{\\mathop{\\rlap{\\phantom{#3}}}\\nolimits#1\\!\\mathop{#3}\\nolimits#2}",3],boxed:["Macro","\\fbox{$\\displaystyle{#1}$}",1],tag:"HandleTag",notag:"HandleNoTag",substack:["Macro","\\begin{subarray}{c}#1\\end{subarray}",1],injlim:["Macro","\\mathop{\\rm inj\\,lim}"],projlim:["Macro","\\mathop{\\rm proj\\,lim}"],varliminf:["Macro","\\mathop{\\underline{\\rm lim}}"],varlimsup:["Macro","\\mathop{\\overline{\\rm lim}}"],varinjlim:["Macro","\\mathop{\\underrightarrow{\\rm lim\\Rule{-1pt}{0pt}{1pt}}\\Rule{0pt}{0pt}{.45em}}"],varprojlim:["Macro","\\mathop{\\underleftarrow{\\rm lim\\Rule{-1pt}{0pt}{1pt}}\\Rule{0pt}{0pt}{.45em}}"],DeclareMathOperator:"HandleDeclareOp",operatorname:"HandleOperatorName",genfrac:"Genfrac",frac:["Genfrac","","","",""],tfrac:["Genfrac","","","",1],dfrac:["Genfrac","","","",0],binom:["Genfrac","(",")","0em",""],tbinom:["Genfrac","(",")","0em",1],dbinom:["Genfrac","(",")","0em",0],cfrac:"CFrac",shoveleft:["HandleShove",a.ALIGN.LEFT],shoveright:["HandleShove",a.ALIGN.RIGHT],xrightarrow:["xArrow",8594,5,6],xleftarrow:["xArrow",8592,7,3]},environment:{align:["AMSarray",null,true,true,"rlrlrlrlrlrl",b([5/18,2,5/18,2,5/18,2,5/18,2,5/18,2,5/18])],"align*":["AMSarray",null,false,true,"rlrlrlrlrlrl",b([5/18,2,5/18,2,5/18,2,5/18,2,5/18,2,5/18])],multline:["Multline",null,true],"multline*":["Multline",null,false],split:["AMSarray",null,false,false,"rl",b([5/18])],gather:["AMSarray",null,true,true,"c"],"gather*":["AMSarray",null,false,true,"c"],alignat:["AlignAt",null,true,true],"alignat*":["AlignAt",null,false,true],alignedat:["AlignAt",null,false,false],aligned:["Array",null,null,null,"rlrlrlrlrlrl",b([5/18,2,5/18,2,5/18,2,5/18,2,5/18,2,5/18]),".5em","D"],gathered:["Array",null,null,null,"c",null,".5em","D"],subarray:["Array",null,null,null,null,b([0,0,0,0]),"0.1em","S",1],smallmatrix:["Array",null,null,null,"c",b([1/3]),".2em","S",1]},delimiter:{"\\lvert":["2223",{texClass:a.TEXCLASS.OPEN}],"\\rvert":["2223",{texClass:a.TEXCLASS.CLOSE}],"\\lVert":["2225",{texClass:a.TEXCLASS.OPEN}],"\\rVert":["2225",{texClass:a.TEXCLASS.CLOSE}]}});f.Parse.Augment({HandleTag:function(h){var g=this.trimSpaces(this.GetArgument(h));if(g==="*"){g=this.GetArgument(h)}else{g="("+g+")"}if(this.stack.global.notag){f.Error(h+" not allowed in "+this.stack.global.notag+" environment")}if(this.stack.global.tag){f.Error("Multiple "+h)}this.stack.global.tag=a.mtd.apply(a,this.InternalMath(g))},HandleNoTag:function(g){if(this.stack.global.tag){delete this.stack.global.tag}},HandleDeclareOp:function(h){var g="";var i=this.trimSpaces(this.GetArgument(h));if(i=="*"){g="\\limits";i=this.trimSpaces(this.GetArgument(h))}if(i.charAt(0)=="\\"){i=i.substr(1)}var j=this.GetArgument(h);j=j.replace(/\*/g,"\\text{*}").replace(/-/g,"\\text{-}");f.Definitions.macros[i]=["Macro","\\mathop{\\rm "+j+"}"+g]},HandleOperatorName:function(h){var g="\\nolimits";var i=this.trimSpaces(this.GetArgument(h));if(i=="*"){g="\\limits";i=this.trimSpaces(this.GetArgument(h))}i=i.replace(/\*/g,"\\text{*}").replace(/-/g,"\\text{-}");this.string="\\mathop{\\rm "+i+"}"+g+" "+this.string.slice(this.i);this.i=0},HandleShove:function(h,g){var i=this.stack.Top();if(i.type!=="multline"||i.data.length){f.Error(h+" must come at the beginning of the line")}i.data.shove=g},CFrac:function(j){var g=this.trimSpaces(this.GetBrackets(j)),i=this.GetArgument(j),k=this.GetArgument(j);var h=a.mfrac(f.Parse("\\strut\\textstyle{"+i+"}",this.stack.env).mml(),f.Parse("\\strut\\textstyle{"+k+"}",this.stack.env).mml());g=({l:a.ALIGN.LEFT,r:a.ALIGN.RIGHT,"":""})[g];if(g==null){f.Error("Illegal alignment specified in "+j)}if(g){h.numalign=h.denomalign=g}this.Push(h)},Genfrac:function(h,j,o,l,g){if(j==null){j=this.GetDelimiterArg(h)}else{j=this.convertDelimiter(j)}if(o==null){o=this.GetDelimiterArg(h)}else{o=this.convertDelimiter(o)}if(l==null){l=this.GetArgument(h)}if(g==null){g=this.trimSpaces(this.GetArgument(h))}var k=this.ParseArg(h);var n=this.ParseArg(h);var i=a.mfrac(k,n);if(l!==""){i.linethickness=l}if(j||o){i=a.mfenced(i).With({open:j,close:o})}if(g!==""){var m=(["D","T","S","SS"])[g];if(m==null){f.Error("Bad math style for "+h)}i=a.mstyle(i);if(m==="D"){i.displaystyle=true;i.scriptlevel=0}else{i.displaystyle=false;i.scriptlevel=g-1}}this.Push(i)},Multline:function(h,g){this.Push(h);return d.multline().With({arraydef:{displaystyle:true,rowspacing:".5em",width:f.config.MultLineWidth,columnwidth:"100%",side:f.config.TagSide,minlabelspacing:f.config.TagIndent}})},AMSarray:function(i,h,g,k,j){this.Push(i);k=k.replace(/[^clr]/g,"").split("").join(" ");k=k.replace(/l/g,"left").replace(/r/g,"right").replace(/c/g,"center");return d.AMSarray(i.name,h,g,this.stack).With({arraydef:{displaystyle:true,rowspacing:".5em",columnalign:k,columnspacing:(j||"1em"),rowspacing:"3pt",side:f.config.TagSide,minlabelspacing:f.config.TagIndent}})},AlignAt:function(i,h,g){var j=this.GetArgument("\\begin{"+i.name+"}");if(j.match(/[^0-9]/)){f.Error("Argument to \\begin{"+i.name+"} must me a positive integer")}align="";spacing=[];while(j>0){align+="rl";spacing.push("0em 0em");j--}spacing=spacing.join(" ");if(g){return this.AMSarray(i,h,g,align,spacing)}return this.Array(i,null,null,align,spacing,".5em","D")},MultiIntegral:function(g,k){var j=this.GetNext();if(j==="\\"){var h=this.i;j=this.GetArgument(g);this.i=h;if(j==="\\limits"){if(g==="\\idotsint"){k="\\!\\!\\mathop{\\,\\,"+k+"}"}else{k="\\!\\!\\!\\mathop{\\,\\,\\,"+k+"}"}}}this.string=k+" "+this.string.slice(this.i);this.i=0},xArrow:function(i,m,k,g){var j={width:"+"+(k+g)+"mu",lspace:k+"mu"};var n=this.GetBrackets(i),o=this.ParseArg(i);var p=a.mo(a.chars(String.fromCharCode(m))).With({stretchy:true,texClass:a.TEXCLASS.REL});var h=a.munderover(p);h.SetData(h.over,a.mpadded(o).With(j).With({voffset:".15em"}));if(n){n=f.Parse(n,this.stack.env).mml();h.SetData(h.under,a.mpadded(n).With(j).With({voffset:"-.24em"}))}this.Push(h)},GetDelimiterArg:function(g){var h=this.trimSpaces(this.GetArgument(g));if(h==""){return null}if(!c.delimiter[h]){f.Error("Missing or unrecognized delimiter for "+g)}return this.convertDelimiter(h)}});d.multline=d.array.Subclass({type:"multline",EndEntry:function(){var g=a.mtd.apply(a,this.data);if(this.data.shove){g.columnalign=this.data.shove}this.row.push(g);this.data=[]},EndRow:function(){if(this.row.length!=1){f.Error("multline rows must have exactly one column")}this.table.push(this.row);this.row=[]},EndTable:function(){this.SUPER(arguments).EndTable.call(this);if(this.table.length){var h=this.table.length-1,j;if(!this.table[0][0].columnalign){this.table[0][0].columnalign=a.ALIGN.LEFT}if(!this.table[h][0].columnalign){this.table[h][0].columnalign=a.ALIGN.RIGHT}var g=a.mtr;if(this.global.tag){this.table[0]=[this.global.tag].concat(this.table[0]);delete this.global.tag;g=a.mlabeledtr}this.table[0]=g.apply(a,this.table[0]);for(j=1,h=this.table.length;j<h;j++){this.table[j]=a.mtr.apply(a,this.table[j])}}}});d.AMSarray=d.array.Subclass({type:"AMSarray",Init:function(j,i,h,g){this.SUPER(arguments).Init.apply(this);this.numbered=i;this.save_notag=g.global.notag;g.global.notag=(h?null:j)},EndRow:function(){var g=a.mtr;if(this.global.tag){this.row=[this.global.tag].concat(this.row);g=a.mlabeledtr;delete this.global.tag}this.table.push(g.apply(a,this.row));this.row=[]},EndTable:function(){this.SUPER(arguments).EndTable.call(this);this.global.notag=this.save_notag}});d.start.Augment({oldCheckItem:d.start.prototype.checkItem,checkItem:function(h){if(h.type==="stop"){var g=this.mmlData();if(this.global.tag){var j=[this.global.tag,a.mtd(g)];delete this.global.tag;var i={side:f.config.TagSide,minlabelspacing:f.config.TagIndent,columnalign:g.displayAlign};if(g.displayAlign===a.INDENTALIGN.LEFT){i.width="100%";if(g.displayIndent&&!String(g.displayIndent).match(/^0+(\.0*)?($|[a-z%])/)){i.columnwidth=g.displayIndent+" fit";i.columnspacing="0";j=[j[0],a.mtd(),j[1]]}}else{if(g.displayAlign===a.INDENTALIGN.RIGHT){i.width="100%";if(g.displayIndent&&!String(g.displayIndent).match(/^0+(\.0*)?($|[a-z%])/)){i.columnwidth="fit "+g.displayIndent;i.columnspacing="0";j[2]=a.mtd()}}}g=a.mtable(a.mlabeledtr.apply(a,j)).With(i)}return d.mml(g)}return this.SUPER(arguments).checkItem.call(this,h)}});MathJax.Hub.Startup.signal.Post("TeX AMSmath Ready")});MathJax.Ajax.loadComplete("[MathJax]/extensions/TeX/AMSmath.js");
+
+MathJax.Hub.Register.StartupHook("TeX Jax Ready",function(){var b="1.1.2";var a=MathJax.ElementJax.mml;MathJax.Hub.Insert(MathJax.InputJax.TeX.Definitions,{mathchar0mi:{digamma:"03DD",varkappa:"03F0",varGamma:["0393",{mathvariant:a.VARIANT.ITALIC}],varDelta:["0394",{mathvariant:a.VARIANT.ITALIC}],varTheta:["0398",{mathvariant:a.VARIANT.ITALIC}],varLambda:["039B",{mathvariant:a.VARIANT.ITALIC}],varXi:["039E",{mathvariant:a.VARIANT.ITALIC}],varPi:["03A0",{mathvariant:a.VARIANT.ITALIC}],varSigma:["03A3",{mathvariant:a.VARIANT.ITALIC}],varUpsilon:["03A5",{mathvariant:a.VARIANT.ITALIC}],varPhi:["03A6",{mathvariant:a.VARIANT.ITALIC}],varPsi:["03A8",{mathvariant:a.VARIANT.ITALIC}],varOmega:["03A9",{mathvariant:a.VARIANT.ITALIC}],beth:"2136",gimel:"2137",daleth:"2138",backprime:["2035",{variantForm:true}],hslash:["210F",{variantForm:true}],varnothing:["2205",{variantForm:true}],blacktriangle:"25B2",triangledown:"25BD",blacktriangledown:"25BC",square:"25A1",Box:"25A1",blacksquare:"25A0",lozenge:"25CA",Diamond:"25CA",blacklozenge:"29EB",circledS:["24C8",{mathvariant:a.VARIANT.NORMAL}],bigstar:"2605",sphericalangle:"2222",measuredangle:"2221",nexists:"2204",complement:"2201",mho:"2127",eth:["00F0",{mathvariant:a.VARIANT.NORMAL}],Finv:"2132",diagup:"2571",Game:"2141",diagdown:"2572",Bbbk:["006B",{mathvariant:a.VARIANT.DOUBLESTRUCK}],yen:"00A5",circledR:"00AE",checkmark:"2713",maltese:"2720"},mathchar0mo:{dotplus:"2214",ltimes:"22C9",smallsetminus:["2216",{variantForm:true}],rtimes:"22CA",Cap:"22D2",doublecap:"22D2",leftthreetimes:"22CB",Cup:"22D3",doublecup:"22D3",rightthreetimes:"22CC",barwedge:"22BC",curlywedge:"22CF",veebar:"22BB",curlyvee:"22CE",doublebarwedge:"2A5E",boxminus:"229F",circleddash:"229D",boxtimes:"22A0",circledast:"229B",boxdot:"22A1",circledcirc:"229A",boxplus:"229E",centerdot:"22C5",divideontimes:"22C7",intercal:"22BA",leqq:"2266",geqq:"2267",leqslant:"2A7D",geqslant:"2A7E",eqslantless:"2A95",eqslantgtr:"2A96",lesssim:"2272",gtrsim:"2273",lessapprox:"2A85",gtrapprox:"2A86",approxeq:"224A",lessdot:"22D6",gtrdot:"22D7",lll:"22D8",llless:"22D8",ggg:"22D9",gggtr:"22D9",lessgtr:"2276",gtrless:"2277",lesseqgtr:"22DA",gtreqless:"22DB",lesseqqgtr:"2A8B",gtreqqless:"2A8C",doteqdot:"2251",Doteq:"2251",eqcirc:"2256",risingdotseq:"2253",circeq:"2257",fallingdotseq:"2252",triangleq:"225C",backsim:"223D",thicksim:["223C",{variantForm:true}],backsimeq:"22CD",thickapprox:"2248",subseteqq:"2AC5",supseteqq:"2AC6",Subset:"22D0",Supset:"22D1",sqsubset:"228F",sqsupset:"2290",preccurlyeq:"227C",succcurlyeq:"227D",curlyeqprec:"22DE",curlyeqsucc:"22DF",precsim:"227E",succsim:"227F",precapprox:"2AB7",succapprox:"2AB8",vartriangleleft:"22B2",lhd:"22B2",vartriangleright:"22B3",rhd:"22B3",trianglelefteq:"22B4",unlhd:"22B4",trianglerighteq:"22B5",unrhd:"22B5",vDash:"22A8",Vdash:"22A9",Vvdash:"22AA",smallsmile:"2323",shortmid:["2223",{variantForm:true}],smallfrown:"2322",shortparallel:["2225",{variantForm:true}],bumpeq:"224F",between:"226C",Bumpeq:"224E",pitchfork:"22D4",varpropto:"221D",backepsilon:"220D",blacktriangleleft:"25C0",blacktriangleright:"25B6",therefore:"2234",because:"2235",eqsim:"2242",vartriangle:["25B3",{variantForm:true}],Join:"22C8",nless:"226E",ngtr:"226F",nleq:"2270",ngeq:"2271",nleqslant:["2A87",{variantForm:true}],ngeqslant:["2A88",{variantForm:true}],nleqq:["2270",{variantForm:true}],ngeqq:["2271",{variantForm:true}],lneq:"2A87",gneq:"2A88",lneqq:"2268",gneqq:"2269",lvertneqq:["2268",{variantForm:true}],gvertneqq:["2269",{variantForm:true}],lnsim:"22E6",gnsim:"22E7",lnapprox:"2A89",gnapprox:"2A8A",nprec:"2280",nsucc:"2281",npreceq:["22E0",{variantForm:true}],nsucceq:["22E1",{variantForm:true}],precneqq:"2AB5",succneqq:"2AB6",precnsim:"22E8",succnsim:"22E9",precnapprox:"2AB9",succnapprox:"2ABA",nsim:"2241",ncong:"2246",nshortmid:["2224",{variantForm:true}],nshortparallel:["2226",{variantForm:true}],nmid:"2224",nparallel:"2226",nvdash:"22AC",nvDash:"22AD",nVdash:"22AE",nVDash:"22AF",ntriangleleft:"22EA",ntriangleright:"22EB",ntrianglelefteq:"22EC",ntrianglerighteq:"22ED",nsubseteq:"2288",nsupseteq:"2289",nsubseteqq:["2288",{variantForm:true}],nsupseteqq:["2289",{variantForm:true}],subsetneq:"228A",supsetneq:"228B",varsubsetneq:["228A",{variantForm:true}],varsupsetneq:["228B",{variantForm:true}],subsetneqq:"2ACB",supsetneqq:"2ACC",varsubsetneqq:["2ACB",{variantForm:true}],varsupsetneqq:["2ACC",{variantForm:true}],leftleftarrows:"21C7",rightrightarrows:"21C9",leftrightarrows:"21C6",rightleftarrows:"21C4",Lleftarrow:"21DA",Rrightarrow:"21DB",twoheadleftarrow:"219E",twoheadrightarrow:"21A0",leftarrowtail:"21A2",rightarrowtail:"21A3",looparrowleft:"21AB",looparrowright:"21AC",leftrightharpoons:"21CB",rightleftharpoons:["21CC",{variantForm:true}],curvearrowleft:"21B6",curvearrowright:"21B7",circlearrowleft:"21BA",circlearrowright:"21BB",Lsh:"21B0",Rsh:"21B1",upuparrows:"21C8",downdownarrows:"21CA",upharpoonleft:"21BF",upharpoonright:"21BE",downharpoonleft:"21C3",restriction:"21BE",multimap:"22B8",downharpoonright:"21C2",leftrightsquigarrow:"21AD",rightsquigarrow:"21DD",leadsto:"21DD",dashrightarrow:"21E2",dashleftarrow:"21E0",nleftarrow:"219A",nrightarrow:"219B",nLeftarrow:"21CD",nRightarrow:"21CF",nleftrightarrow:"21AE",nLeftrightarrow:"21CE"},delimiter:{"\\ulcorner":"250C","\\urcorner":"2510","\\llcorner":"2514","\\lrcorner":"2518"},macros:{implies:["Macro","\\;\\Longrightarrow\\;"],impliedby:["Macro","\\;\\Longleftarrow\\;"]}});var c=a.mo.OPTYPES.REL;MathJax.Hub.Insert(a.mo.prototype,{OPTABLE:{infix:{"\u2322":c,"\u2323":c,"\u25B3":c,"\uE006":c,"\uE007":c,"\uE00C":c,"\uE00D":c,"\uE00E":c,"\uE00F":c,"\uE010":c,"\uE011":c,"\uE016":c,"\uE017":c,"\uE018":c,"\uE019":c,"\uE01A":c,"\uE01B":c,"\uE04B":c,"\uE04F":c}}})});MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function(){var a=MathJax.OutputJax["HTML-CSS"];var b=a.FONTDATA.VARIANT;if(a.fontInUse==="TeX"){b["-TeX-variant"]={fonts:["MathJax_AMS","MathJax_Main","MathJax_Size1"],remap:{8808:57356,8809:57357,8816:57361,8817:57358,10887:57360,10888:57359,8740:57350,8742:57351,8840:57366,8841:57368,8842:57370,8843:57371,10955:57367,10956:57369,988:57352,1008:57353}};if(a.msieIE6){MathJax.Hub.Insert(b["-TeX-variant"].remap,{8592:[58049,"-WinIE6"],8594:[58048,"-WinIE6"],8739:[58050,"-WinIE6"],8741:[58051,"-WinIE6"],8764:[58052,"-WinIE6"],9651:[58067,"-WinIE6"]})}}if(a.fontInUse==="STIX"){MathJax.Hub.Register.StartupHook("TeX Jax Ready",function(){var c=MathJax.InputJax.TeX.Definitions;c.mathchar0mi.varnothing="2205";c.mathchar0mi.hslash="210F";c.mathchar0mi.blacktriangle="25B4";c.mathchar0mi.blacktriangledown="25BE";c.mathchar0mi.square="25FB";c.mathchar0mi.blacksquare="25FC";c.mathchar0mi.vartriangle=["25B3",{mathsize:"71%"}];c.mathchar0mi.triangledown=["25BD",{mathsize:"71%"}];c.mathchar0mo.blacktriangleleft="25C2";c.mathchar0mo.blacktriangleright="25B8";c.mathchar0mo.smallsetminus="2216";MathJax.Hub.Insert(b["-STIX-variant"],{remap:{10887:57360,10888:57359,8816:57361,8817:57358,8928:57419,8929:57423,8840:57366,8841:57368}})})}MathJax.Hub.Startup.signal.Post("TeX AMSsymbols Ready")});MathJax.Ajax.loadComplete("[MathJax]/extensions/TeX/AMSsymbols.js");
+
+MathJax.Ajax.loadComplete("[MathJax]/config/TeX-AMS_HTML.js");
diff --git a/static/MathJax/default.js b/static/MathJax/default.js
new file mode 100644
index 0000000..aa6a30d
--- /dev/null
+++ b/static/MathJax/default.js
@@ -0,0 +1,606 @@
+/*************************************************************
+ *
+ * MathJax/config/default.js
+ *
+ * This configuration file is loaded when you load MathJax
+ * via <script src="MathJax.js?config=default"></script>
+ *
+ * Use it to customize the MathJax settings. See comments below.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * Copyright (c) 2009-2011 Design Science, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+/*
+ * This file lists most, but not all, of the options that can be set for
+ * MathJax and its various components. Some additional options are
+ * available, however, and are listed in the various links at:
+ *
+ * http://www.mathjax.org/resources/docs/?configuration.html#configuration-options-by-component
+ *
+ * You can add these to the configuration object below if you
+ * want to change them from their default values.
+ */
+
+MathJax.Hub.Config({
+
+ //
+ // A comma-separated list of configuration files to load
+ // when MathJax starts up. E.g., to define local macros, etc.
+ // The default directory is the MathJax/config directory.
+ //
+ // Example: config: ["local/local.js"],
+ // Example: config: ["local/local.js","MMLtoHTML.js"],
+ //
+ config: ["TeX-AMS-MML_HTMLorMML.js"],
+
+ //
+ // A comma-separated list of CSS stylesheet files to be loaded
+ // when MathJax starts up. The default directory is the
+ // MathJax/config directory.
+ //
+ // Example: styleSheets: ["MathJax.css"],
+ //
+ styleSheets: [],
+
+ //
+ // Styles to be defined dynamically at startup time.
+ //
+ // Example:
+ // styles: {
+ // ".MathJax .merror": {
+ // color: "blue",
+ // "background-color": "green"
+ // }
+ // },
+ //
+ styles: {},
+
+ //
+ // A comma-separated list of input and output jax to initialize at startup.
+ // Their main code is loaded only when they are actually used, so it is not
+ // inefficient to include jax that may not actually be used on the page. These
+ // are found in the MathJax/jax directory.
+ //
+ jax: ["input/TeX","output/HTML-CSS"],
+
+ //
+ // A comma-separated list of extensions to load at startup. The default
+ // directory is MathJax/extensions.
+ //
+ // Example: extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
+ //
+ extensions: ["tex2jax.js"],
+
+ //
+ // Patterns to remove from before and after math script tags. If you are not
+ // using one of the preprocessors (e.g., tex2jax), you need to insert something
+ // extra into your HTML file in order to avoid a bug in Internet Explorer. IE
+ // removes spaces from the DOM that it thinks are redundent, and since a SCRIPT
+ // tag usually doesn't add content to the page, if there is a space before and after
+ // a MathJax SCRIPT tag, IE will remove the first space. When MathJax inserts
+ // the typeset mathematics, this means there will be no space before it and the
+ // preceeding text. In order to avoid this, you should include some "guard characters"
+ // before or after the math SCRIPT tag; define the patterns you want to use below.
+ // Note that these are used as regular expressions, so you will need to quote
+ // special characters. Furthermore, since they are javascript strings, you must
+ // quote javascript special characters as well. So to obtain a backslash, you must
+ // use \\ (doubled for javascript). For example, "\\[" is the pattern \[ in the
+ // regular expression. That means that if you want an actual backslash in your
+ // guard characters, you need to use "\\\\" in order to get \\ in the regular
+ // expression, and \ in the actual text. If both preJax and postJax are defined,
+ // both must be present in order to be removed.
+ //
+ // See also the preRemoveClass comments below.
+ //
+ // Example:
+ // preJax: "\\\\\\\\", // makes a double backslash the preJax text
+ // or
+ // preJax: "\\[\\[", // jax scripts must be enclosed in double brackets
+ // postJax: "\\]\\]",
+ //
+ preJax: null,
+ postJax: null,
+
+ //
+ // The CSS class for a math preview to be removed preceeding a MathJax
+ // SCRIPT tag. If the tag just before the MathJax SCRIPT tag is of this
+ // class, its contents are removed when MathJax processes the SCRIPT
+ // tag. This allows you to include a math preview in a form that will
+ // be displayed prior to MathJax performing its typesetting. It also
+ // avoids the Internet Explorer space-removal bug, and can be used in
+ // place of preJax and postJax if that is more convenient.
+ //
+ // For example
+ //
+ // <span class="MathJax_Preview">[math]</span><script type="math/tex">...</script>
+ //
+ // would display "[math]" in place of the math until MathJax is able to typeset it.
+ //
+ preRemoveClass: "MathJax_Preview",
+
+ //
+ // This value controls whether the "Processing Math: nn%" message are displayed
+ // in the lower left-hand corner. Set to "false" to prevent those messages (though
+ // file loading and other messages will still be shown).
+ //
+ showProcessingMessages: true,
+
+ //
+ // This value controls the verbosity of the messages in the lower left-hand corner.
+ // Set it to "none" to eliminate all messages, or set it to "simple" to show
+ // "Loading..." and "Processing..." rather than showing the full file name and the
+ // percentage of the mathematics processed.
+ //
+ messageStyle: "normal",
+
+ //
+ // These two parameters control the alignment and shifting of displayed equations.
+ // The first can be "left", "center", or "right", and determines the alignment of
+ // displayed equations. When the alignment is not "center", the second determines
+ // an indentation from the left or right side for the displayed equations.
+ //
+ displayAlign: "center",
+ displayIndent: "0em",
+
+ //
+ // Normally MathJax will perform its starup commands (loading of
+ // configuration, styles, jax, and so on) as soon as it can. If you
+ // expect to be doing additional configuration on the page, however, you
+ // may want to have it wait until the page's onload hander is called. If so,
+ // set this to "onload".
+ //
+ delayStartupUntil: "none",
+
+ //
+ // Normally MathJax will typeset the mathematics on the page as soon as
+ // the page is loaded. If you want to delay that process, in which case
+ // you will need to call MathJax.Hub.Typeset() yourself by hand, set
+ // this value to true.
+ //
+ skipStartupTypeset: false,
+
+ //
+ // A list of element ID's that are the ones to process for mathematics
+ // when any of the Hub typesetting calls (Typeset, Process, Update, etc)
+ // are called with no element specified. This lets you restrict the
+ // processing to particular containers rather than scanning the entire
+ // document for mathematics. If none are supplied, the entire document
+ // is processed.
+ //
+ elements: [],
+
+ //============================================================================
+ //
+ // These parameters control the tex2jax preprocessor (when you have included
+ // "tex2jax.js" in the extensions list above).
+ //
+ tex2jax: {
+
+ //
+ // The delimiters that surround in-line math expressions. The first in each
+ // pair is the initial delimiter and the second is the terminal delimiter.
+ // Comment out any that you don't want, but be sure there is no extra
+ // comma at the end of the last item in the list -- some browsers won't
+ // be able to handle that.
+ //
+ inlineMath: [
+ ['$$','$$'], // uncomment this for standard TeX math delimiters
+ ['\\(','\\)']
+ ],
+
+ //
+ // The delimiters that surround displayed math expressions. The first in each
+ // pair is the initial delimiter and the second is the terminal delimiter.
+ // Comment out any that you don't want, but be sure there is no extra
+ // comma at the end of the last item in the list -- some browsers won't
+ // be able to handle that.
+ //
+ displayMath: [
+ ['$$','$$'],
+ ['\\[','\\]']
+ ],
+
+ //
+ // This array lists the names of the tags whose contents should not be
+ // processed by tex2jax (other than to look for ignore/process classes
+ // as listed below). You can add to (or remove from) this list to prevent
+ // MathJax from processing mathematics in specific contexts.
+ //
+ skipTags: ["script","noscript","style","textarea","pre","code"],
+
+ //
+ // This is the class name used to mark elements whose contents should
+ // not be processed by tex2jax (other than to look for the
+ // processClass pattern below). Note that this is a regular
+ // expression, and so you need to be sure to quote any regexp special
+ // characters. The pattern is automatically preceeded by '(^| )(' and
+ // followed by ')( |$)', so your pattern will have to match full words
+ // in the class name. Assigning an element this class name will
+ // prevent `tex2jax` from processing its contents.
+ //
+ ignoreClass: "tex2jax_ignore",
+
+ //
+ // This is the class name used to mark elements whose contents SHOULD
+ // be processed by tex2jax. This is used to turn on processing within
+ // tags that have been marked as ignored or skipped above. Note that
+ // this is a regular expression, and so you need to be sure to quote
+ // any regexp special characters. The pattern is automatically
+ // preceeded by '(^| )(' and followed by ')( |$)', so your pattern
+ // will have to match full words in the class name. Use this to
+ // restart processing within an element that has been marked as
+ // ignored above.
+ //
+ processClass: "tex2jax_process",
+
+ //
+ // Set to "true" to allow \$ to produce a dollar without starting in-line
+ // math mode. If you uncomment the ['$','$'] line above, you should change
+ // this to true so that you can insert plain dollar signs into your documents
+ //
+ processEscapes: false,
+
+ //
+ // Controls whether tex2jax processes LaTeX environments outside of math
+ // mode. Set to "false" to prevent processing of environments except within
+ // math mode.
+ //
+ processEnvironments: true,
+
+ //
+ // Controls whether tex2jax inserts MathJax_Preview spans to make a
+ // preview available, and what preview to use, when it locates in-line
+ // and display mathetics on the page. The default is "TeX", which
+ // means use the TeX code as the preview (until it is processed by
+ // MathJax). Set to "none" to prevent the previews from being
+ // inserted (the math will simply disappear until it is typeset). Set
+ // to an array containing the description of an HTML snippet in order
+ // to use the same preview for all equations on the page (e.g., you
+ // could have it say "[math]" or load an image).
+ //
+ // E.g., preview: ["[math]"],
+ // or preview: [["img",{src: "http://myserver.com/images/mypic.jpg"}]]
+ //
+ preview: "TeX"
+
+ },
+
+ //============================================================================
+ //
+ // These parameters control the mml2jax preprocessor (when you have included
+ // "mml2jax.js" in the extensions list above).
+ //
+ mml2jax: {
+
+ //
+ // Controls whether mml2jax inserts MathJax_Preview spans to make a
+ // preview available, and what preview to use, whrn it locates
+ // mathematics on the page. The default is "alttext", which means use
+ // the <math> tag's alttext attribute as the preview (until it is
+ // processed by MathJax), if the tag has one. Set to "none" to
+ // prevent the previews from being inserted (the math will simply
+ // disappear until it is typeset). Set to an array containing the
+ // description of an HTML snippet in order to use the same preview for
+ // all equations on the page (e.g., you could have it say "[math]" or
+ // load an image).
+ //
+ // E.g., preview: ["[math]"],
+ // or preview: [["img",{src: "http://myserver.com/images/mypic.jpg"}]]
+ //
+ preview: "alttext"
+
+ },
+
+ //============================================================================
+ //
+ // These parameters control the jsMath2jax preprocessor (when you have included
+ // "jsMath2jax.js" in the extensions list above).
+ //
+ jsMath2jax: {
+
+ //
+ // Controls whether jsMath2jax inserts MathJax_Preview spans to make a
+ // preview available, and what preview to use, when it locates
+ // mathematics on the page. The default is "TeX", which means use the
+ // TeX code as the preview (until it is processed by MathJax). Set to
+ // "none" to prevent the previews from being inserted (the math will
+ // simply disappear until it is typeset). Set to an array containing
+ // the description of an HTML snippet in order to use the same preview
+ // for all equations on the page (e.g., you could have it say "[math]"
+ // or load an image).
+ //
+ // E.g., preview: ["[math]"],
+ // or preview: [["img",{src: "http://myserver.com/images/mypic.jpg"}]]
+ //
+ preview: "TeX"
+
+ },
+
+ //============================================================================
+ //
+ // These parameters control the TeX input jax.
+ //
+ TeX: {
+
+ //
+ // This specifies the side on which \tag{} macros will place the tags.
+ // Set to "left" to place on the left-hand side.
+ //
+ TagSide: "right",
+
+ //
+ // This is the amound of indentation (from right or left) for the tags.
+ //
+ TagIndent: ".8em",
+
+ //
+ // This is the width to use for the multline environment
+ //
+ MultLineWidth: "85%",
+
+ //
+ // List of macros to define. These are of the form
+ // name: value
+ // where 'value' is the replacement text for the macro \name.
+ // The 'value' can also be [value,n] where 'value' is the replacement
+ // text and 'n' is the number of parameters for the macro.
+ // Note that backslashes must be doubled in the replacement string.
+ //
+ // E.g.,
+ //
+ // Macros: {
+ // RR: '{\\bf R}',
+ // bold: ['{\\bf #1}', 1]
+ // }
+ //
+ Macros: {}
+
+ },
+
+ //============================================================================
+ //
+ // These parameters control the MathML inupt jax.
+ //
+ MathML: {
+ //
+ // This specifies whether to use TeX spacing or MathML spacing when the
+ // HTML-CSS output jax is used.
+ //
+ useMathMLspacing: false
+ },
+
+ //============================================================================
+ //
+ // These parameters control the HTML-CSS output jax.
+ //
+ "HTML-CSS": {
+
+ //
+ // This controls the global scaling of mathematics as compared to the
+ // surrounding text. Values between 100 and 133 are usually good choices.
+ //
+ scale: 100,
+
+ //
+ // This is a list of the fonts to look for on a user's computer in
+ // preference to using MathJax's web-based fonts. These must
+ // correspond to directories available in the jax/output/HTML-CSS/fonts
+ // directory, where MathJax stores data about the characters available
+ // in the fonts. Set this to ["TeX"], for example, to prevent the
+ // use of the STIX fonts, or set it to an empty list, [], if
+ // you want to force MathJax to use web-based or image fonts.
+ //
+ availableFonts: ["STIX","TeX"],
+
+ //
+ // This is the preferred font to use when more than one of those
+ // listed above is available.
+ //
+ preferredFont: "TeX",
+
+ //
+ // This is the web-based font to use when none of the fonts listed
+ // above are available on the user's computer. Note that currently
+ // only the TeX font is available in a web-based form. Set this to
+ //
+ // webFont: null,
+ //
+ // if you want to prevent the use of web-based fonts.
+ //
+ webFont: "TeX",
+
+ //
+ // This is the font to use for image fallback mode (when none of the
+ // fonts listed above are available and the browser doesn't support
+ // web-fonts via the @font-face CSS directive). Note that currently
+ // only the TeX font is available as an image font. Set this to
+ //
+ // imageFont: null,
+ //
+ // if you want to prevent the use of image fonts (e.g., you have not
+ // installed the image fonts on your server). In this case, only
+ // browsers that support web-based fonts will be able to view your pages
+ // without having the fonts installed on the client computer. The browsers
+ // that support web-based fonts include: IE6 and later, Chrome, Safari3.1
+ // and above, Firefox3.5 and later, and Opera10 and later. Note that
+ // Firefox3.0 is NOT on this list, so without image fonts, FF3.0 users
+ // will be required to to download and install either the STIX fonts or the
+ // MathJax TeX fonts.
+ //
+ imageFont: "TeX",
+
+ //
+ // This is the font-family CSS value used for characters that are not
+ // in the selected font (e.g., for web-based fonts, this is where to
+ // look for characters not included in the MathJax_* fonts). IE will
+ // stop looking after the first font that exists on the system (even
+ // if it doesn't contain the needed character), so order these carefully.
+ //
+ undefinedFamily: "STIXGeneral,'Arial Unicode MS',serif",
+
+ //
+ // This controls whether the MathJax contextual menu will be available
+ // on the mathematics in the page. If true, then right-clicking (on
+ // the PC) or control-clicking (on the Mac) will produce a MathJax
+ // menu that allows you to get the source of the mathematics in
+ // various formats, change the size of the mathematics relative to the
+ // surrounding text, and get information about MathJax.
+ //
+ // Set this to false to disable the menu. When true, the MathMenu
+ // items below configure the actions of the menu.
+ //
+ showMathMenu: true,
+
+ //
+ // This allows you to define or modify the styles used to display
+ // various math elements created by MathJax.
+ //
+ // Example:
+ // styles: {
+ // ".MathJax_Preview": {
+ // "font-size": "80%", // preview uses a smaller font
+ // color: "red" // and is in red
+ // }
+ // }
+ //
+ styles: {},
+
+ //
+ // Configuration for <maction> tooltips
+ // (see also the #MathJax_Tooltip CSS in MathJax/jax/output/HTML-CSS/config.js,
+ // which can be overriden using the styles values above).
+ //
+ tooltip: {
+ delayPost: 600, // milliseconds delay before tooltip is posted after mouseover
+ delayClear: 600, // milliseconds delay before tooltip is cleared after mouseout
+ offsetX: 10, offsetY: 5 // pixels to offset tooltip from mouse position
+ }
+ },
+
+ //============================================================================
+ //
+ // These parameters control the NativeMML output jax.
+ //
+ NativeMML: {
+
+ //
+ // This controls the global scaling of mathematics as compared to the
+ // surrounding text. Values between 100 and 133 are usually good choices.
+ //
+ scale: 100,
+
+ //
+ // This controls whether the MathJax contextual menu will be available
+ // on the mathematics in the page. If true, then right-clicking (on
+ // the PC) or control-clicking (on the Mac) will produce a MathJax
+ // menu that allows you to get the source of the mathematics in
+ // various formats, change the size of the mathematics relative to the
+ // surrounding text, and get information about MathJax.
+ //
+ // Set this to false to disable the menu. When true, the MathMenu
+ // items below configure the actions of the menu.
+ //
+ // There is a separate setting for MSIE, since the code to handle that
+ // is a bit delicate; if it turns out to have unexpected consequences,
+ // you can turn it off without turing off other browser support.
+ //
+ showMathMenu: true,
+ showMathMenuMSIE: true,
+
+ //
+ // This allows you to define or modify the styles used to display
+ // various math elements created by MathJax.
+ //
+ // Example:
+ // styles: {
+ // ".MathJax_MathML": {
+ // color: "red" // MathML is in red
+ // }
+ // }
+ //
+ styles: {}
+ },
+
+ //============================================================================
+ //
+ // These parameters control the contextual menus that are available on the
+ // mathematics within the page (provided the showMathMenu value is true above).
+ //
+ MathMenu: {
+ //
+ // This is the hover delay for the display of submenus in the
+ // contextual menu. When the mouse is still over a submenu label for
+ // this long, the menu will appear. (The menu also will appear if you
+ // click on the label.) It is in milliseconds.
+ //
+ delay: 400,
+
+ //
+ // This is the URL for the MathJax Help menu item.
+ //
+ helpURL: "http://www.mathjax.org/help/user/",
+
+ //
+ // These control whether the "Math Renderer", "Font Preferences",
+ // and "Contextual Menu" submenus will be displayed or not.
+ //
+ showRenderer: true,
+ showFontMenu: false,
+ showContext: false,
+
+ //
+ // These are the settings for the Show Source window. The initial
+ // width and height will be reset after the source is shown in an
+ // attempt to make the window fit the output better.
+ //
+ windowSettings: {
+ status: "no", toolbar: "no", locationbar: "no", menubar: "no",
+ directories: "no", personalbar: "no", resizable: "yes", scrollbars: "yes",
+ width: 100, height: 50
+ },
+
+ //
+ // This allows you to change the CSS that controls the menu
+ // appearance. See the extensions/MathMenu.js file for details
+ // of the default settings.
+ //
+ styles: {}
+
+ },
+
+ //============================================================================
+ //
+ // These parameters control the MMLorHTML configuration file.
+ // NOTE: if you add MMLorHTML.js to the config array above,
+ // you must REMOVE the output jax from the jax array.
+ //
+ MMLorHTML: {
+ //
+ // The output jax that is to be preferred when both are possible
+ // (set to "MML" for native MathML, "HTML" for MathJax's HTML-CSS output jax).
+ //
+ prefer: {
+ MSIE: "MML",
+ Firefox: "MML",
+ Opera: "HTML",
+ other: "HTML"
+ }
+ }
+});
+
+MathJax.Ajax.loadComplete("[MathJax]/config/default.js");
diff --git a/static/MathJax/extensions/FontWarnings.js b/static/MathJax/extensions/FontWarnings.js
new file mode 100644
index 0000000..b948d92
--- /dev/null
+++ b/static/MathJax/extensions/FontWarnings.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/extensions/FontWarnings.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(d,g){var f="1.1";var b=d.CombineConfig("FontWarnings",{messageStyle:{position:"fixed",bottom:"4em",left:"3em",width:"40em",border:"3px solid #880000","background-color":"#E0E0E0",padding:"1em","font-size":"small","white-space":"normal","border-radius":".75em","-webkit-border-radius":".75em","-moz-border-radius":".75em","-khtml-border-radius":".75em","box-shadow":"4px 4px 10px #AAAAAA","-webkit-box-shadow":"4px 4px 10px #AAAAAA","-moz-box-shadow":"4px 4px 10px #AAAAAA","-khtml-box-shadow":"4px 4px 10px #AAAAAA",filter:"progid:DXImageTransform.Microsoft.dropshadow(OffX=3, OffY=3, Color='gray', Positive='true')"},Message:{webFont:[["closeBox"],"MathJax is using web-based fonts to display the mathematics ","on this page. These take time to download, so the page would","render faster if you installed math fonts directly in your ","system's font folder.",["fonts"]],imageFonts:[["closeBox"],"MathJax is using its image fonts rather than local or web-based fonts. ","This will render slower than usual, and the mathematics may not print ","at the full resolution of your printer.",["fonts"],["webfonts"]],noFonts:[["closeBox"],"MathJax is unable to locate a font to use to display ","its mathematics, and image fonts are not available, so it ","is falling back on generic unicode characters in hopes that ","your browser will be able to display them. Some characters ","may not show up properly, or possibly not at all.",["fonts"],["webfonts"]]},HTML:{closeBox:[["div",{style:{position:"absolute",overflow:"hidden",top:".1em",right:".1em",border:"1px outset",width:"1em",height:"1em","text-align":"center",cursor:"pointer","background-color":"#EEEEEE",color:"#606060","border-radius":".5em","-webkit-border-radius":".5em","-moz-border-radius":".5em","-khtml-border-radius":".5em"},onclick:function(){if(c.div&&c.fade===0){if(c.timer){clearTimeout(c.timer)}c.div.style.display="none"}}},[["span",{style:{position:"relative",bottom:".2em"}},["x"]]]]],webfonts:[["p"],"Most modern browsers allow for fonts to be downloaded over the web. ","Updating to a more recent version of your browser (or changing browsers) ","could improve the quality of the mathematics on this page."],fonts:[["p"],"MathJax can use either the ",["a",{href:"http://www.stixfonts.org/",target:"_blank"},"STIX fonts"]," or the ",["a",{href:"http://www.mathjax.org/help/fonts/",target:"_blank"},["MathJax TeX fonts"]],". Download and install either one to improve your MathJax experience."],STIXfonts:[["p"],"This page is designed to use the ",["a",{href:"http://www.stixfonts.org/",target:"_blank"},"STIX fonts"],". Download and install those fonts to improve your MathJax experience."],TeXfonts:[["p"],"This page is designed to use the ",["a",{href:"http://www.mathjax.org/help/fonts/",target:"_blank"},["MathJax TeX fonts"]],". Download and install those fonts to improve your MathJax experience."]},removeAfter:12*1000,fadeoutSteps:10,fadeoutTime:1.5*1000});if(MathJax.Hub.Browser.isIE9&&document.documentMode>=9){delete b.messageStyle.filter}var c={div:null,fade:0};var a=function(k){if(c.div){return}var h=MathJax.OutputJax["HTML-CSS"],l=document.body;if(d.Browser.isMSIE){if(b.messageStyle.position==="fixed"){MathJax.Message.Init();l=document.getElementById("MathJax_MSIE_Frame");b.messageStyle.position="absolute"}}else{delete b.messageStyle.filter}b.messageStyle.maxWidth=(document.body.clientWidth-75)+"px";var j=0;while(j<k.length){if(k[j] instanceof Array&&b.HTML[k[j][0]]){k.splice.apply(k,[j,1].concat(b.HTML[k[j][0]]))}else{j++}}c.div=h.addElement(l,"div",{id:"MathJax_FontWarning",style:b.messageStyle},k);if(b.removeAfter){d.Register.StartupHook("End",function(){c.timer=setTimeout(e,b.removeAfter)})}g.Cookie.Set("fontWarn",{warned:true})};var e=function(){c.fade++;if(c.timer){delete c.timer}if(c.fade<b.fadeoutSteps){var h=1-c.fade/b.fadeoutSteps;c.div.style.opacity=h;c.div.style.filter="alpha(opacity="+Math.floor(100*h)+")";setTimeout(e,b.fadeoutTime/b.fadeoutSteps)}else{c.div.style.display="none"}};if(!g.Cookie.Get("fontWarn").warned){d.Startup.signal.Interest(function(k){if(k.match(/HTML-CSS Jax - /)&&!c.div){var h=MathJax.OutputJax["HTML-CSS"],l=h.config.availableFonts,j;var i=(l&&l.length);if(!i){b.HTML.fonts=[""]}else{if(l.length===1){b.HTML.fonts=b.HTML[l[0]+"fonts"]}}if(h.allowWebFonts){b.HTML.webfonts=[""]}if(k.match(/- Web-Font/)){if(i){j="webFont"}}else{if(k.match(/- using image fonts/)){j="imageFonts"}else{if(k.match(/- no valid font/)){j="noFonts"}}}if(j&&b.Message[j]){a(b.Message[j])}}})}})(MathJax.Hub,MathJax.HTML);MathJax.Ajax.loadComplete("[MathJax]/extensions/FontWarnings.js");
+
diff --git a/static/MathJax/extensions/MathMenu.js b/static/MathJax/extensions/MathMenu.js
new file mode 100644
index 0000000..d2c068e
--- /dev/null
+++ b/static/MathJax/extensions/MathMenu.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/extensions/MathMenu.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(b,c,f){var k="1.1.4";MathJax.Extension.MathMenu={version:k};var i=b.Browser.isPC,g=b.Browser.isMSIE;var e=(i?null:"5px");var j=b.CombineConfig("MathMenu",{delay:150,helpURL:"http://www.mathjax.org/help/user/",showRenderer:true,showFontMenu:false,showContext:false,windowSettings:{status:"no",toolbar:"no",locationbar:"no",menubar:"no",directories:"no",personalbar:"no",resizable:"yes",scrollbars:"yes",width:100,height:50},styles:{"#MathJax_About":{position:"fixed",left:"50%",width:"auto","text-align":"center",border:"3px outset",padding:"1em 2em","background-color":"#DDDDDD",color:"black",cursor:"default","font-family":"message-box","font-size":"120%","font-style":"normal","text-indent":0,"text-transform":"none","line-height":"normal","letter-spacing":"normal","word-spacing":"normal","word-wrap":"normal","white-space":"nowrap","float":"none","z-index":201,"border-radius":"15px","-webkit-border-radius":"15px","-moz-border-radius":"15px","-khtml-border-radius":"15px","box-shadow":"0px 10px 20px #808080","-webkit-box-shadow":"0px 10px 20px #808080","-moz-box-shadow":"0px 10px 20px #808080","-khtml-box-shadow":"0px 10px 20px #808080",filter:"progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color='gray', Positive='true')"},".MathJax_Menu":{position:"absolute","background-color":"white",color:"black",width:"auto",padding:(i?"2px":"5px 0px"),border:"1px solid #CCCCCC",margin:0,cursor:"default",font:"menu","text-align":"left","text-indent":0,"text-transform":"none","line-height":"normal","letter-spacing":"normal","word-spacing":"normal","word-wrap":"normal","white-space":"nowrap","float":"none","z-index":201,"border-radius":e,"-webkit-border-radius":e,"-moz-border-radius":e,"-khtml-border-radius":e,"box-shadow":"0px 10px 20px #808080","-webkit-box-shadow":"0px 10px 20px #808080","-moz-box-shadow":"0px 10px 20px #808080","-khtml-box-shadow":"0px 10px 20px #808080",filter:"progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color='gray', Positive='true')"},".MathJax_MenuItem":{padding:(i?"2px 2em":"1px 2em"),background:"transparent"},".MathJax_MenuTitle":{"background-color":"#CCCCCC",margin:(i?"-1px -1px 1px -1px":"-5px 0 0 0"),"text-align":"center","font-style":"italic","font-size":"80%",color:"#444444",padding:"2px 0",overflow:"hidden"},".MathJax_MenuArrow":{position:"absolute",right:".5em",color:"#666666","font-family":(g?"'Arial unicode MS'":null)},".MathJax_MenuActive .MathJax_MenuArrow":{color:"white"},".MathJax_MenuCheck":{position:"absolute",left:".7em","font-family":(g?"'Arial unicode MS'":null)},".MathJax_MenuRadioCheck":{position:"absolute",left:(i?"1em":".7em")},".MathJax_MenuLabel":{padding:(i?"2px 2em 4px 1.33em":"1px 2em 3px 1.33em"),"font-style":"italic"},".MathJax_MenuRule":{"border-top":(i?"1px solid #CCCCCC":"1px solid #DDDDDD"),margin:(i?"4px 1px 0px":"4px 3px")},".MathJax_MenuDisabled":{color:"GrayText"},".MathJax_MenuActive":{"background-color":(i?"Highlight":"#606872"),color:(i?"HighlightText":"white")}}});var d=function(l){if(!l){l=window.event}if(l){if(l.preventDefault){l.preventDefault()}if(l.stopPropagation){l.stopPropagation()}l.cancelBubble=true;l.returnValue=false}return false};var a=MathJax.Menu=MathJax.Object.Subclass({version:k,items:[],posted:false,title:null,margin:5,Init:function(l){this.items=[].slice.call(arguments,0)},With:function(l){if(l){b.Insert(this,l)}return this},Post:function(n,v){if(!n){n=window.event}var t=(!this.title?null:[["div",{className:"MathJax_MenuTitle"},[this.title]]]);var l=document.getElementById("MathJax_MenuFrame");if(!l){l=a.Background(this)}var o=c.addElement(l,"div",{onmouseup:a.Mouseup,ondblclick:this.False,ondragstart:this.False,onselectstart:this.False,oncontextmenu:this.False,menuItem:this,className:"MathJax_Menu"},t);for(var q=0,p=this.items.length;q<p;q++){this.items[q].Create(o)}this.posted=true;o.style.width=(o.offsetWidth+2)+"px";var u=n.pageX,s=n.pageY;if(!u&&!s){u=n.clientX+document.body.scrollLeft+document.documentElement.scrollLeft;s=n.clientY+document.body.scrollTop+document.documentElement.scrollTop}if(!v){if(u+o.offsetWidth>document.body.offsetWidth-this.margin){u=document.body.offsetWidth-o.offsetWidth-this.margin}a.skipUp=true}else{var r="left",w=v.offsetWidth;u=v.offsetWidth-2;s=0;while(v&&v!==l){u+=v.offsetLeft;s+=v.offsetTop;v=v.parentNode}if(u+o.offsetWidth>document.body.offsetWidth-this.margin){r="right";u=Math.max(this.margin,u-w-o.offsetWidth+6)}if(!i){o.style["borderRadiusTop"+r]=0;o.style["WebkitBorderRadiusTop"+r]=0;o.style["MozBorderRadiusTop"+r]=0;o.style["KhtmlBorderRadiusTop"+r]=0}}o.style.left=u+"px";o.style.top=s+"px";if(document.selection&&document.selection.empty){document.selection.empty()}return this.False(n)},Remove:function(l,m){var n=document.getElementById("MathJax_MenuFrame");if(n){n.parentNode.removeChild(n);if(this.msieBackgroundBug){detachEvent("onresize",a.Resize)}}},Mouseup:function(l,m){if(a.skipUp){delete a.skipUp}else{this.Remove(l,m)}},False:d},{config:j,div:null,Remove:function(l){a.Event(l,this,"Remove")},Mouseover:function(l){a.Event(l,this,"Mouseover")},Mouseout:function(l){a.Event(l,this,"Mouseout")},Mousedown:function(l){a.Event(l,this,"Mousedown")},Mouseup:function(l){a.Event(l,this,"Mouseup")},Mousemove:function(l){a.Event(l,this,"Mousemove")},Event:function(n,o,l){if(!n){n=window.event}var m=o.menuItem;if(m&&m[l]){return m[l](n,o)}return null},BGSTYLE:{position:"absolute",left:0,top:0,"z-index":200,width:"100%",height:"100%",border:0,padding:0,margin:0},Background:function(m){var n=c.addElement(document.body,"div",{style:this.BGSTYLE,id:"MathJax_MenuFrame"},[["div",{style:this.BGSTYLE,menuItem:m,onmousedown:this.Remove}]]);var l=n.firstChild;if(m.msieBackgroundBug){l.style.backgroundColor="white";l.style.filter="alpha(opacity=0)";n.width=n.height=0;this.Resize();attachEvent("onresize",this.Resize)}else{l.style.position="fixed"}return n},Resize:function(){setTimeout(a.SetWH,0)},SetWH:function(){var l=document.getElementById("MathJax_MenuFrame");if(l){l=l.firstChild;l.style.width=l.style.height="1px";l.style.width=document.body.scrollWidth+"px";l.style.height=document.body.scrollHeight+"px"}},saveCookie:function(){c.Cookie.Set("menu",this.cookie)},getCookie:function(){this.cookie=c.Cookie.Get("menu")}});var h=a.ITEM=MathJax.Object.Subclass({name:"",Create:function(m){if(!this.hidden){var l={onmouseover:a.Mouseover,onmouseout:a.Mouseout,onmouseup:a.Mouseup,onmousedown:this.False,ondragstart:this.False,onselectstart:this.False,onselectend:this.False,className:"MathJax_MenuItem",menuItem:this};if(this.disabled){l.className+=" MathJax_MenuDisabled"}c.addElement(m,"div",l,this.Label(l,m))}},Mouseover:function(q,s){if(!this.disabled){this.Activate(s)}if(!this.menu||!this.menu.posted){var r=document.getElementById("MathJax_MenuFrame").childNodes,n=s.parentNode.childNodes;for(var o=0,l=n.length;o<l;o++){var p=n[o].menuItem;if(p&&p.menu&&p.menu.posted){p.Deactivate(n[o])}}l=r.length-1;while(l>=0&&s.parentNode.menuItem!==r[l].menuItem){r[l].menuItem.posted=false;r[l].parentNode.removeChild(r[l]);l--}if(this.Timer){this.Timer(q,s)}}},Mouseout:function(l,m){if(!this.menu||!this.menu.posted){this.Deactivate(m)}if(this.timer){clearTimeout(this.timer);delete this.timer}},Mouseup:function(l,m){return this.Remove(l,m)},Remove:function(l,m){m=m.parentNode.menuItem;return m.Remove(l,m)},Activate:function(l){this.Deactivate(l);l.className+=" MathJax_MenuActive"},Deactivate:function(l){l.className=l.className.replace(/ MathJax_MenuActive/,"")},With:function(l){if(l){b.Insert(this,l)}return this},False:d});a.ITEM.COMMAND=a.ITEM.Subclass({action:function(){},Init:function(l,n,m){this.name=l;this.action=n;this.With(m)},Label:function(l,m){return[this.name]},Mouseup:function(l,m){if(!this.disabled){this.Remove(l,m);this.action.call(this,l)}return this.False(l)}});a.ITEM.SUBMENU=a.ITEM.Subclass({menu:null,marker:(i&&!b.Browser.isSafari?"\u25B6":"\u25B8"),Init:function(l,n){this.name=l;var m=1;if(!(n instanceof a.ITEM)){this.With(n),m++}this.menu=a.apply(a,[].slice.call(arguments,m))},Label:function(l,m){l.onmousemove=a.Mousemove;this.menu.posted=false;return[this.name+" ",["span",{className:"MathJax_MenuArrow"},[this.marker]]]},Timer:function(l,m){if(this.timer){clearTimeout(this.timer)}l={clientX:l.clientX,clientY:l.clientY};this.timer=setTimeout(MathJax.Callback(["Mouseup",this,l,m]),j.delay)},Mouseup:function(n,p){if(!this.disabled){if(!this.menu.posted){if(this.timer){clearTimeout(this.timer);delete this.timer}this.menu.Post(n,p)}else{var o=document.getElementById("MathJax_MenuFrame").childNodes,l=o.length-1;while(l>=0){var q=o[l];q.menuItem.posted=false;q.parentNode.removeChild(q);if(q.menuItem===this.menu){break}l--}}}return this.False(n)}});a.ITEM.RADIO=a.ITEM.Subclass({variable:null,marker:(i?"\u25CF":"\u2713"),Init:function(m,l,n){this.name=m;this.variable=l;this.With(n);if(this.value==null){this.value=this.name}},Label:function(m,n){var l={className:"MathJax_MenuRadioCheck"};if(j.settings[this.variable]!==this.value){l={style:{display:"none"}}}return[["span",l,[this.marker]]," "+this.name]},Mouseup:function(p,q){if(!this.disabled){var r=q.parentNode.childNodes;for(var n=0,l=r.length;n<l;n++){var o=r[n].menuItem;if(o&&o.variable===this.variable){r[n].firstChild.style.display="none"}}q.firstChild.display="";j.settings[this.variable]=this.value;a.cookie[this.variable]=j.settings[this.variable];a.saveCookie();if(this.action){this.action.call(a)}}this.Remove(p,q);return this.False(p)}});a.ITEM.CHECKBOX=a.ITEM.Subclass({variable:null,marker:"\u2713",Init:function(m,l,n){this.name=m;this.variable=l;this.With(n)},Label:function(m,n){var l={className:"MathJax_MenuCheck"};if(!j.settings[this.variable]){l={style:{display:"none"}}}return[["span",l,[this.marker]]," "+this.name]},Mouseup:function(l,m){if(!this.disabled){m.firstChild.display=(j.settings[this.variable]?"none":"");j.settings[this.variable]=!j.settings[this.variable];a.cookie[this.variable]=j.settings[this.variable];a.saveCookie();if(this.action){this.action.call(a)}}this.Remove(l,m);return this.False(l)}});a.ITEM.LABEL=a.ITEM.Subclass({Init:function(l,m){this.name=l;this.With(m)},Label:function(l,m){delete l.onmouseover,delete l.onmouseout;delete l.onmousedown;l.className+=" MathJax_MenuLabel";return[this.name]}});a.ITEM.RULE=a.ITEM.Subclass({Label:function(l,m){delete l.onmouseover,delete l.onmouseout;delete l.onmousedown;l.className+=" MathJax_MenuRule";return null}});a.About=function(){var o=MathJax.OutputJax["HTML-CSS"]||{fontInUse:""};var q=(o.webFonts?"":"local "),m=(o.webFonts?" web":"");var n=(o.imgFonts?"Image":q+o.fontInUse+m)+" fonts";var l=["MathJax.js v"+MathJax.fileversion,["br"]];l.push(["div",{style:{"border-top":"groove 2px",margin:".25em 0"}}]);a.About.GetJax(l,MathJax.InputJax,"Input Jax");a.About.GetJax(l,MathJax.OutputJax,"Output Jax");a.About.GetJax(l,MathJax.ElementJax,"Element Jax");l.push(["div",{style:{"border-top":"groove 2px",margin:".25em 0"}}]);a.About.GetJax(l,MathJax.Extension,"Extension",true);l.push(["div",{style:{"border-top":"groove 2px",margin:".25em 0"}}],["center",{},[b.Browser+" v"+b.Browser.version+(o.webFonts?" \u2014 "+o.allowWebFonts+" fonts":"")]]);a.About.div=a.Background(a.About);var r=MathJax.HTML.addElement(a.About.div,"div",{id:"MathJax_About",onclick:a.About.Remove},[["b",{style:{fontSize:"120%"}},["MathJax"]]," v"+MathJax.version,["br"],"using "+n,["br"],["br"],["span",{style:{display:"inline-block","text-align":"left","font-size":"80%","background-color":"#E4E4E4",padding:".4em .6em",border:"1px inset"}},l],["br"],["br"],["a",{href:"http://www.mathjax.org/"},["www.mathjax.org"]]]);var s=(document.documentElement||{});var p=window.innerHeight||s.clientHeight||s.scrollHeight||0;if(a.prototype.msieAboutBug){r.style.width="20em";r.style.position="absolute";r.style.left=Math.floor((document.documentElement.scrollWidth-r.offsetWidth)/2)+"px";r.style.top=(Math.floor((p-r.offsetHeight)/3)+document.body.scrollTop)+"px"}else{r.style.marginLeft=Math.floor(-r.offsetWidth/2)+"px";r.style.top=Math.floor((p-r.offsetHeight)/3)+"px"}};a.About.Remove=function(l){if(a.About.div){document.body.removeChild(a.About.div);delete a.About.div}};a.About.GetJax=function(l,o,n,m){for(var p in o){if(o.hasOwnProperty(p)&&o[p]){if((m&&o[p].version)||(o[p].isa&&o[p].isa(o))){l.push((o[p].id||p)+" "+n+" v"+o[p].version,["br"])}}}return l};a.Help=function(){window.open(j.helpURL,"MathJaxHelp")};a.ShowSource=function(o){if(!o){o=window.event}var n={screenX:o.screenX,screenY:o.screenY};if(!a.jax){return}if(j.settings.format==="MathML"){var l=MathJax.ElementJax.mml;if(l&&typeof(l.mbase.prototype.toMathML)!=="undefined"){try{a.ShowSource.Text(a.jax.root.toMathML(),o)}catch(m){if(!m.restart){throw m}MathJax.Callback.After([this,arguments.callee,n])}}else{if(!f.loadingToMathML){f.loadingToMathML=true;a.ShowSource.Window(o);MathJax.Callback.Queue(f.Require("[MathJax]/extensions/toMathML.js"),function(){delete f.loadingToMathML},[this,arguments.callee,n]);return}}}else{if(a.jax.originalText==null){alert("No TeX form available");return}a.ShowSource.Text(a.jax.originalText,o)}};a.ShowSource.Window=function(m){if(!a.ShowSource.w){var n=[],l=j.windowSettings;for(var o in l){if(l.hasOwnProperty(o)){n.push(o+"="+l[o])}}a.ShowSource.w=window.open("","_blank",n.join(","))}return a.ShowSource.w};a.ShowSource.Text=function(r,q){var n=a.ShowSource.Window(q);r=r.replace(/^\s*/,"").replace(/\s*$/,"");r=r.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");n.document.open();n.document.write("<html><head><title>MathJax Equation Source</title></head><body style='font-size:85%'>");n.document.write("<table><tr><td><pre>"+r+"</pre></td></tr></table>");n.document.write("</body></html>");n.document.close();var p=n.document.body.firstChild;var o=(n.outerHeight-n.innerHeight)||30,m=(n.outerWidth-n.innerWidth)||30;m=Math.min(Math.floor(0.5*screen.width),p.offsetWidth+m+25);o=Math.min(Math.floor(0.5*screen.height),p.offsetHeight+o+25);n.resizeTo(m,o);if(q&&q.screenX!=null){var l=Math.max(0,Math.min(q.screenX-Math.floor(m/2),screen.width-m-20)),s=Math.max(0,Math.min(q.screenY-Math.floor(o/2),screen.height-o-20));n.moveTo(l,s)}delete a.ShowSource.w};a.Scale=function(){var m=MathJax.OutputJax["HTML-CSS"],l=MathJax.OutputJax.NativeMML;var o=(m?m.config.scale:l.config.scale);var n=prompt("Scale all mathematics (compared to surrounding text) by",o+"%");if(n){if(n.match(/^\s*\d+\s*%?\s*$/)){n=parseInt(n);if(n){if(n!==o){if(m){m.config.scale=n}if(l){l.config.scale=n}a.cookie.scale=n;a.saveCookie();b.Reprocess()}}else{alert("The scale should not be zero")}}else{alert("The scale should be a perentage (e.g., 120%)")}}};a.Zoom=function(){if(!MathJax.Extension.MathZoom){f.Require("[MathJax]/extensions/MathZoom.js")}};a.Renderer=function(){var l=b.config.outputJax["jax/mml"];if(l[0]!==j.settings.renderer){MathJax.Callback.Queue(["Require",f,"[MathJax]/jax/output/"+j.settings.renderer+"/config.js"],["Post",b.Startup.signal,j.settings.renderer+" output selected"],[function(){var p=MathJax.OutputJax[j.settings.renderer];for(var o=0,n=l.length;o<n;o++){if(l[o]===p){l.splice(o,1);break}}l.unshift(p)}],["Reprocess",b])}};a.Font=function(){var l=MathJax.OutputJax["HTML-CSS"];if(!l){return}document.location.reload()};b.Browser.Select({MSIE:function(l){var m=(document.compatMode==="BackCompat");var n=l.versionAtLeast("8.0")&&document.documentMode>7;a.Augment({margin:20,msieBackgroundBug:(m||!n),msieAboutBug:m});if(document.documentMode>=9){delete j.styles["#MathJax_About"].filter;delete j.styles[".MathJax_Menu"].filter}}});b.Register.StartupHook("End Config",function(){j.settings=b.config.menuSettings;if(!j.settings.format){j.settings.format=(MathJax.InputJax.TeX?"Original":"MathML")}if(typeof(j.settings.showRenderer)!=="undefined"){j.showRenderer=j.settings.showRenderer}if(typeof(j.settings.showFontMenu)!=="undefined"){j.showFontMenu=j.settings.showFontMenu}if(typeof(j.settings.showContext)!=="undefined"){j.showContext=j.settings.showContext}a.getCookie();a.menu=a(h.COMMAND("Show Source",a.ShowSource),h.SUBMENU("Format",h.RADIO("MathML","format"),h.RADIO("Original","format",{value:"Original"})),h.RULE(),h.SUBMENU("Settings",h.SUBMENU("Zoom Trigger",h.RADIO("Hover","zoom",{action:a.Zoom}),h.RADIO("Click","zoom",{action:a.Zoom}),h.RADIO("Double-Click","zoom",{action:a.Zoom}),h.RADIO("No Zoom","zoom",{value:"None"}),h.RULE(),h.LABEL("Trigger Requires:"),h.CHECKBOX((b.Browser.isMac?"Option":"Alt"),"ALT"),h.CHECKBOX("Command","CMD",{hidden:!b.Browser.isMac}),h.CHECKBOX("Control","CTRL",{hidden:b.Browser.isMac}),h.CHECKBOX("Shift","Shift")),h.SUBMENU("Zoom Factor",h.RADIO("125%","zscale"),h.RADIO("133%","zscale"),h.RADIO("150%","zscale"),h.RADIO("175%","zscale"),h.RADIO("200%","zscale"),h.RADIO("250%","zscale"),h.RADIO("300%","zscale"),h.RADIO("400%","zscale")),h.RULE(),h.SUBMENU("Math Renderer",{hidden:!j.showRenderer},h.RADIO("HTML-CSS","renderer",{action:a.Renderer}),h.RADIO("MathML","renderer",{action:a.Renderer,value:"NativeMML"})),h.SUBMENU("Font Preference",{hidden:!j.showFontMenu},h.LABEL("For HTML-CSS:"),h.RADIO("Auto","font",{action:a.Font}),h.RULE(),h.RADIO("TeX (local)","font",{action:a.Font}),h.RADIO("TeX (web)","font",{action:a.Font}),h.RADIO("TeX (image)","font",{action:a.Font}),h.RULE(),h.RADIO("STIX (local)","font",{action:a.Font})),h.SUBMENU("Contextual Menu",{hidden:!j.showContext},h.RADIO("MathJax","context"),h.RADIO("Browser","context")),h.COMMAND("Scale All Math ...",a.Scale)),h.RULE(),h.COMMAND("About MathJax",a.About),h.COMMAND("MathJax Help",a.Help))});a.showRenderer=function(l){a.cookie.showRenderer=j.showRenderer=l;a.saveCookie();a.menu.items[3].menu.item[3].hidden=!l};a.showFontMenu=function(l){a.cookie.showFontMenu=j.showFontMenu=l;a.saveCookie();a.menu.items[3].menu.items[4].hidden=!l};a.showContext=function(l){a.cookie.showContext=j.showContext=l;a.saveCookie();a.menu.items[3].menu.items[5].hidden=!l};MathJax.Callback.Queue(["Styles",f,j.styles],["Post",b.Startup.signal,"MathMenu Ready"],["loadComplete",f,"[MathJax]/extensions/MathMenu.js"])})(MathJax.Hub,MathJax.HTML,MathJax.Ajax);
+
diff --git a/static/MathJax/extensions/MathZoom.js b/static/MathJax/extensions/MathZoom.js
new file mode 100644
index 0000000..c872f02
--- /dev/null
+++ b/static/MathJax/extensions/MathZoom.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/extensions/MathZoom.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a,c,e,b,h){var i="1.1";var g=a.CombineConfig("MathZoom",{delay:400,styles:{"#MathJax_Zoom":{position:"absolute","background-color":"#F0F0F0",overflow:"auto",display:"block","z-index":301,padding:".5em",border:"1px solid black",margin:0,"font-family":"serif","font-size":"85%","font-weight":"normal","font-style":"normal","text-align":"left","text-indent":0,"text-transform":"none","line-height":"normal","letter-spacing":"normal","word-spacing":"normal","word-wrap":"normal","white-space":"nowrap","float":"none","box-shadow":"5px 5px 15px #AAAAAA","-webkit-box-shadow":"5px 5px 15px #AAAAAA","-moz-box-shadow":"5px 5px 15px #AAAAAA","-khtml-box-shadow":"5px 5px 15px #AAAAAA",filter:"progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color='gray', Positive='true')"},"#MathJax_ZoomOverlay":{position:"absolute",left:0,top:0,"z-index":300,display:"inline-block",width:"100%",height:"100%",border:0,padding:0,margin:0,"background-color":"white",opacity:0,filter:"alpha(opacity=0)"}}});var d=function(j){if(!j){j=window.event}if(j){if(j.preventDefault){j.preventDefault()}if(j.stopPropagation){j.stopPropagation()}j.cancelBubble=true;j.returnValue=false}return false};var f=MathJax.Extension.MathZoom={version:i,settings:a.config.menuSettings,HandleEvent:function(l,j,k){if(!l){l=window.event}if(f.settings.CTRL&&!l.ctrlKey){return true}if(f.settings.ALT&&!l.altKey){return true}if(f.settings.CMD&&!l.metaKey){return true}if(f.settings.Shift&&!l.shiftKey){return true}return f[j](l,k)},Click:function(k,j){if(this.settings.zoom==="Click"){return this.Zoom(j,k)}},DblClick:function(k,j){if(this.settings.zoom==="Double-Click"){return this.Zoom(j,k)}},Mouseover:function(k,j){if(this.settings.zoom==="Hover"){f.oldMouseOver=j.onmouseover;j.onmouseover=null;j.onmousemove=this.Mousemove;j.onmouseout=this.Mouseout;return f.Timer(k,j)}},Mouseout:function(j){this.onmouseover=f.oldMouseOver;delete f.oldMouseOver;this.onmousemove=this.onmouseout=null;f.ClearTimer();return d(j)},Mousemove:function(j){return f.Timer(j||window.event,this)},Timer:function(k,j){this.ClearTimer();this.timer=setTimeout(MathJax.Callback(["Zoom",this,j,{}]),g.delay);return d(k)},ClearTimer:function(){if(this.timer){clearTimeout(this.timer);delete this.timer}},Zoom:function(s,l){this.ClearTimer();this.Remove();var v=s.parentNode;if(v.className==="MathJax_MathContainer"){v=v.parentNode}if(v.parentNode.className==="MathJax_MathContainer"){v=v.parentNode.parentNode}var q=(String(v.className).match(/^MathJax_(MathML|Display)$/)?v:s).nextSibling;var m=a.getJaxFor(q),r=m.root;var o=(b&&m.outputJax.isa(b.constructor)?"HTMLCSS":(h&&m.outputJax.isa(h.constructor)?"MathML":null));if(!o){return}var j=Math.floor(0.85*document.body.clientWidth),p=Math.floor(0.85*document.body.clientHeight);var k=c.Element("span",{style:{position:"relative",display:"inline-block",height:0,width:0},id:"MathJax_ZoomFrame"},[["span",{id:"MathJax_ZoomOverlay",onmousedown:this.Remove}],["span",{id:"MathJax_Zoom",onclick:this.Remove,style:{visibility:"hidden",fontSize:this.settings.zscale,"max-width":j+"px","max-height":p+"px"}},[["span"]]]]);var x=k.lastChild,u=x.firstChild,n=k.firstChild;s.parentNode.insertBefore(k,s);if(this.msieZIndexBug){var t=c.Element("img",{src:"about:blank",id:"MathJax_ZoomTracker",style:{width:0,height:0,position:"relative"}});document.body.appendChild(k);k.style.position="absolute";k.style.zIndex=g.styles["#MathJax_ZoomOverlay"]["z-index"];k=t}var w=(this["Zoom"+o])(r,u,s);if(this.msiePositionBug){if(this.msieIE8Bug){u.style.position="absolute";x.style.height=u.offsetHeight;u.style.position="";if(x.offsetHeight<=p&&x.offsetWidth<=j){x.style.overflow="visible"}}if(this.msieWidthBug){x.style.width=Math.min(j,w.w)}else{if(w.w>j){x.style.width=j}}if(x.offsetHeight>p){x.style.Height=p+"px"}if(s.nextSibling){s.parentNode.insertBefore(k,s.nextSibling)}else{v.appendChild(k)}}else{if(this.operaPositionBug){x.style.width=Math.min(j,u.offsetWidth)+"px"}}this.Position(x,w,(o==="MathML"&&v.nodeName.toLowerCase()==="div"));x.style.visibility="";if(this.settings.zoom==="Hover"){n.onmouseover=this.Remove}if(window.addEventListener){addEventListener("resize",this.Resize,false)}else{if(window.attachEvent){attachEvent("onresize",this.Resize)}else{this.onresize=window.onresize;window.onresize=this.Resize}}return d(l)},ZoomHTMLCSS:function(o,q,p){q.className="MathJax";b.idPostfix="-zoom";b.getScales(q,q);o.toHTML(q,q);var r=o.HTMLspanElement().bbox;b.idPostfix="";if(r.width&&r.width!=="100%"){var j=Math.floor(0.85*document.body.clientWidth);q.style.width=j+"px";q.style.display="inline-block";var k=(o.id||"MathJax-Span-"+o.spanID)+"-zoom";var l=document.getElementById(k).firstChild;while(l&&l.style.width!==r.width){l=l.nextSibling}if(l){l.style.width="100%"}}q.appendChild(this.topImg);var n=this.topImg.offsetTop;q.removeChild(this.topImg);var m=(this.msieWidthBug?b.getW(p)*b.em:p.offsetWidth);return{w:r.w*b.em,Y:-n,W:m}},ZoomMathML:function(k,l,m){k.toNativeMML(l,l);var n;l.appendChild(this.topImg);n=this.topImg.offsetTop;l.removeChild(this.topImg);var j=(this.ffMMLwidthBug?m.parentNode:m).offsetWidth;return{w:l.offsetWidth,Y:-n,W:j}},Position:function(p,n,r){var k=this.Resize(),m=k.x,l=k.y,j=n.W;if(this.msiePositionBug){j=-j}if(r&&this.ffMMLcenterBug){j=0}var q=-Math.floor((p.offsetWidth-j)/2),o=n.Y;p.style.left=Math.max(q,20-m)+"px";p.style.top=Math.max(o,20-l)+"px"},Resize:function(l){if(f.onresize){f.onresize(l)}var j=0,o=0,n=document.getElementById("MathJax_ZoomFrame"),k=document.getElementById("MathJax_ZoomOverlay");var m=(f.msieZIndexBug?document.getElementById("MathJax_ZoomTracker"):n);if(f.operaPositionBug){n.style.border="1px solid"}if(m.offsetParent){do{j+=m.offsetLeft;o+=m.offsetTop}while(m=m.offsetParent)}if(f.operaPositionBug){n.style.border=""}if(f.msieZIndexBug){n.style.left=j+"px";n.style.top=o+"px"}k.style.left=(-j)+"px";k.style.top=(-o)+"px";if(f.msiePositionBug){setTimeout(f.SetWH,0)}else{f.SetWH()}return{x:j,y:o}},SetWH:function(){var j=document.getElementById("MathJax_ZoomOverlay");j.style.width=j.style.height="1px";j.style.width=document.body.scrollWidth+"px";j.style.height=document.body.scrollHeight+"px"},Remove:function(k){var l=document.getElementById("MathJax_ZoomFrame");if(l){l.parentNode.removeChild(l);l=document.getElementById("MathJax_ZoomTracker");if(l){l.parentNode.removeChild(l)}if(f.operaRefreshBug){var j=c.addElement(document.body,"div",{style:{position:"fixed",left:0,top:0,width:"100%",height:"100%",backgroundColor:"white",opacity:0},id:"MathJax_OperaDiv"});document.body.removeChild(j)}if(window.removeEventListener){removeEventListener("resize",f.Resize,false)}else{if(window.detachEvent){detachEvent("onresize",f.Resize)}else{window.onresize=f.onresize;delete f.onresize}}}return d(k)}};a.Register.StartupHook("HTML-CSS Jax Ready",function(){b=MathJax.OutputJax["HTML-CSS"];b.Augment({HandleEvent:f.HandleEvent})});a.Register.StartupHook("NativeMML Jax Ready",function(){h=MathJax.OutputJax.NativeMML;h.Augment({HandleEvent:f.HandleEvent,MSIEmouseup:function(l,k,j){if(this.trapUp){delete this.trapUp;return true}if(this.MSIEzoomKeys(l)){return true}return false},MSIEclick:function(l,k,j){if(this.trapClick){delete this.trapClick;return true}if(!this.MSIEzoomKeys(l)){return false}if(!this.settings.zoom.match(/Click/)){return false}return(f.Click(l,k)===false)},MSIEdblclick:function(l,k,j){if(!this.MSIEzoomKeys(l)){return false}return(f.DblClick(l,k)===false)},MSIEmouseover:function(l,k,j){if(this.settings.zoom!=="Hover"){return false}f.Timer(l,k);return true},MSIEmouseout:function(l,k,j){if(this.settings.zoom!=="Hover"){return false}f.ClearTimer();return true},MSIEmousemove:function(l,k,j){if(this.settings.zoom!=="Hover"){return false}f.Timer(l,k);return true},MSIEzoomKeys:function(j){if(this.settings.CTRL&&!j.ctrlKey){return false}if(this.settings.CMD&&!j.metaKey){return false}if(this.settings.ALT&&!j.altKey){return false}if(this.settings.Shift&&!j.shiftKey){return false}return true}})});a.Browser.Select({MSIE:function(j){var k=(document.compatMode==="BackCompat");var l=j.versionAtLeast("8.0")&&document.documentMode>7;f.msiePositionBug=true;f.msieWidthBug=!k;f.msieIE8Bug=l;f.msieZIndexBug=!l;f.msieInlineBlockAlignBug=(!l||k);if(document.documentMode>=9){delete g.styles["#MathJax_Zoom"].filter}},Opera:function(j){f.operaPositionBug=true;f.operaRefreshBug=true},Firefox:function(j){f.ffMMLwidthBug=true;f.ffMMLcenterBug=true}});f.topImg=(f.msieInlineBlockAlignBug?c.Element("img",{style:{width:0,height:0},src:"about:blank"}):c.Element("span",{style:{width:0,height:0,display:"inline-block"}}));if(f.operaPositionBug){f.topImg.style.border="1px solid"}MathJax.Callback.Queue(["Styles",e,g.styles],["Post",a.Startup.signal,"MathZoom Ready"],["loadComplete",e,"[MathJax]/extensions/MathZoom.js"])})(MathJax.Hub,MathJax.HTML,MathJax.Ajax,MathJax.OutputJax["HTML-CSS"],MathJax.OutputJax.NativeMML);
+
diff --git a/static/MathJax/extensions/TeX/AMSmath.js b/static/MathJax/extensions/TeX/AMSmath.js
new file mode 100644
index 0000000..1d1eb81
--- /dev/null
+++ b/static/MathJax/extensions/TeX/AMSmath.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/extensions/TeX/AMSmath.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Register.StartupHook("TeX Jax Ready",function(){var e="1.1";var a=MathJax.ElementJax.mml;var f=MathJax.InputJax.TeX;var c=f.Definitions;var d=f.Stack.Item;var b=function(g){return g.join("em ")+"em"};MathJax.Hub.Insert(c,{macros:{mathring:["Accent","2DA"],nobreakspace:"Tilde",negmedspace:["Spacer",a.LENGTH.NEGATIVEMEDIUMMATHSPACE],negthickspace:["Spacer",a.LENGTH.NEGATIVETHICKMATHSPACE],intI:["Macro","\\mathchoice{\\!}{}{}{}\\!\\!\\int"],iiiint:["MultiIntegral","\\int\\intI\\intI\\intI"],idotsint:["MultiIntegral","\\int\\cdots\\int"],dddot:["Macro","\\mathop{#1}\\limits^{\\textstyle \\mathord{.}\\mathord{.}\\mathord{.}}",1],ddddot:["Macro","\\mathop{#1}\\limits^{\\textstyle \\mathord{.}\\mathord{.}\\mathord{.}\\mathord{.}}",1],sideset:["Macro","\\mathop{\\mathop{\\rlap{\\phantom{#3}}}\\nolimits#1\\!\\mathop{#3}\\nolimits#2}",3],boxed:["Macro","\\fbox{$\\displaystyle{#1}$}",1],tag:"HandleTag",notag:"HandleNoTag",substack:["Macro","\\begin{subarray}{c}#1\\end{subarray}",1],injlim:["Macro","\\mathop{\\rm inj\\,lim}"],projlim:["Macro","\\mathop{\\rm proj\\,lim}"],varliminf:["Macro","\\mathop{\\underline{\\rm lim}}"],varlimsup:["Macro","\\mathop{\\overline{\\rm lim}}"],varinjlim:["Macro","\\mathop{\\underrightarrow{\\rm lim\\Rule{-1pt}{0pt}{1pt}}\\Rule{0pt}{0pt}{.45em}}"],varprojlim:["Macro","\\mathop{\\underleftarrow{\\rm lim\\Rule{-1pt}{0pt}{1pt}}\\Rule{0pt}{0pt}{.45em}}"],DeclareMathOperator:"HandleDeclareOp",operatorname:"HandleOperatorName",genfrac:"Genfrac",frac:["Genfrac","","","",""],tfrac:["Genfrac","","","",1],dfrac:["Genfrac","","","",0],binom:["Genfrac","(",")","0em",""],tbinom:["Genfrac","(",")","0em",1],dbinom:["Genfrac","(",")","0em",0],cfrac:"CFrac",shoveleft:["HandleShove",a.ALIGN.LEFT],shoveright:["HandleShove",a.ALIGN.RIGHT],xrightarrow:["xArrow",8594,5,6],xleftarrow:["xArrow",8592,7,3]},environment:{align:["AMSarray",null,true,true,"rlrlrlrlrlrl",b([5/18,2,5/18,2,5/18,2,5/18,2,5/18,2,5/18])],"align*":["AMSarray",null,false,true,"rlrlrlrlrlrl",b([5/18,2,5/18,2,5/18,2,5/18,2,5/18,2,5/18])],multline:["Multline",null,true],"multline*":["Multline",null,false],split:["AMSarray",null,false,false,"rl",b([5/18])],gather:["AMSarray",null,true,true,"c"],"gather*":["AMSarray",null,false,true,"c"],alignat:["AlignAt",null,true,true],"alignat*":["AlignAt",null,false,true],alignedat:["AlignAt",null,false,false],aligned:["Array",null,null,null,"rlrlrlrlrlrl",b([5/18,2,5/18,2,5/18,2,5/18,2,5/18,2,5/18]),".5em","D"],gathered:["Array",null,null,null,"c",null,".5em","D"],subarray:["Array",null,null,null,null,b([0,0,0,0]),"0.1em","S",1],smallmatrix:["Array",null,null,null,"c",b([1/3]),".2em","S",1]},delimiter:{"\\lvert":["2223",{texClass:a.TEXCLASS.OPEN}],"\\rvert":["2223",{texClass:a.TEXCLASS.CLOSE}],"\\lVert":["2225",{texClass:a.TEXCLASS.OPEN}],"\\rVert":["2225",{texClass:a.TEXCLASS.CLOSE}]}});f.Parse.Augment({HandleTag:function(h){var g=this.trimSpaces(this.GetArgument(h));if(g==="*"){g=this.GetArgument(h)}else{g="("+g+")"}if(this.stack.global.notag){f.Error(h+" not allowed in "+this.stack.global.notag+" environment")}if(this.stack.global.tag){f.Error("Multiple "+h)}this.stack.global.tag=a.mtd.apply(a,this.InternalMath(g))},HandleNoTag:function(g){if(this.stack.global.tag){delete this.stack.global.tag}},HandleDeclareOp:function(h){var g="";var i=this.trimSpaces(this.GetArgument(h));if(i=="*"){g="\\limits";i=this.trimSpaces(this.GetArgument(h))}if(i.charAt(0)=="\\"){i=i.substr(1)}var j=this.GetArgument(h);j=j.replace(/\*/g,"\\text{*}").replace(/-/g,"\\text{-}");f.Definitions.macros[i]=["Macro","\\mathop{\\rm "+j+"}"+g]},HandleOperatorName:function(h){var g="\\nolimits";var i=this.trimSpaces(this.GetArgument(h));if(i=="*"){g="\\limits";i=this.trimSpaces(this.GetArgument(h))}i=i.replace(/\*/g,"\\text{*}").replace(/-/g,"\\text{-}");this.string="\\mathop{\\rm "+i+"}"+g+" "+this.string.slice(this.i);this.i=0},HandleShove:function(h,g){var i=this.stack.Top();if(i.type!=="multline"||i.data.length){f.Error(h+" must come at the beginning of the line")}i.data.shove=g},CFrac:function(j){var g=this.trimSpaces(this.GetBrackets(j)),i=this.GetArgument(j),k=this.GetArgument(j);var h=a.mfrac(f.Parse("\\strut\\textstyle{"+i+"}",this.stack.env).mml(),f.Parse("\\strut\\textstyle{"+k+"}",this.stack.env).mml());g=({l:a.ALIGN.LEFT,r:a.ALIGN.RIGHT,"":""})[g];if(g==null){f.Error("Illegal alignment specified in "+j)}if(g){h.numalign=h.denomalign=g}this.Push(h)},Genfrac:function(h,j,o,l,g){if(j==null){j=this.GetDelimiterArg(h)}else{j=this.convertDelimiter(j)}if(o==null){o=this.GetDelimiterArg(h)}else{o=this.convertDelimiter(o)}if(l==null){l=this.GetArgument(h)}if(g==null){g=this.trimSpaces(this.GetArgument(h))}var k=this.ParseArg(h);var n=this.ParseArg(h);var i=a.mfrac(k,n);if(l!==""){i.linethickness=l}if(j||o){i=a.mfenced(i).With({open:j,close:o})}if(g!==""){var m=(["D","T","S","SS"])[g];if(m==null){f.Error("Bad math style for "+h)}i=a.mstyle(i);if(m==="D"){i.displaystyle=true;i.scriptlevel=0}else{i.displaystyle=false;i.scriptlevel=g-1}}this.Push(i)},Multline:function(h,g){this.Push(h);return d.multline().With({arraydef:{displaystyle:true,rowspacing:".5em",width:f.config.MultLineWidth,columnwidth:"100%",side:f.config.TagSide,minlabelspacing:f.config.TagIndent}})},AMSarray:function(i,h,g,k,j){this.Push(i);k=k.replace(/[^clr]/g,"").split("").join(" ");k=k.replace(/l/g,"left").replace(/r/g,"right").replace(/c/g,"center");return d.AMSarray(i.name,h,g,this.stack).With({arraydef:{displaystyle:true,rowspacing:".5em",columnalign:k,columnspacing:(j||"1em"),rowspacing:"3pt",side:f.config.TagSide,minlabelspacing:f.config.TagIndent}})},AlignAt:function(i,h,g){var j=this.GetArgument("\\begin{"+i.name+"}");if(j.match(/[^0-9]/)){f.Error("Argument to \\begin{"+i.name+"} must me a positive integer")}align="";spacing=[];while(j>0){align+="rl";spacing.push("0em 0em");j--}spacing=spacing.join(" ");if(g){return this.AMSarray(i,h,g,align,spacing)}return this.Array(i,null,null,align,spacing,".5em","D")},MultiIntegral:function(g,k){var j=this.GetNext();if(j==="\\"){var h=this.i;j=this.GetArgument(g);this.i=h;if(j==="\\limits"){if(g==="\\idotsint"){k="\\!\\!\\mathop{\\,\\,"+k+"}"}else{k="\\!\\!\\!\\mathop{\\,\\,\\,"+k+"}"}}}this.string=k+" "+this.string.slice(this.i);this.i=0},xArrow:function(i,m,k,g){var j={width:"+"+(k+g)+"mu",lspace:k+"mu"};var n=this.GetBrackets(i),o=this.ParseArg(i);var p=a.mo(a.chars(String.fromCharCode(m))).With({stretchy:true,texClass:a.TEXCLASS.REL});var h=a.munderover(p);h.SetData(h.over,a.mpadded(o).With(j).With({voffset:".15em"}));if(n){n=f.Parse(n,this.stack.env).mml();h.SetData(h.under,a.mpadded(n).With(j).With({voffset:"-.24em"}))}this.Push(h)},GetDelimiterArg:function(g){var h=this.trimSpaces(this.GetArgument(g));if(h==""){return null}if(!c.delimiter[h]){f.Error("Missing or unrecognized delimiter for "+g)}return this.convertDelimiter(h)}});d.multline=d.array.Subclass({type:"multline",EndEntry:function(){var g=a.mtd.apply(a,this.data);if(this.data.shove){g.columnalign=this.data.shove}this.row.push(g);this.data=[]},EndRow:function(){if(this.row.length!=1){f.Error("multline rows must have exactly one column")}this.table.push(this.row);this.row=[]},EndTable:function(){this.SUPER(arguments).EndTable.call(this);if(this.table.length){var h=this.table.length-1,j;if(!this.table[0][0].columnalign){this.table[0][0].columnalign=a.ALIGN.LEFT}if(!this.table[h][0].columnalign){this.table[h][0].columnalign=a.ALIGN.RIGHT}var g=a.mtr;if(this.global.tag){this.table[0]=[this.global.tag].concat(this.table[0]);delete this.global.tag;g=a.mlabeledtr}this.table[0]=g.apply(a,this.table[0]);for(j=1,h=this.table.length;j<h;j++){this.table[j]=a.mtr.apply(a,this.table[j])}}}});d.AMSarray=d.array.Subclass({type:"AMSarray",Init:function(j,i,h,g){this.SUPER(arguments).Init.apply(this);this.numbered=i;this.save_notag=g.global.notag;g.global.notag=(h?null:j)},EndRow:function(){var g=a.mtr;if(this.global.tag){this.row=[this.global.tag].concat(this.row);g=a.mlabeledtr;delete this.global.tag}this.table.push(g.apply(a,this.row));this.row=[]},EndTable:function(){this.SUPER(arguments).EndTable.call(this);this.global.notag=this.save_notag}});d.start.Augment({oldCheckItem:d.start.prototype.checkItem,checkItem:function(h){if(h.type==="stop"){var g=this.mmlData();if(this.global.tag){var j=[this.global.tag,a.mtd(g)];delete this.global.tag;var i={side:f.config.TagSide,minlabelspacing:f.config.TagIndent,columnalign:g.displayAlign};if(g.displayAlign===a.INDENTALIGN.LEFT){i.width="100%";if(g.displayIndent&&!String(g.displayIndent).match(/^0+(\.0*)?($|[a-z%])/)){i.columnwidth=g.displayIndent+" fit";i.columnspacing="0";j=[j[0],a.mtd(),j[1]]}}else{if(g.displayAlign===a.INDENTALIGN.RIGHT){i.width="100%";if(g.displayIndent&&!String(g.displayIndent).match(/^0+(\.0*)?($|[a-z%])/)){i.columnwidth="fit "+g.displayIndent;i.columnspacing="0";j[2]=a.mtd()}}}g=a.mtable(a.mlabeledtr.apply(a,j)).With(i)}return d.mml(g)}return this.SUPER(arguments).checkItem.call(this,h)}});MathJax.Hub.Startup.signal.Post("TeX AMSmath Ready")});MathJax.Ajax.loadComplete("[MathJax]/extensions/TeX/AMSmath.js");
+
diff --git a/static/MathJax/extensions/TeX/AMSsymbols.js b/static/MathJax/extensions/TeX/AMSsymbols.js
new file mode 100644
index 0000000..5a33969
--- /dev/null
+++ b/static/MathJax/extensions/TeX/AMSsymbols.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/extensions/TeX/AMSsymbols.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Register.StartupHook("TeX Jax Ready",function(){var b="1.1.2";var a=MathJax.ElementJax.mml;MathJax.Hub.Insert(MathJax.InputJax.TeX.Definitions,{mathchar0mi:{digamma:"03DD",varkappa:"03F0",varGamma:["0393",{mathvariant:a.VARIANT.ITALIC}],varDelta:["0394",{mathvariant:a.VARIANT.ITALIC}],varTheta:["0398",{mathvariant:a.VARIANT.ITALIC}],varLambda:["039B",{mathvariant:a.VARIANT.ITALIC}],varXi:["039E",{mathvariant:a.VARIANT.ITALIC}],varPi:["03A0",{mathvariant:a.VARIANT.ITALIC}],varSigma:["03A3",{mathvariant:a.VARIANT.ITALIC}],varUpsilon:["03A5",{mathvariant:a.VARIANT.ITALIC}],varPhi:["03A6",{mathvariant:a.VARIANT.ITALIC}],varPsi:["03A8",{mathvariant:a.VARIANT.ITALIC}],varOmega:["03A9",{mathvariant:a.VARIANT.ITALIC}],beth:"2136",gimel:"2137",daleth:"2138",backprime:["2035",{variantForm:true}],hslash:["210F",{variantForm:true}],varnothing:["2205",{variantForm:true}],blacktriangle:"25B2",triangledown:"25BD",blacktriangledown:"25BC",square:"25A1",Box:"25A1",blacksquare:"25A0",lozenge:"25CA",Diamond:"25CA",blacklozenge:"29EB",circledS:["24C8",{mathvariant:a.VARIANT.NORMAL}],bigstar:"2605",sphericalangle:"2222",measuredangle:"2221",nexists:"2204",complement:"2201",mho:"2127",eth:["00F0",{mathvariant:a.VARIANT.NORMAL}],Finv:"2132",diagup:"2571",Game:"2141",diagdown:"2572",Bbbk:["006B",{mathvariant:a.VARIANT.DOUBLESTRUCK}],yen:"00A5",circledR:"00AE",checkmark:"2713",maltese:"2720"},mathchar0mo:{dotplus:"2214",ltimes:"22C9",smallsetminus:["2216",{variantForm:true}],rtimes:"22CA",Cap:"22D2",doublecap:"22D2",leftthreetimes:"22CB",Cup:"22D3",doublecup:"22D3",rightthreetimes:"22CC",barwedge:"22BC",curlywedge:"22CF",veebar:"22BB",curlyvee:"22CE",doublebarwedge:"2A5E",boxminus:"229F",circleddash:"229D",boxtimes:"22A0",circledast:"229B",boxdot:"22A1",circledcirc:"229A",boxplus:"229E",centerdot:"22C5",divideontimes:"22C7",intercal:"22BA",leqq:"2266",geqq:"2267",leqslant:"2A7D",geqslant:"2A7E",eqslantless:"2A95",eqslantgtr:"2A96",lesssim:"2272",gtrsim:"2273",lessapprox:"2A85",gtrapprox:"2A86",approxeq:"224A",lessdot:"22D6",gtrdot:"22D7",lll:"22D8",llless:"22D8",ggg:"22D9",gggtr:"22D9",lessgtr:"2276",gtrless:"2277",lesseqgtr:"22DA",gtreqless:"22DB",lesseqqgtr:"2A8B",gtreqqless:"2A8C",doteqdot:"2251",Doteq:"2251",eqcirc:"2256",risingdotseq:"2253",circeq:"2257",fallingdotseq:"2252",triangleq:"225C",backsim:"223D",thicksim:["223C",{variantForm:true}],backsimeq:"22CD",thickapprox:"2248",subseteqq:"2AC5",supseteqq:"2AC6",Subset:"22D0",Supset:"22D1",sqsubset:"228F",sqsupset:"2290",preccurlyeq:"227C",succcurlyeq:"227D",curlyeqprec:"22DE",curlyeqsucc:"22DF",precsim:"227E",succsim:"227F",precapprox:"2AB7",succapprox:"2AB8",vartriangleleft:"22B2",lhd:"22B2",vartriangleright:"22B3",rhd:"22B3",trianglelefteq:"22B4",unlhd:"22B4",trianglerighteq:"22B5",unrhd:"22B5",vDash:"22A8",Vdash:"22A9",Vvdash:"22AA",smallsmile:"2323",shortmid:["2223",{variantForm:true}],smallfrown:"2322",shortparallel:["2225",{variantForm:true}],bumpeq:"224F",between:"226C",Bumpeq:"224E",pitchfork:"22D4",varpropto:"221D",backepsilon:"220D",blacktriangleleft:"25C0",blacktriangleright:"25B6",therefore:"2234",because:"2235",eqsim:"2242",vartriangle:["25B3",{variantForm:true}],Join:"22C8",nless:"226E",ngtr:"226F",nleq:"2270",ngeq:"2271",nleqslant:["2A87",{variantForm:true}],ngeqslant:["2A88",{variantForm:true}],nleqq:["2270",{variantForm:true}],ngeqq:["2271",{variantForm:true}],lneq:"2A87",gneq:"2A88",lneqq:"2268",gneqq:"2269",lvertneqq:["2268",{variantForm:true}],gvertneqq:["2269",{variantForm:true}],lnsim:"22E6",gnsim:"22E7",lnapprox:"2A89",gnapprox:"2A8A",nprec:"2280",nsucc:"2281",npreceq:["22E0",{variantForm:true}],nsucceq:["22E1",{variantForm:true}],precneqq:"2AB5",succneqq:"2AB6",precnsim:"22E8",succnsim:"22E9",precnapprox:"2AB9",succnapprox:"2ABA",nsim:"2241",ncong:"2246",nshortmid:["2224",{variantForm:true}],nshortparallel:["2226",{variantForm:true}],nmid:"2224",nparallel:"2226",nvdash:"22AC",nvDash:"22AD",nVdash:"22AE",nVDash:"22AF",ntriangleleft:"22EA",ntriangleright:"22EB",ntrianglelefteq:"22EC",ntrianglerighteq:"22ED",nsubseteq:"2288",nsupseteq:"2289",nsubseteqq:["2288",{variantForm:true}],nsupseteqq:["2289",{variantForm:true}],subsetneq:"228A",supsetneq:"228B",varsubsetneq:["228A",{variantForm:true}],varsupsetneq:["228B",{variantForm:true}],subsetneqq:"2ACB",supsetneqq:"2ACC",varsubsetneqq:["2ACB",{variantForm:true}],varsupsetneqq:["2ACC",{variantForm:true}],leftleftarrows:"21C7",rightrightarrows:"21C9",leftrightarrows:"21C6",rightleftarrows:"21C4",Lleftarrow:"21DA",Rrightarrow:"21DB",twoheadleftarrow:"219E",twoheadrightarrow:"21A0",leftarrowtail:"21A2",rightarrowtail:"21A3",looparrowleft:"21AB",looparrowright:"21AC",leftrightharpoons:"21CB",rightleftharpoons:["21CC",{variantForm:true}],curvearrowleft:"21B6",curvearrowright:"21B7",circlearrowleft:"21BA",circlearrowright:"21BB",Lsh:"21B0",Rsh:"21B1",upuparrows:"21C8",downdownarrows:"21CA",upharpoonleft:"21BF",upharpoonright:"21BE",downharpoonleft:"21C3",restriction:"21BE",multimap:"22B8",downharpoonright:"21C2",leftrightsquigarrow:"21AD",rightsquigarrow:"21DD",leadsto:"21DD",dashrightarrow:"21E2",dashleftarrow:"21E0",nleftarrow:"219A",nrightarrow:"219B",nLeftarrow:"21CD",nRightarrow:"21CF",nleftrightarrow:"21AE",nLeftrightarrow:"21CE"},delimiter:{"\\ulcorner":"250C","\\urcorner":"2510","\\llcorner":"2514","\\lrcorner":"2518"},macros:{implies:["Macro","\\;\\Longrightarrow\\;"],impliedby:["Macro","\\;\\Longleftarrow\\;"]}});var c=a.mo.OPTYPES.REL;MathJax.Hub.Insert(a.mo.prototype,{OPTABLE:{infix:{"\u2322":c,"\u2323":c,"\u25B3":c,"\uE006":c,"\uE007":c,"\uE00C":c,"\uE00D":c,"\uE00E":c,"\uE00F":c,"\uE010":c,"\uE011":c,"\uE016":c,"\uE017":c,"\uE018":c,"\uE019":c,"\uE01A":c,"\uE01B":c,"\uE04B":c,"\uE04F":c}}})});MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function(){var a=MathJax.OutputJax["HTML-CSS"];var b=a.FONTDATA.VARIANT;if(a.fontInUse==="TeX"){b["-TeX-variant"]={fonts:["MathJax_AMS","MathJax_Main","MathJax_Size1"],remap:{8808:57356,8809:57357,8816:57361,8817:57358,10887:57360,10888:57359,8740:57350,8742:57351,8840:57366,8841:57368,8842:57370,8843:57371,10955:57367,10956:57369,988:57352,1008:57353}};if(a.msieIE6){MathJax.Hub.Insert(b["-TeX-variant"].remap,{8592:[58049,"-WinIE6"],8594:[58048,"-WinIE6"],8739:[58050,"-WinIE6"],8741:[58051,"-WinIE6"],8764:[58052,"-WinIE6"],9651:[58067,"-WinIE6"]})}}if(a.fontInUse==="STIX"){MathJax.Hub.Register.StartupHook("TeX Jax Ready",function(){var c=MathJax.InputJax.TeX.Definitions;c.mathchar0mi.varnothing="2205";c.mathchar0mi.hslash="210F";c.mathchar0mi.blacktriangle="25B4";c.mathchar0mi.blacktriangledown="25BE";c.mathchar0mi.square="25FB";c.mathchar0mi.blacksquare="25FC";c.mathchar0mi.vartriangle=["25B3",{mathsize:"71%"}];c.mathchar0mi.triangledown=["25BD",{mathsize:"71%"}];c.mathchar0mo.blacktriangleleft="25C2";c.mathchar0mo.blacktriangleright="25B8";c.mathchar0mo.smallsetminus="2216";MathJax.Hub.Insert(b["-STIX-variant"],{remap:{10887:57360,10888:57359,8816:57361,8817:57358,8928:57419,8929:57423,8840:57366,8841:57368}})})}MathJax.Hub.Startup.signal.Post("TeX AMSsymbols Ready")});MathJax.Ajax.loadComplete("[MathJax]/extensions/TeX/AMSsymbols.js");
+
diff --git a/static/MathJax/extensions/TeX/HTML.js b/static/MathJax/extensions/TeX/HTML.js
new file mode 100644
index 0000000..05f149d
--- /dev/null
+++ b/static/MathJax/extensions/TeX/HTML.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/extensions/TeX/HTML.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Register.StartupHook("TeX Jax Ready",function(){var b="1.1";var c=MathJax.InputJax.TeX;var a=c.Definitions;a.macros.href="HREF_attribute";a.macros["class"]="CLASS_attribute";a.macros.style="STYLE_attribute";a.macros.cssId="ID_attribute";c.Parse.Augment({HREF_attribute:function(f){var e=this.GetArgument(f),d=this.GetArgumentMML(f);this.Push(d.With({href:e}))},CLASS_attribute:function(e){var f=this.GetArgument(e),d=this.GetArgumentMML(e);if(d["class"]!=null){f=d["class"]+" "+f}this.Push(d.With({"class":f}))},STYLE_attribute:function(e){var f=this.GetArgument(e),d=this.GetArgumentMML(e);if(d.style!=null){if(f.charAt(f.length-1)!==";"){f+=";"}f=d.style+" "+f}this.Push(d.With({style:f}))},ID_attribute:function(f){var e=this.GetArgument(f),d=this.GetArgumentMML(f);this.Push(d.With({id:e}))},GetArgumentMML:function(e){var d=this.ParseArg(e);if(d.inferred&&d.data.length==1){d=d.data[0]}else{delete d.inferred}return d}});MathJax.Hub.Startup.signal.Post("TeX HTML Ready")});MathJax.Ajax.loadComplete("[MathJax]/extensions/TeX/HTML.js");
+
diff --git a/static/MathJax/extensions/TeX/autobold.js b/static/MathJax/extensions/TeX/autobold.js
new file mode 100644
index 0000000..8af040c
--- /dev/null
+++ b/static/MathJax/extensions/TeX/autobold.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/extensions/TeX/autobold.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Register.StartupHook("TeX Jax Ready",function(){var b="1.1";var c=MathJax.InputJax.TeX;var a=c.prefilterMath;c.prefilterMath=function(g,h,e){var f=e.parentNode.insertBefore(document.createElement("span"),e);f.visibility="hidden";f.style.fontFamily="Times, serif";f.appendChild(document.createTextNode("ABCXYZabcxyz"));var d=f.offsetWidth;f.style.fontWeight="bold";if(f.offsetWidth==d){g="\\bf {"+g+"}"}f.parentNode.removeChild(f);return a.call(c,g,h,e)};MathJax.Hub.Startup.signal.Post("TeX autobold Ready")});MathJax.Ajax.loadComplete("[MathJax]/extensions/TeX/autobold.js");
+
diff --git a/static/MathJax/extensions/TeX/boldsymbol.js b/static/MathJax/extensions/TeX/boldsymbol.js
new file mode 100644
index 0000000..e6b929f
--- /dev/null
+++ b/static/MathJax/extensions/TeX/boldsymbol.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/extensions/TeX/boldsymbol.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Register.StartupHook("TeX Jax Ready",function(){var c="1.1";var a=MathJax.ElementJax.mml;var e=MathJax.InputJax.TeX;var b=e.Definitions;var d={};d[a.VARIANT.NORMAL]=a.VARIANT.BOLD;d[a.VARIANT.ITALIC]=a.VARIANT.BOLDITALIC;d[a.VARIANT.FRAKTUR]=a.VARIANT.BOLDFRAKTUR;d[a.VARIANT.SCRIPT]=a.VARIANT.BOLDSCRIPT;d[a.VARIANT.SANSSERIF]=a.VARIANT.BOLDSANSSERIF;d["-tex-caligraphic"]="-tex-caligraphic-bold";d["-tex-oldstyle"]="-tex-oldstyle-bold";b.macros.boldsymbol="Boldsymbol";e.Parse.Augment({mmlToken:function(g){if(this.stack.env.boldsymbol){var f=g.Get("mathvariant");if(f==null){g.mathvariant=a.VARIANT.BOLD}else{g.mathvariant=(d[f]||f)}}return g},Boldsymbol:function(i){var f=this.stack.env.boldsymbol,g=this.stack.env.font;this.stack.env.boldsymbol=true;this.stack.env.font=null;var h=this.ParseArg(i);this.stack.env.font=g;this.stack.env.boldsymbol=f;this.Push(h)}})});MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function(){var a=MathJax.OutputJax["HTML-CSS"];var c=a.FONTDATA.FONTS;var b=a.FONTDATA.VARIANT;if(a.fontInUse==="TeX"){c["MathJax_Caligraphic-bold"]="Caligraphic/Bold/Main.js";b["-tex-caligraphic-bold"]={fonts:["MathJax_Caligraphic-bold","MathJax_Main-bold","MathJax_Main","MathJax_Math","MathJax_Size1"],offsetA:65,variantA:"bold-italic"};b["-tex-oldstyle-bold"]={fonts:["MathJax_Caligraphic-bold","MathJax_Main-bold","MathJax_Main","MathJax_Math","MathJax_Size1"]};if(a.msieCheckGreek&&a.Font.testFont({family:"MathJax_Greek",weight:"bold",style:"italic",testString:a.msieCheckGreek})){b["bold-italic"].offsetG=913;b["bold-italic"].variantG="-Greek-Bold-Italic";b["-Greek-Bold-Italic"]={fonts:["MathJax_Greek-bold-italic"]};c["MathJax_Greek-bold-italic"]="Greek/BoldItalic/Main.js"}if(MathJax.Hub.Browser.isChrome&&!MathJax.Hub.Browser.versionAtLeast("5.0")){b["-tex-caligraphic-bold"].remap={84:[58096,"-WinChrome"]}}}else{if(a.fontInUse==="STIX"){b["-tex-caligraphic-bold"]={fonts:["STIXGeneral-bold-italic","STIXNonUnicode-bold-italic","STIXNonUnicode","STIXGeneral","STIXSizeOneSym"],offsetA:57927,noLowerCase:1};b["-tex-oldstyle-bold"]={fonts:["STIXGeneral-bold","STIXNonUnicode-bold","STIXGeneral","STIXSizeOneSym"],offsetN:57955,remap:{57956:57959,57957:57963,57958:57967,57959:57971,57960:57975,57961:57979,57962:57983,57963:57987,57964:57991}}}}MathJax.Hub.Startup.signal.Post("TeX boldsymbol Ready")});MathJax.Ajax.loadComplete("[MathJax]/extensions/TeX/boldsymbol.js");
+
diff --git a/static/MathJax/extensions/TeX/mathchoice.js b/static/MathJax/extensions/TeX/mathchoice.js
new file mode 100644
index 0000000..fff8adf
--- /dev/null
+++ b/static/MathJax/extensions/TeX/mathchoice.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/extensions/TeX/mathchoice.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Register.StartupHook("TeX Jax Ready",function(){var c="1.1";var a=MathJax.ElementJax.mml;var d=MathJax.InputJax.TeX;var b=d.Definitions;b.macros.mathchoice="MathChoice";d.Parse.Augment({MathChoice:function(f){var i=this.ParseArg(f),e=this.ParseArg(f),g=this.ParseArg(f),h=this.ParseArg(f);this.Push(a.TeXmathchoice(i,e,g,h))}});a.TeXmathchoice=a.mbase.Subclass({type:"TeXmathchoice",choice:function(){var e=this.getValues("displaystyle","scriptlevel");if(e.scriptlevel>0){return Math.min(3,e.scriptlevel+1)}return(e.displaystyle?0:1)},setTeXclass:function(e){return this.Core().setTeXclass(e)},isSpacelike:function(){return this.Core().isSpacelike()},isEmbellished:function(){return this.Core().isEmbellished()},Core:function(){return this.data[this.choice()]},toHTML:function(e){e=this.HTMLcreateSpan(e);e.bbox=this.Core().toHTML(e).bbox;return e}});MathJax.Hub.Startup.signal.Post("TeX mathchoice Ready")});MathJax.Ajax.loadComplete("[MathJax]/extensions/TeX/mathchoice.js");
+
diff --git a/static/MathJax/extensions/TeX/newcommand.js b/static/MathJax/extensions/TeX/newcommand.js
new file mode 100644
index 0000000..06aa258
--- /dev/null
+++ b/static/MathJax/extensions/TeX/newcommand.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/extensions/TeX/newcommand.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Register.StartupHook("TeX Jax Ready",function(){var b="1.1";var c=MathJax.InputJax.TeX;var a=c.Definitions;MathJax.Hub.Insert(a,{macros:{newcommand:"NewCommand",renewcommand:"NewCommand",newenvironment:"NewEnvironment",def:"MacroDef"}});c.Parse.Augment({NewCommand:function(d){var e=this.trimSpaces(this.GetArgument(d)),g=this.trimSpaces(this.GetBrackets(d)),f=this.GetArgument(d);if(g===""){g=null}if(e.charAt(0)==="\\"){e=e.substr(1)}if(!e.match(/^(.|[a-z]+)$/i)){c.Error("Illegal control sequence name for "+d)}if(g!=null&&!g.match(/^[0-9]+$/)){c.Error("Illegal number of parameters specified in "+d)}a.macros[e]=["Macro",f,g]},NewEnvironment:function(e){var f=this.trimSpaces(this.GetArgument(e)),h=this.trimSpaces(this.GetBrackets(e)),g=this.GetArgument(e),d=this.GetArgument(e);if(h===""){h=null}if(h!=null&&!h.match(/^[0-9]+$/)){c.Error("Illegal number of parameters specified in "+e)}a.environment[f]=["BeginEnv","EndEnv",g,d,h]},MacroDef:function(d){var e=this.GetCSname(d),g=this.GetTemplate(d,"\\"+e),f=this.GetArgument(d);if(!(g instanceof Array)){a.macros[e]=["Macro",f,g]}else{a.macros[e]=["MacroWithTemplate",f,g[0],g[1]]}},GetCSname:function(e){var f=this.GetNext();if(f!=="\\"){c.Error("\\ must be followed by a control sequence")}var d=this.trimSpaces(this.GetArgument(e));return d.substr(1)},GetTemplate:function(f,e){var j,g=[],h=0;j=this.GetNext();var d=this.i;while(this.i<this.string.length){j=this.GetNext();if(j==="#"){if(d!==this.i){g[h]=this.string.substr(d,this.i-d)}j=this.string.charAt(++this.i);if(!j.match(/^[1-9]$/)){c.Error("Illegal use of # in template for "+e)}if(parseInt(j)!=++h){c.Error("Parameters for "+e+" must be numbered sequentially")}d=this.i+1}else{if(j==="{"){if(d!==this.i){g[h]=this.string.substr(d,this.i-d)}if(g.length>0){return[h,g]}else{return h}}}this.i++}c.Error("Missing replacement string for definition of "+f)},MacroWithTemplate:function(e,h,j,g){if(j){var d=[];this.GetNext();if(g[0]&&!this.MatchParam(g[0])){c.Error("Use of "+e+" doesn't match its definition")}for(var f=0;f<j;f++){d.push(this.GetParameter(e,g[f+1]))}h=this.SubstituteArgs(d,h)}this.string=this.AddArgs(h,this.string.slice(this.i));this.i=0;if(++this.macroCount>c.config.MAXMACROS){c.Error("MathJax maximum macro substitution count exceeded; is there a recursive macro call?")}},BeginEnv:function(g,j,d,h){if(h){var e=[];for(var f=0;f<h;f++){e.push(this.GetArgument("\\begin{"+name+"}"))}j=this.SubstituteArgs(e,j);d=this.SubstituteArgs(e,d)}g.edef=d;this.string=this.AddArgs(j,this.string.slice(this.i));this.i=0;return g},EndEnv:function(d,e){this.string=this.AddArgs(d.edef,this.string.slice(this.i));this.i=0;return e},GetParameter:function(e,h){if(h==null){return this.GetArgument(e)}var g=this.i,d=0,f=0;while(this.i<this.string.length){if(this.string.charAt(this.i)==="{"){if(this.i===g){f=1}this.GetArgument(e);d=this.i-g}else{if(this.MatchParam(h)){if(f){g++;d-=2}return this.string.substr(g,d)}else{this.i++;d++;f=0}}}c.Error("Runaway argument for "+e+"?")},MatchParam:function(d){if(this.string.substr(this.i,d.length)!==d){return 0}this.i+=d.length;return 1}});c.Environment=function(d){a.environment[d]=["BeginEnv","EndEnv"].concat([].slice.call(arguments,1))};MathJax.Hub.Startup.signal.Post("TeX newcommand Ready")});MathJax.Ajax.loadComplete("[MathJax]/extensions/TeX/newcommand.js");
+
diff --git a/static/MathJax/extensions/TeX/noErrors.js b/static/MathJax/extensions/TeX/noErrors.js
new file mode 100644
index 0000000..cf95b18
--- /dev/null
+++ b/static/MathJax/extensions/TeX/noErrors.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/extensions/TeX/noErrors.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(){var c="1.1";var a=MathJax.Hub.CombineConfig("TeX.noErrors",{multiLine:true,inlineDelimiters:["",""],style:{"font-family":"serif","font-size":"80%","text-align":"left",color:"black",padding:"1px 3px",border:"1px solid"}});var b="\u00A0";MathJax.Extension["TeX/noErrors"]={version:c,config:a};MathJax.Hub.Register.StartupHook("TeX Jax Ready",function(){MathJax.InputJax.TeX.Augment({formatError:function(f,e,g,d){var i=a.inlineDelimiters;var h=(g||a.multiLine);if(!g){e=i[0]+e+i[1]}if(h){e=e.replace(/ /g,b)}else{e=e.replace(/\n/g," ")}return MathJax.ElementJax.mml.merror(e).With({isError:true,multiLine:h})}})});MathJax.Hub.Register.StartupHook("HTML-CSS Jax Config",function(){MathJax.Hub.Config({"HTML-CSS":{styles:{".MathJax .merror":MathJax.Hub.Insert({"font-style":null,"background-color":null,"vertical-align":(MathJax.Hub.Browser.isMSIE&&a.multiLine?"-2px":"")},a.style)}}})})})();MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function(){var a=MathJax.ElementJax.mml;var b=MathJax.OutputJax["HTML-CSS"];var c=a.math.prototype.toHTML;a.math.Augment({toHTML:function(d,e){if(this.data[0]&&this.data[0].data[0]&&this.data[0].data[0].isError){return this.data[0].data[0].toHTML(d)}return c.call(this,d,e)}});a.merror.Augment({toHTML:function(j){if(!this.isError){return a.mbase.prototype.toHTML.call(this,j)}j=this.HTMLcreateSpan(j);if(this.multiLine){j.style.display="inline-block"}var l=this.data[0].data[0].data.join("").split(/\n/);for(var g=0,e=l.length;g<e;g++){b.addText(j,l[g]);if(g!==e-1){b.addElement(j,"br")}}var n=b.getHD(j.parentNode),d=b.getW(j.parentNode);if(e>1){var k=(n.h+n.d)/2,h=b.TeX.x_height/2;var f=b.config.styles[".MathJax .merror"]["font-size"];if(f&&f.match(/%/)){h*=parseInt(f)/100}j.parentNode.style.verticalAlign=b.Em(n.d+(h-k));n.h=h+k;n.d=k-h}j.bbox={h:n.h,d:n.d,w:d,lw:0,rw:d};return j}});MathJax.Hub.Startup.signal.Post("TeX noErrors Ready")});MathJax.Hub.Register.StartupHook("NativeMML Jax Ready",function(){var b=MathJax.ElementJax.mml;var a=MathJax.Extension["TeX/noErrors"].config;var c=b.math.prototype.toNativeMML;b.math.Augment({toNativeMML:function(d){if(this.data[0]&&this.data[0].data[0]&&this.data[0].data[0].isError){return this.data[0].data[0].toNativeMML(d)}return c.call(this,d)}});b.merror.Augment({toNativeMML:function(g){if(!this.isError){return b.mbase.prototype.toNativeMML.call(this,g)}g=g.appendChild(document.createElement("span"));var h=this.data[0].data[0].data.join("").split(/\n/);for(var f=0,e=h.length;f<e;f++){g.appendChild(document.createTextNode(h[f]));if(f!==e-1){g.appendChild(document.createElement("br"))}}if(this.multiLine){g.style.display="inline-block";if(e>1){g.style.verticalAlign="middle"}}for(var j in a.style){if(a.style.hasOwnProperty(j)){var d=j.replace(/-./g,function(i){return i.charAt(1).toUpperCase()});g.style[d]=a.style[j]}}return g}});MathJax.Hub.Startup.signal.Post("TeX noErrors Ready")});MathJax.Ajax.loadComplete("[MathJax]/extensions/TeX/noErrors.js");
+
diff --git a/static/MathJax/extensions/TeX/noUndefined.js b/static/MathJax/extensions/TeX/noUndefined.js
new file mode 100644
index 0000000..511e711
--- /dev/null
+++ b/static/MathJax/extensions/TeX/noUndefined.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/extensions/TeX/noUndefined.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Extension["TeX/noUndefined"]={version:"1.1",config:MathJax.Hub.CombineConfig("TeX.noUndefined",{attributes:{mathcolor:"red"}})};MathJax.Hub.Register.StartupHook("TeX Jax Ready",function(){var b=MathJax.Extension["TeX/noUndefined"].config;var a=MathJax.ElementJax.mml;MathJax.InputJax.TeX.Parse.Augment({csUndefined:function(c){this.Push(a.mtext(c).With(b.attributes))}});MathJax.Hub.Startup.signal.Post("TeX noUndefined Ready")});MathJax.Ajax.loadComplete("[MathJax]/extensions/TeX/noUndefined.js");
+
diff --git a/static/MathJax/extensions/TeX/unicode.js b/static/MathJax/extensions/TeX/unicode.js
new file mode 100644
index 0000000..a451f87
--- /dev/null
+++ b/static/MathJax/extensions/TeX/unicode.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/extensions/TeX/unicode.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Extension["TeX/unicode"]={version:"1.1",unicode:{},config:MathJax.Hub.CombineConfig("TeX.unicode",{fonts:"STIXGeneral,'Arial Unicode MS'"})};MathJax.Hub.Register.StartupHook("TeX Jax Ready",function(){var d=MathJax.InputJax.TeX;var a=MathJax.ElementJax.mml;var c=MathJax.Extension["TeX/unicode"].config.fonts;var b=MathJax.Extension["TeX/unicode"].unicode;d.Definitions.macros.unicode="Unicode";d.Parse.Augment({Unicode:function(f){var j=this.GetBrackets(f),e;if(j){j=j.replace(/ /g,"");if(j.match(/^(\d+(\.\d*)?|\.\d+),(\d+(\.\d*)?|\.\d+)$/)){j=j.split(/,/);e=this.GetBrackets(f)}else{e=j;j=null}}var k=this.trimSpaces(this.GetArgument(f)),i=parseInt(k.match(/^x/)?"0"+k:k);b[i]=[800,200,500,0,500,{isUnknown:true,isUnicode:true,font:c}];if(j){b[i][0]=Math.floor(j[0]*1000);b[i][1]=Math.floor(j[1]*1000)}var g=this.stack.env.font,h={};if(e){h.fontfamily=e;if(g){if(g.match(/bold/)){h.fontweight="bold"}if(g.match(/italic/)){h.fontstyle="italic"}}b[i][5].font=e+","+c}else{if(g){h.mathvariant=g}}this.Push(a.mtext(a.entity("#"+k)).With(h))}})});MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function(){var a=MathJax.OutputJax["HTML-CSS"];var c=MathJax.Extension["TeX/unicode"].unicode;var b=a.lookupChar;a.Augment({lookupChar:function(e,f){var d=b.call(this,e,f);if(d[f][5]&&d[f][5].isUnknown&&c[f]){d[f]=c[f]}return d}});MathJax.Hub.Startup.signal.Post("TeX unicode Ready")});MathJax.Ajax.loadComplete("[MathJax]/extensions/TeX/unicode.js");
+
diff --git a/static/MathJax/extensions/TeX/verb.js b/static/MathJax/extensions/TeX/verb.js
new file mode 100644
index 0000000..fce988a
--- /dev/null
+++ b/static/MathJax/extensions/TeX/verb.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/extensions/TeX/verb.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Register.StartupHook("TeX Jax Ready",function(){var c="1.1";var a=MathJax.ElementJax.mml;var d=MathJax.InputJax.TeX;var b=d.Definitions;b.macros.verb="Verb";d.Parse.Augment({Verb:function(e){var h=this.GetNext();var g=++this.i;if(h==""){d.Error(e+" requires an argument")}while(this.i<this.string.length&&this.string.charAt(this.i)!=h){this.i++}if(this.i==this.string.length){d.Error("Can't find closing delimiter for "+e)}var f=this.string.slice(g,this.i);this.i++;this.Push(a.mtext(f).With({mathvariant:a.VARIANT.MONOSPACE}))}});MathJax.Hub.Startup.signal.Post("TeX verb Ready")});MathJax.Ajax.loadComplete("[MathJax]/extensions/TeX/verb.js");
+
diff --git a/static/MathJax/extensions/jsMath2jax.js b/static/MathJax/extensions/jsMath2jax.js
new file mode 100644
index 0000000..e87541c
--- /dev/null
+++ b/static/MathJax/extensions/jsMath2jax.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/extensions/jsMath2jax.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Extension.jsMath2jax={version:"1.1.1",config:{preview:"TeX"},PreProcess:function(b){if(!this.configured){this.config=MathJax.Hub.CombineConfig("jsMath2jax",this.config);if(this.config.Augment){MathJax.Hub.Insert(this,this.config.Augment)}if(typeof(this.config.previewTeX)!=="undefined"&&!this.config.previewTeX){this.config.preview="none"}this.previewClass=MathJax.Hub.config.preRemoveClass;this.configured=true}if(typeof(b)==="string"){b=document.getElementById(b)}if(!b){b=document.body}var c=b.getElementsByTagName("span"),a;for(a=c.length-1;a>=0;a--){if(String(c[a].className).match(/(^| )math( |$)/)){this.ConvertMath(c[a],"")}}var d=b.getElementsByTagName("div");for(a=d.length-1;a>=0;a--){if(String(d[a].className).match(/(^| )math( |$)/)){this.ConvertMath(d[a],"; mode=display")}}},ConvertMath:function(c,d){if(c.getElementsByTagName("script").length===0){var b=c.parentNode,a=this.createMathTag(d,c.innerHTML);if(c.nextSibling){b.insertBefore(a,c.nextSibling)}else{b.appendChild(a)}if(this.config.preview!=="none"){this.createPreview(c)}b.removeChild(c)}},createPreview:function(a){var b;if(this.config.preview==="TeX"){b=[this.filterTeX(a.innerHTML)]}else{if(this.config.preview instanceof Array){b=this.config.preview}}if(b){b=MathJax.HTML.Element("span",{className:MathJax.Hub.config.preRemoveClass},b);a.parentNode.insertBefore(b,a)}},createMathTag:function(c,b){b=b.replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&");var a=document.createElement("script");a.type="math/tex"+c;MathJax.HTML.setScript(a,b);return a},filterTeX:function(a){return a}};MathJax.Hub.Register.PreProcessor(["PreProcess",MathJax.Extension.jsMath2jax]);MathJax.Ajax.loadComplete("[MathJax]/extensions/jsMath2jax.js");
+
diff --git a/static/MathJax/extensions/mml2jax.js b/static/MathJax/extensions/mml2jax.js
new file mode 100644
index 0000000..72c2774
--- /dev/null
+++ b/static/MathJax/extensions/mml2jax.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/extensions/mml2jax.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Extension.mml2jax={version:"1.1.2",config:{preview:"alttext"},MMLnamespace:"http://www.w3.org/1998/Math/MathML",PreProcess:function(e){if(!this.configured){this.config=MathJax.Hub.CombineConfig("mml2jax",this.config);if(this.config.Augment){MathJax.Hub.Insert(this,this.config.Augment)}this.InitBrowser();this.configured=true}if(typeof(e)==="string"){e=document.getElementById(e)}if(!e){e=document.body}this.ProcessMathArray(e.getElementsByTagName("math"));if(e.getElementsByTagNameNS){this.ProcessMathArray(e.getElementsByTagNameNS(this.MMLnamespace,"math"))}var d=document.getElementsByTagName("html")[0];if(d){for(var c=0,b=d.attributes.length;c<b;c++){var a=d.attributes[c];if(a.nodeName.substr(0,6)==="xmlns:"&&a.nodeValue===this.MMLnamespace){this.ProcessMathArray(e.getElementsByTagName(a.nodeName.substr(6)+":math"))}}}},ProcessMathArray:function(b){var a;if(b.length){if(this.MathTagBug){for(a=b.length-1;a>=0;a--){if(b[a].nodeName==="MATH"){this.ProcessMathFlattened(b[a])}else{this.ProcessMath(b[a])}}}else{for(a=b.length-1;a>=0;a--){this.ProcessMath(b[a])}}}},ProcessMath:function(e){var d=e.parentNode;var a=document.createElement("script");a.type="math/mml";d.insertBefore(a,e);if(this.AttributeBug){var b=this.OuterHTML(e);if(this.CleanupHTML){b=b.replace(/<\?import .*?>/i,"").replace(/<\?xml:namespace .*?\/>/i,"");b=b.replace(/&nbsp;/g,"&#xA0;")}MathJax.HTML.setScript(a,b);d.removeChild(e)}else{var c=MathJax.HTML.Element("span");c.appendChild(e);MathJax.HTML.setScript(a,c.innerHTML)}if(this.config.preview!=="none"){this.createPreview(e,a)}},ProcessMathFlattened:function(f){var d=f.parentNode;var b=document.createElement("script");b.type="math/mml";d.insertBefore(b,f);var c="",e,a=f;while(f&&f.nodeName!=="/MATH"){e=f;f=f.nextSibling;c+=this.NodeHTML(e);e.parentNode.removeChild(e)}if(f&&f.nodeName==="/MATH"){f.parentNode.removeChild(f)}b.text=c+"</math>";if(this.config.preview!=="none"){this.createPreview(a,b)}},NodeHTML:function(e){var c,b,a;if(e.nodeName==="#text"){c=this.quoteHTML(e.nodeValue)}else{if(e.nodeName==="#comment"){c="<!--"+e.nodeValue+"-->"}else{c="<"+e.nodeName.toLowerCase();for(b=0,a=e.attributes.length;b<a;b++){var d=e.attributes[b];if(d.specified){c+=" "+d.nodeName.toLowerCase().replace(/xmlns:xmlns/,"xmlns")+"=";var f=d.nodeValue;if(f==null&&d.nodeName==="style"&&e.style){f=e.style.cssText}c+='"'+this.quoteHTML(f)+'"'}}c+=">";if(e.outerHTML!=null&&e.outerHTML.match(/(.<\/[A-Z]+>|\/>)$/)){for(b=0,a=e.childNodes.length;b<a;b++){c+=this.OuterHTML(e.childNodes[b])}c+="</"+e.nodeName.toLowerCase()+">"}}}return c},OuterHTML:function(d){if(d.nodeName.charAt(0)==="#"){return this.NodeHTML(d)}if(!this.AttributeBug){return d.outerHTML}var c=this.NodeHTML(d);for(var b=0,a=d.childNodes.length;b<a;b++){c+=this.OuterHTML(d.childNodes[b])}c+="</"+d.nodeName.toLowerCase()+">";return c},quoteHTML:function(a){if(a==null){a=""}return a.replace(/&/g,"&#x26;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")},createPreview:function(b,a){var c;if(this.config.preview==="alttext"){var d=b.getAttribute("alttext");if(d!=null){c=[this.filterText(d)]}}else{if(this.config.preview instanceof Array){c=this.config.preview}}if(c){c=MathJax.HTML.Element("span",{className:MathJax.Hub.config.preRemoveClass},c);a.parentNode.insertBefore(c,a)}},filterText:function(a){return a},InitBrowser:function(){var b=MathJax.HTML.Element("span",{id:"<",className:"mathjax",innerHTML:"<math><mi>x</mi><mspace /></math>"});var a=b.outerHTML||"";this.AttributeBug=a!==""&&!(a.match(/id="&lt;"/)&&a.match(/class="mathjax"/)&&a.match(/<\/math>/));this.MathTagBug=b.childNodes.length>1;this.CleanupHTML=MathJax.Hub.Browser.isMSIE}};MathJax.Hub.Register.PreProcessor(["PreProcess",MathJax.Extension.mml2jax]);MathJax.Ajax.loadComplete("[MathJax]/extensions/mml2jax.js");
+
diff --git a/static/MathJax/extensions/tex2jax.js b/static/MathJax/extensions/tex2jax.js
new file mode 100644
index 0000000..578ae2c
--- /dev/null
+++ b/static/MathJax/extensions/tex2jax.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/extensions/tex2jax.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Extension.tex2jax={version:"1.1.3",config:{inlineMath:[["\\(","\\)"]],displayMath:[["$$","$$"],["\\[","\\]"]],skipTags:["script","noscript","style","textarea","pre","code"],ignoreClass:"tex2jax_ignore",processClass:"tex2jax_process",processEscapes:false,processEnvironments:true,preview:"TeX"},PreProcess:function(a){if(!this.configured){this.config=MathJax.Hub.CombineConfig("tex2jax",this.config);if(this.config.Augment){MathJax.Hub.Insert(this,this.config.Augment)}if(typeof(this.config.previewTeX)!=="undefined"&&!this.config.previewTeX){this.config.preview="none"}this.configured=true}if(typeof(a)==="string"){a=document.getElementById(a)}if(!a){a=document.body}this.createPatterns();this.scanElement(a,a.nextSibling)},createPatterns:function(){var d=[],c,a,b=this.config;this.match={};for(c=0,a=b.inlineMath.length;c<a;c++){d.push(this.patternQuote(b.inlineMath[c][0]));this.match[b.inlineMath[c][0]]={mode:"",end:b.inlineMath[c][1],pattern:this.endPattern(b.inlineMath[c][1])}}for(c=0,a=b.displayMath.length;c<a;c++){d.push(this.patternQuote(b.displayMath[c][0]));this.match[b.displayMath[c][0]]={mode:"; mode=display",end:b.displayMath[c][1],pattern:this.endPattern(b.displayMath[c][1])}}this.start=new RegExp(d.sort(this.sortLength).join("|")+(b.processEnvironments?"|\\\\begin\\{([^}]*)\\}":"")+(b.processEscapes?"|\\\\*\\\\\\$":""),"g");this.skipTags=new RegExp("^("+b.skipTags.join("|")+")$","i");this.ignoreClass=new RegExp("(^| )("+b.ignoreClass+")( |$)");this.processClass=new RegExp("(^| )("+b.processClass+")( |$)")},patternQuote:function(a){return a.replace(/([\^$(){}+*?\-|\[\]\:\\])/g,"\\$1")},endPattern:function(a){return new RegExp(this.patternQuote(a)+"|\\\\.","g")},sortLength:function(d,c){if(d.length!==c.length){return c.length-d.length}return(d==c?0:(d<c?-1:1))},scanElement:function(c,b,f){var a,e,d;while(c&&c!=b){if(c.nodeName.toLowerCase()==="#text"){if(!f){c=this.scanText(c)}}else{a=(typeof(c.className)==="undefined"?"":c.className);e=(typeof(c.tagName)==="undefined"?"":c.tagName);if(typeof(a)!=="string"){a=String(a)}if(c.firstChild&&!a.match(/(^| )MathJax/)&&!this.skipTags.exec(e)){d=(f||this.ignoreClass.exec(a))&&!this.processClass.exec(a);this.scanElement(c.firstChild,b,d)}}if(c){c=c.nextSibling}}},scanText:function(b){if(b.nodeValue.replace(/\s+/,"")==""){return b}var a,c;this.search={start:true};this.pattern=this.start;while(b){this.pattern.lastIndex=0;while(b&&b.nodeName.toLowerCase()==="#text"&&(a=this.pattern.exec(b.nodeValue))){if(this.search.start){b=this.startMatch(a,b)}else{b=this.endMatch(a,b)}}if(this.search.matched){b=this.encloseMath(b)}if(b){do{c=b;b=b.nextSibling}while(b&&(b.nodeName.toLowerCase()==="br"||b.nodeName.toLowerCase()==="#comment"));if(!b||b.nodeName!=="#text"){return c}}}return b},startMatch:function(a,b){var f=this.match[a[0]];if(f!=null){this.search={end:f.end,mode:f.mode,open:b,olen:a[0].length,opos:this.pattern.lastIndex-a[0].length};this.switchPattern(f.pattern)}else{if(a[0].substr(0,6)==="\\begin"){this.search={end:"\\end{"+a[1]+"}",mode:"; mode=display",open:b,olen:0,opos:this.pattern.lastIndex-a[0].length,isBeginEnd:true};this.switchPattern(this.endPattern(this.search.end))}else{var d=a[0].substr(0,a[0].length-1),g,c;if(d.length%2===0){c=[d.replace(/\\\\/g,"\\")];g=1}else{c=[d.substr(1).replace(/\\\\/g,"\\"),"$"];g=0}c=MathJax.HTML.Element("span",null,c);var e=MathJax.HTML.TextNode(b.nodeValue.substr(0,a.index));b.nodeValue=b.nodeValue.substr(a.index+a[0].length-g);b.parentNode.insertBefore(c,b);b.parentNode.insertBefore(e,c);this.pattern.lastIndex=g}}return b},endMatch:function(a,b){if(a[0]==this.search.end){this.search.close=b;this.search.cpos=this.pattern.lastIndex;this.search.clen=(this.search.isBeginEnd?0:a[0].length);this.search.matched=true;b=this.encloseMath(b);this.switchPattern(this.start)}return b},switchPattern:function(a){a.lastIndex=this.pattern.lastIndex;this.pattern=a;this.search.start=(a===this.start)},encloseMath:function(b){var a=this.search,f=a.close,e,c;if(a.cpos===f.length){f=f.nextSibling}else{f=f.splitText(a.cpos)}if(!f){e=f=MathJax.HTML.addText(a.close.parentNode,"")}a.close=f;c=(a.opos?a.open.splitText(a.opos):a.open);while(c.nextSibling&&c.nextSibling!==f){if(c.nextSibling.nodeValue!==null){if(c.nextSibling.nodeName==="#comment"){c.nodeValue+=c.nextSibling.nodeValue.replace(/^\[CDATA\[((.|\n|\r)*)\]\]$/,"$1")}else{c.nodeValue+=c.nextSibling.nodeValue}}else{if(this.msieNewlineBug){c.nodeValue+=(c.nextSibling.nodeName.toLowerCase()==="br"?"\n":" ")}else{c.nodeValue+=" "}}c.parentNode.removeChild(c.nextSibling)}var d=c.nodeValue.substr(a.olen,c.nodeValue.length-a.olen-a.clen);c.parentNode.removeChild(c);if(this.config.preview!=="none"){this.createPreview(a.mode,d)}c=this.createMathTag(a.mode,d);this.search={};this.pattern.lastIndex=0;if(e){e.parentNode.removeChild(e)}return c},insertNode:function(b){var a=this.search;a.close.parentNode.insertBefore(b,a.close)},createPreview:function(c,a){var b;if(this.config.preview==="TeX"){b=[this.filterTeX(a)]}else{if(this.config.preview instanceof Array){b=this.config.preview}}if(b){b=MathJax.HTML.Element("span",{className:MathJax.Hub.config.preRemoveClass},b);this.insertNode(b)}},createMathTag:function(c,b){var a=document.createElement("script");a.type="math/tex"+c;MathJax.HTML.setScript(a,b);this.insertNode(a);return a},filterTeX:function(a){return a},msieNewlineBug:(MathJax.Hub.Browser.isMSIE&&document.documentMode<9)};MathJax.Hub.Register.PreProcessor(["PreProcess",MathJax.Extension.tex2jax]);MathJax.Ajax.loadComplete("[MathJax]/extensions/tex2jax.js");
+
diff --git a/static/MathJax/extensions/toMathML.js b/static/MathJax/extensions/toMathML.js
new file mode 100644
index 0000000..70203c7
--- /dev/null
+++ b/static/MathJax/extensions/toMathML.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/extensions/toMathML.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Register.LoadHook("[MathJax]/jax/element/mml/jax.js",function(){var b="1.1.1";var a=MathJax.ElementJax.mml;a.mbase.Augment({toMathML:function(k){var g=(this.inferred&&this.parent.inferRow);if(k==null){k=""}var e=this.type,d=this.MathMLattributes();if(e==="mspace"){return k+"<"+e+d+" />"}var j=[];var h=(this.isToken?"":k+(g?"":" "));for(var f=0,c=this.data.length;f<c;f++){if(this.data[f]){j.push(this.data[f].toMathML(h))}else{if(!this.isToken){j.push(h+"<mrow />")}}}if(this.isToken){return k+"<"+e+d+">"+j.join("")+"</"+e+">"}if(g){return j.join("\n")}if(j.length===0||(j.length===1&&j[0]==="")){return k+"<"+e+d+" />"}return k+"<"+e+d+">\n"+j.join("\n")+"\n"+k+"</"+e+">"},MathMLattributes:function(){var j=[],g=this.defaults;var c=this.copyAttributes,l=this.skipAttributes;if(this.type==="math"){j.push('xmlns="http://www.w3.org/1998/Math/MathML"')}if(this.type==="mstyle"){g=a.math.prototype.defaults}for(var d in g){if(!l[d]&&g.hasOwnProperty(d)){var e=(d==="open"||d==="close");if(this[d]!=null&&(e||this[d]!==g[d])){var k=this[d];delete this[d];if(e||this.Get(d)!==k){j.push(d+'="'+this.quoteHTML(k)+'"')}this[d]=k}}}for(var h=0,f=c.length;h<f;h++){if(this[c[h]]!=null){j.push(c[h]+'="'+this.quoteHTML(this[c[h]])+'"')}}if(j.length){return" "+j.join(" ")}else{return""}},copyAttributes:["fontfamily","fontsize","fontweight","fontstyle","color","background","id","class","href","style"],skipAttributes:{texClass:1,useHeight:1,texprimestyle:1},quoteHTML:function(e){e=String(e).split("");for(var f=0,d=e.length;f<d;f++){var h=e[f].charCodeAt(0);if(h<32||h>126){e[f]="&#x"+h.toString(16).toUpperCase()+";"}else{var g={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"}[e[f]];if(g){e[f]=g}}}return e.join("")}});a.msubsup.Augment({toMathML:function(h){var e=this.type;if(this.data[this.sup]==null){e="msub"}if(this.data[this.sub]==null){e="msup"}var d=this.MathMLattributes();delete this.data[0].inferred;var g=[];for(var f=0,c=this.data.length;f<c;f++){if(this.data[f]){g.push(this.data[f].toMathML(h+" "))}}return h+"<"+e+d+">\n"+g.join("\n")+"\n"+h+"</"+e+">"}});a.munderover.Augment({toMathML:function(h){var e=this.type;if(this.data[this.under]==null){e="mover"}if(this.data[this.over]==null){e="munder"}var d=this.MathMLattributes();delete this.data[0].inferred;var g=[];for(var f=0,c=this.data.length;f<c;f++){if(this.data[f]){g.push(this.data[f].toMathML(h+" "))}}return h+"<"+e+d+">\n"+g.join("\n")+"\n"+h+"</"+e+">"}});a.TeXAtom.Augment({toMathML:function(c){return c+"<mrow>\n"+this.data[0].toMathML(c+" ")+"\n"+c+"</mrow>"}});a.chars.Augment({toMathML:function(c){return(c||"")+this.quoteHTML(this.toString())}});a.entity.Augment({toMathML:function(c){return(c||"")+"&"+this.data[0]+";<!-- "+this.toString()+" -->"}});a.xml.Augment({toMathML:function(c){return(c||"")+this.toString()}});MathJax.Hub.Register.StartupHook("TeX mathchoice Ready",function(){a.TeXmathchoice.Augment({toMathML:function(c){return this.Core().toMathML(c)}})});MathJax.Hub.Startup.signal.Post("toMathML Ready")});MathJax.Ajax.loadComplete("[MathJax]/extensions/toMathML.js");
+
diff --git a/static/MathJax/extensions/v1.0-warning.js b/static/MathJax/extensions/v1.0-warning.js
new file mode 100644
index 0000000..891cf61
--- /dev/null
+++ b/static/MathJax/extensions/v1.0-warning.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/extensions/v1.0-warning.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(b,e){var d="1.1";var a={style:{position:"fixed",bottom:"4em",left:"3em",width:"40em",border:"3px solid #880000","background-color":"#E0E0E0",padding:"1em","font-size":"small","white-space":"normal","border-radius":".75em","-webkit-border-radius":".75em","-moz-border-radius":".75em","-khtml-border-radius":".75em","box-shadow":"4px 4px 10px #AAAAAA","-webkit-box-shadow":"4px 4px 10px #AAAAAA","-moz-box-shadow":"4px 4px 10px #AAAAAA","-khtml-box-shadow":"4px 4px 10px #AAAAAA",filter:"progid:DXImageTransform.Microsoft.dropshadow(OffX=3, OffY=3, Color='gray', Positive='true')"}};if(b.Browser.isIE9&&document.documentMode>=9){delete a.style.filter}var c;b.Register.StartupHook("onLoad",function(){var f=document.body;if(b.Browser.isMSIE){MathJax.Message.Init();f=document.getElementById("MathJax_MSIE_frame")||f;a.style.position="absolute"}else{delete a.style.filter}a.style.maxWidth=(document.body.clientWidth-75)+"px";c=e.addElement(f,"div",{id:"MathJax_ConfigWarning",style:a.style},[["div",{style:{position:"absolute",overflow:"hidden",top:".1em",right:".1em",border:"1px outset",width:"1em",height:"1em","text-align":"center",cursor:"pointer","background-color":"#EEEEEE",color:"#606060","border-radius":".5em","-webkit-border-radius":".5em","-moz-border-radius":".5em","-khtml-border-radius":".5em"},onclick:function(){c.style.display="none"}},[["span",{style:{position:"relative",bottom:".2em"}},["x"]]]],"MathJax no longer loads a default configuration file; you must specify such files explicitly. This page seems to use the older default ",["code",{},["config/MathJax.js"]]," file, and so needs to be updated. This is explained further at",["p",{style:{"text-align":"center"}},[["a",{href:"http://www.mathjax.org/help/configuration"},["http://www.mathjax.org/help/configuration"]]]]])})})(MathJax.Hub,MathJax.HTML);MathJax.Ajax.loadComplete("[MathJax]/extensions/v1.0-warning.js");
+
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_AMS-Regular.eot b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_AMS-Regular.eot
new file mode 100644
index 0000000..6d8ab3c
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_AMS-Regular.eot
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Caligraphic-Bold.eot b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Caligraphic-Bold.eot
new file mode 100644
index 0000000..86ce034
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Caligraphic-Bold.eot
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Caligraphic-Regular.eot b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Caligraphic-Regular.eot
new file mode 100644
index 0000000..4d0cc8d
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Caligraphic-Regular.eot
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Fraktur-Bold.eot b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Fraktur-Bold.eot
new file mode 100644
index 0000000..2f194a1
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Fraktur-Bold.eot
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Fraktur-Regular.eot b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Fraktur-Regular.eot
new file mode 100644
index 0000000..c4bcbd8
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Fraktur-Regular.eot
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Main-Bold.eot b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Main-Bold.eot
new file mode 100644
index 0000000..99ac10d
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Main-Bold.eot
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Main-Italic.eot b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Main-Italic.eot
new file mode 100644
index 0000000..9942105
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Main-Italic.eot
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Main-Regular.eot b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Main-Regular.eot
new file mode 100644
index 0000000..5e17ee7
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Main-Regular.eot
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Math-BoldItalic.eot b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Math-BoldItalic.eot
new file mode 100644
index 0000000..f5c9471
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Math-BoldItalic.eot
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Math-Italic.eot b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Math-Italic.eot
new file mode 100644
index 0000000..4a62017
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Math-Italic.eot
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Math-Regular.eot b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Math-Regular.eot
new file mode 100644
index 0000000..1a13172
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Math-Regular.eot
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_SansSerif-Bold.eot b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_SansSerif-Bold.eot
new file mode 100644
index 0000000..963cb32
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_SansSerif-Bold.eot
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_SansSerif-Italic.eot b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_SansSerif-Italic.eot
new file mode 100644
index 0000000..61967ad
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_SansSerif-Italic.eot
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_SansSerif-Regular.eot b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_SansSerif-Regular.eot
new file mode 100644
index 0000000..d9b9a41
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_SansSerif-Regular.eot
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Script-Regular.eot b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Script-Regular.eot
new file mode 100644
index 0000000..3847044
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Script-Regular.eot
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Size1-Regular.eot b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Size1-Regular.eot
new file mode 100644
index 0000000..4895211
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Size1-Regular.eot
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Size2-Regular.eot b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Size2-Regular.eot
new file mode 100644
index 0000000..98ea93e
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Size2-Regular.eot
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Size3-Regular.eot b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Size3-Regular.eot
new file mode 100644
index 0000000..bcaae4b
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Size3-Regular.eot
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Size4-Regular.eot b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Size4-Regular.eot
new file mode 100644
index 0000000..cd4552a
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Size4-Regular.eot
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Typewriter-Regular.eot b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Typewriter-Regular.eot
new file mode 100644
index 0000000..6e38b71
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_Typewriter-Regular.eot
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_WinIE6-Regular.eot b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_WinIE6-Regular.eot
new file mode 100644
index 0000000..9ca11de
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/eot/MathJax_WinIE6-Regular.eot
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_AMS-Regular.otf b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_AMS-Regular.otf
new file mode 100644
index 0000000..1f9599f
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_AMS-Regular.otf
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Caligraphic-Bold.otf b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Caligraphic-Bold.otf
new file mode 100644
index 0000000..c916b80
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Caligraphic-Bold.otf
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Caligraphic-Regular.otf b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Caligraphic-Regular.otf
new file mode 100644
index 0000000..8b97a38
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Caligraphic-Regular.otf
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Fraktur-Bold.otf b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Fraktur-Bold.otf
new file mode 100644
index 0000000..d1e654b
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Fraktur-Bold.otf
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Fraktur-Regular.otf b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Fraktur-Regular.otf
new file mode 100644
index 0000000..453a6eb
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Fraktur-Regular.otf
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Main-Bold.otf b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Main-Bold.otf
new file mode 100644
index 0000000..d01cff3
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Main-Bold.otf
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Main-Italic.otf b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Main-Italic.otf
new file mode 100644
index 0000000..2da28b9
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Main-Italic.otf
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Main-Regular.otf b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Main-Regular.otf
new file mode 100644
index 0000000..7a5a36b
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Main-Regular.otf
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Math-BoldItalic.otf b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Math-BoldItalic.otf
new file mode 100644
index 0000000..166e193
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Math-BoldItalic.otf
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Math-Italic.otf b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Math-Italic.otf
new file mode 100644
index 0000000..5047bdc
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Math-Italic.otf
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Math-Regular.otf b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Math-Regular.otf
new file mode 100644
index 0000000..144cfad
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Math-Regular.otf
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_SansSerif-Bold.otf b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_SansSerif-Bold.otf
new file mode 100644
index 0000000..1e4c683
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_SansSerif-Bold.otf
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_SansSerif-Italic.otf b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_SansSerif-Italic.otf
new file mode 100644
index 0000000..b016289
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_SansSerif-Italic.otf
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_SansSerif-Regular.otf b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_SansSerif-Regular.otf
new file mode 100644
index 0000000..e690927
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_SansSerif-Regular.otf
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Script-Regular.otf b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Script-Regular.otf
new file mode 100644
index 0000000..2da24cc
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Script-Regular.otf
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Size1-Regular.otf b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Size1-Regular.otf
new file mode 100644
index 0000000..70bbaff
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Size1-Regular.otf
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Size2-Regular.otf b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Size2-Regular.otf
new file mode 100644
index 0000000..270739b
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Size2-Regular.otf
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Size3-Regular.otf b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Size3-Regular.otf
new file mode 100644
index 0000000..f3ab733
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Size3-Regular.otf
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Size4-Regular.otf b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Size4-Regular.otf
new file mode 100644
index 0000000..fd84193
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Size4-Regular.otf
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Typewriter-Regular.otf b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Typewriter-Regular.otf
new file mode 100644
index 0000000..becc64a
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_Typewriter-Regular.otf
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_WinChrome-Regular.otf b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_WinChrome-Regular.otf
new file mode 100644
index 0000000..71bd7c0
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_WinChrome-Regular.otf
Binary files differ
diff --git a/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_WinIE6-Regular.otf b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_WinIE6-Regular.otf
new file mode 100644
index 0000000..2bde816
--- /dev/null
+++ b/static/MathJax/fonts/HTML-CSS/TeX/otf/MathJax_WinIE6-Regular.otf
Binary files differ
diff --git a/static/MathJax/jax/element/mml/jax.js b/static/MathJax/jax/element/mml/jax.js
new file mode 100644
index 0000000..9f7bce8
--- /dev/null
+++ b/static/MathJax/jax/element/mml/jax.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/element/mml/jax.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.ElementJax.mml=MathJax.ElementJax({mimeType:"jax/mml"},{id:"mml",version:"1.1.1",directory:MathJax.ElementJax.directory+"/mml",extensionDir:MathJax.ElementJax.extensionDir+"/mml",optableDir:MathJax.ElementJax.directory+"/mml/optable"});MathJax.ElementJax.mml.Augment({Init:function(){if(arguments.length===1&&arguments[0].type==="math"){this.root=arguments[0]}else{this.root=MathJax.ElementJax.mml.math.apply(this,arguments)}if(this.root.mode){if(!this.root.display&&this.root.mode==="display"){this.root.display="block"}delete this.root.mode}}},{INHERIT:"_inherit_",AUTO:"_auto_",SIZE:{INFINITY:"infinity",SMALL:"small",NORMAL:"normal",BIG:"big"},COLOR:{TRANSPARENT:"transparent"},VARIANT:{NORMAL:"normal",BOLD:"bold",ITALIC:"italic",BOLDITALIC:"bold-italic",DOUBLESTRUCK:"double-struck",FRAKTUR:"fraktur",BOLDFRAKTUR:"bold-fraktur",SCRIPT:"script",BOLDSCRIPT:"bold-script",SANSSERIF:"sans-serif",BOLDSANSSERIF:"bold-sans-serif",SANSSERIFITALIC:"sans-serif-italic",SANSSERIFBOLDITALIC:"sans-serif-bold-italic",MONOSPACE:"monospace",INITIAL:"inital",TAILED:"tailed",LOOPED:"looped",STRETCHED:"stretched",CALIGRAPHIC:"-tex-caligraphic",OLDSTYLE:"-tex-oldstyle"},FORM:{PREFIX:"prefix",INFIX:"infix",POSTFIX:"postfix"},LINEBREAK:{AUTO:"auto",NEWLINE:"newline",NOBREAK:"nobreak",GOODBREAK:"goodbreak",BADBREAK:"badbreak"},LINEBREAKSTYLE:{BEFORE:"before",AFTER:"after",DUPLICATE:"duplicate",INFIXLINBREAKSTYLE:"infixlinebreakstyle"},INDENTALIGN:{LEFT:"left",CENTER:"center",RIGHT:"right",AUTO:"auto",ID:"id",INDENTALIGN:"indentalign"},INDENTSHIFT:{INDENTSHIFT:"indentshift"},LINETHICKNESS:{THIN:"thin",MEDIUM:"medium",THICK:"thick"},NOTATION:{LONGDIV:"longdiv",ACTUARIAL:"actuarial",RADICAL:"radical",BOX:"box",ROUNDEDBOX:"roundedbox",CIRCLE:"circle",LEFT:"left",RIGHT:"right",TOP:"top",BOTTOM:"bottom",UPDIAGONALSTRIKE:"updiagonalstrike",DOWNDIAGONALSTRIKE:"downdiagonalstrike",VERTICALSTRIKE:"verticalstrike",HORIZONTALSTRIKE:"horizontalstrike",MADRUWB:"madruwb"},ALIGN:{TOP:"top",BOTTOM:"bottom",CENTER:"center",BASELINE:"baseline",AXIS:"axis",LEFT:"left",RIGHT:"right"},LINES:{NONE:"none",SOLID:"solid",DASHED:"dashed"},SIDE:{LEFT:"left",RIGHT:"right",LEFTOVERLAP:"leftoverlap",RIGHTOVERLAP:"rightoverlap"},WIDTH:{AUTO:"auto",FIT:"fit"},ACTIONTYPE:{TOGGLE:"toggle",STATUSLINE:"statusline",TOOLTIP:"tooltip",INPUT:"input"},LENGTH:{VERYVERYTHINMATHSPACE:"veryverythinmathspace",VERYTHINMATHSPACE:"verythinmathspace",THINMATHSPACE:"thinmathspace",MEDIUMMATHSPACE:"mediummathspace",THICKMATHSPACE:"thickmathspace",VERYTHICKMATHSPACE:"verythickmathspace",VERYVERYTHICKMATHSPACE:"veryverythickmathspace",NEGATIVEVERYVERYTHINMATHSPACE:"negativeveryverythinmathspace",NEGATIVEVERYTHINMATHSPACE:"negativeverythinmathspace",NEGATIVETHINMATHSPACE:"negativethinmathspace",NEGATIVEMEDIUMMATHSPACE:"negativemediummathspace",NEGATIVETHICKMATHSPACE:"negativethickmathspace",NEGATIVEVERYTHICKMATHSPACE:"negativeverythickmathspace",NEGATIVEVERYVERYTHICKMATHSPACE:"negativeveryverythickmathspace"},OVERFLOW:{LINBREAK:"linebreak",SCROLL:"scroll",ELIDE:"elide",TRUNCATE:"truncate",SCALE:"scale"},UNIT:{EM:"em",EX:"ex",PX:"px",IN:"in",CM:"cm",MM:"mm",PT:"pt",PC:"pc"},TEXCLASS:{ORD:0,OP:1,BIN:2,REL:3,OPEN:4,CLOSE:5,PUNCT:6,INNER:7,VCENTER:8,NONE:-1},PLANE1:String.fromCharCode(55349)});(function(a){var d=false;var b=true;a.mbase=MathJax.Object.Subclass({type:"base",isToken:d,defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT},noInherit:{},Init:function(){this.data=[];if(this.inferRow&&!(arguments.length===1&&arguments[0].inferred)){this.Append(a.mrow().With({inferred:b}))}this.Append.apply(this,arguments)},With:function(f){for(var g in f){if(f.hasOwnProperty(g)){this[g]=f[g]}}return this},Append:function(){if(this.inferRow&&this.data.length){this.data[0].Append.apply(this.data[0],arguments)}else{for(var g=0,f=arguments.length;g<f;g++){this.SetData(this.data.length,arguments[g])}}},SetData:function(f,g){if(g!=null){if(!(g instanceof a.mbase)){g=(this.isToken?a.chars(g):a.mtext(g))}g.parent=this;g.setInherit(this.inheritFromMe?this:this.inherit)}this.data[f]=g},Parent:function(){var f=this.parent;while(f&&f.inferred){f=f.parent}return f},Get:function(g,k){if(typeof(this[g])!=="undefined"){return this[g]}var h=this.Parent();if(h&&h["adjustChild_"+g]!=null){return(h["adjustChild_"+g])(h.childPosition(this))}var j=this.inherit;var f=j;while(j){if(typeof(j[g])!=="undefined"){var i=j.noInherit[this.type];if(!(i&&i[g])){return j[g]}}f=j;j=j.inherit}if(!k){if(this.defaults[g]===a.AUTO){return this.autoDefault(g)}if(this.defaults[g]!==a.INHERIT&&this.defaults[g]!=null){return this.defaults[g]}if(f){return f.defaults[g]}}return null},hasValue:function(f){return(this.Get(f,true)!=null)},getValues:function(){var g={};for(var h=0,f=arguments.length;h<f;h++){g[arguments[h]]=this.Get(arguments[h])}return g},adjustChild_scriptlevel:function(f){return this.Get("scriptlevel")},adjustChild_displaystyle:function(f){return this.Get("displaystyle")},adjustChild_texprimestyle:function(f){return this.Get("texprimestyle")},childPosition:function(h){if(h.parent.inferred){h=h.parent}for(var g=0,f=this.data.length;g<f;g++){if(this.data[g]===h){return g}}return null},setInherit:function(h){if(h!==this.inherit&&this.inherit==null){this.inherit=h;for(var g=0,f=this.data.length;g<f;g++){if(this.data[g]&&this.data[g].setInherit){this.data[g].setInherit(h)}}}},setTeXclass:function(f){this.getPrevClass(f);return(typeof(this.texClass)!=="undefined"?this:f)},getPrevClass:function(f){if(f){this.prevClass=f.Get("texClass");this.prevLevel=f.Get("scriptlevel")}},updateTeXclass:function(f){if(f){this.prevClass=f.prevClass;delete f.prevClass;this.prevLevel=f.prevLevel;delete f.prevLevel;this.texClass=f.Get("texClass")}},texSpacing:function(){var g=(this.prevClass!=null?this.prevClass:a.TEXCLASS.NONE);var f=(this.Get("texClass")||a.TEXCLASS.ORD);if(g===a.TEXCLASS.NONE||f===a.TEXCLASS.NONE){return""}if(g===a.TEXCLASS.VCENTER){g=a.TEXCLASS.ORD}if(f===a.TEXCLASS.VCENTER){f=a.TEXCLASS.ORD}var h=this.TEXSPACE[g][f];if(this.prevLevel>0&&this.Get("scriptlevel")>0&&h>=0){return""}return this.TEXSPACELENGTH[Math.abs(h)]},TEXSPACELENGTH:["",a.LENGTH.THINMATHSPACE,a.LENGTH.MEDIUMMATHSPACE,a.LENGTH.THICKMATHSPACE],TEXSPACE:[[0,-1,2,3,0,0,0,1],[-1,-1,0,3,0,0,0,1],[2,2,0,0,2,0,0,2],[3,3,0,0,3,0,0,3],[0,0,0,0,0,0,0,0],[0,-1,2,3,0,0,0,1],[1,1,0,1,1,1,1,1],[1,-1,2,3,1,0,1,1]],autoDefault:function(f){return""},isSpacelike:function(){return d},isEmbellished:function(){return d},Core:function(){return this},CoreMO:function(){return this},lineBreak:function(){if(this.isEmbellished()){return this.CoreMO().lineBreak()}else{return"none"}},array:function(){if(this.inferred){return this.data}else{return[this]}},toString:function(){return this.type+"("+this.data.join(",")+")"}},{childrenSpacelike:function(){for(var f=0;f<this.data.length;f++){if(!this.data[f].isSpacelike()){return d}}return b},childEmbellished:function(){return(this.data[0]&&this.data[0].isEmbellished())},childCore:function(){return this.data[0]},childCoreMO:function(){return(this.data[0]?this.data[0].CoreMO():null)},setChildTeXclass:function(f){if(this.data[0]){f=this.data[0].setTeXclass(f);this.updateTeXclass(this.data[0])}return f},setBaseTeXclasses:function(h){this.getPrevClass(h);this.texClass=null;if(this.isEmbellished()){h=this.data[0].setTeXclass(h);this.updateTeXclass(this.Core())}else{if(this.data[0]){this.data[0].setTeXclass()}h=this}for(var g=1,f=this.data.length;g<f;g++){if(this.data[g]){this.data[g].setTeXclass()}}return h},setSeparateTeXclasses:function(h){this.getPrevClass(h);for(var g=0,f=this.data.length;g<f;g++){if(this.data[g]){this.data[g].setTeXclass()}}if(this.isEmbellished()){this.updateTeXclass(this.Core())}return this}});a.mi=a.mbase.Subclass({type:"mi",isToken:b,texClass:a.TEXCLASS.ORD,defaults:{mathvariant:a.AUTO,mathsize:a.INHERIT,mathbackground:a.INHERIT,mathcolor:a.INHERIT},autoDefault:function(g){if(g==="mathvariant"){var f=(this.data[0]||"").toString();return(f.length===1||(f.length===2&&f.charCodeAt(0)===this.PLANE1)?a.VARIANT.ITALIC:a.VARIANT.NORMAL)}return""}});a.mn=a.mbase.Subclass({type:"mn",isToken:b,texClass:a.TEXCLASS.ORD,defaults:{mathvariant:a.INHERIT,mathsize:a.INHERIT,mathbackground:a.INHERIT,mathcolor:a.INHERIT}});a.mo=a.mbase.Subclass({type:"mo",isToken:b,defaults:{mathvariant:a.INHERIT,mathsize:a.INHERIT,mathbackground:a.INHERIT,mathcolor:a.INHERIT,form:a.AUTO,fence:a.AUTO,separator:a.AUTO,lspace:a.AUTO,rspace:a.AUTO,stretchy:a.AUTO,symmetric:a.AUTO,maxsize:a.AUTO,minsize:a.AUTO,largeop:a.AUTO,movablelimits:a.AUTO,accent:a.AUTO,linebreak:a.LINEBREAK.AUTO,lineleading:a.INHERIT,linebreakstyle:a.AUTO,linebreakmultchar:a.INHERIT,indentalign:a.INHERIT,indentshift:a.INHERIT,indenttarget:a.INHERIT,indentalignfirst:a.INHERIT,indentshiftfirst:a.INHERIT,indentalignlast:a.INHERIT,indentshiftlast:a.INHERIT,texClass:a.AUTO},defaultDef:{form:a.FORM.INFIX,fence:d,separator:d,lspace:a.LENGTH.THICKMATHSPACE,rspace:a.LENGTH.THICKMATHSPACE,stretchy:d,symmetric:b,maxsize:a.SIZE.INFINITY,minsize:"0em",largeop:d,movablelimits:d,accent:d,linebreak:a.LINEBREAK.AUTO,lineleading:"1ex",linebreakstyle:"before",indentalign:a.INDENTALIGN.AUTO,indentshift:"0",indenttarget:"",indentalignfirst:a.INDENTALIGN.INDENTALIGN,indentshiftfirst:a.INDENTSHIFT.INDENTSHIFT,indentalignlast:a.INDENTALIGN.INDENTALIGN,indentshiftlast:a.INDENTSHIFT.INDENTSHIFT,texClass:a.TEXCLASS.REL},SPACE_ATTR:{lspace:1,rspace:2,form:4},useMMLspacing:7,autoDefault:function(h,o){var n=this.def;if(!n){if(h==="form"){this.useMMLspacing&=~this.SPACE_ATTR.form;return this.getForm()}var l=this.data.join("");var g=[this.Get("form"),a.FORM.INFIX,a.FORM.POSTFIX,a.FORM.PREFIX];for(var j=0,f=g.length;j<f;j++){var k=this.OPTABLE[g[j]][l];if(k){n=this.makeDef(k);break}}if(!n){n=this.CheckRange(l)}if(!n&&o){n={}}else{if(!n){n=MathJax.Hub.Insert({},this.defaultDef)}n.form=g[0];this.def=n}}this.useMMLspacing&=~(this.SPACE_ATTR[h]||0);if(n[h]!=null){return n[h]}else{if(!o){return this.defaultDef[h]}}return""},CheckRange:function(k){var l=k.charCodeAt(0);if(k.charAt(0)===a.PLANE1){l=k.charCodeAt(1)+119808-56320}for(var h=0,f=this.RANGES.length;h<f&&this.RANGES[h][0]<=l;h++){if(l<=this.RANGES[h][1]){if(this.RANGES[h][3]){var g=a.optableDir+"/"+this.RANGES[h][3]+".js";this.RANGES[h][3]=null;MathJax.Hub.RestartAfter(MathJax.Ajax.Require(g))}var j=(["ORD","OP","BIN","REL","OPEN","CLOSE","PUNCT","INNER"])[this.RANGES[h][2]];j=this.OPTABLE.infix[k]=a.mo.OPTYPES[j==="BIN"?"BIN3":j];return this.makeDef(j)}}return null},makeDef:function(g){if(g[2]==null){g[2]=this.defaultDef.texClass}if(!g[3]){g[3]={}}var f=MathJax.Hub.Insert({},g[3]);f.lspace=this.SPACE[g[0]];f.rspace=this.SPACE[g[1]];f.texClass=g[2];return f},getForm:function(){var f=this,h=this.parent,g=this.Parent();while(g&&g.isEmbellished()){f=h;h=g.parent;g=g.Parent()}if(h&&h.type==="mrow"&&h.NonSpaceLength()!==1){if(h.FirstNonSpace()===f){return a.FORM.PREFIX}if(h.LastNonSpace()===f){return a.FORM.POSTFIX}}return a.FORM.INFIX},isEmbellished:function(){return b},lineBreak:function(){var f=this.getValues("linebreak","linebreakstyle");if(f.linebreak===a.LINEBREAK.NEWLINE){if(f.linebreakstyle===a.LINEBREAKSTYLE.INFIXLINEBREAKSTYLE){f.linebreakstyle=this.Get("infixlinebreakstyle")}return f.linebreakstyle}return"none"},setTeXclass:function(f){this.getValues("lspace","rspace");if(this.useMMLspacing){this.texClass=a.TEXCLASS.NONE;return this}this.texClass=this.Get("texClass");if(f){this.prevClass=f.texClass||a.TEXCLASS.ORD;this.prevLevel=f.Get("scriptlevel")}else{this.prevClass=a.TEXCLASS.NONE}if(this.texClass===a.TEXCLASS.BIN&&(this.prevClass===a.TEXCLASS.NONE||this.prevClass===a.TEXCLASS.BIN||this.prevClass===a.TEXCLASS.OP||this.prevClass===a.TEXCLASS.REL||this.prevClass===a.TEXCLASS.OPEN||this.prevClass===a.TEXCLASS.PUNCT)){this.texClass=a.TEXCLASS.ORD}else{if(this.prevClass===a.TEXCLASS.BIN&&(this.texClass===a.TEXCLASS.REL||this.texClass===a.TEXCLASS.CLOSE||this.texClass===a.TEXCLASS.PUNCT)){f.texClass=this.prevClass=a.TEXCLASS.ORD}}return this}});a.mtext=a.mbase.Subclass({type:"mtext",isToken:b,isSpacelike:function(){return b},texClass:a.TEXCLASS.ORD,defaults:{mathvariant:a.INHERIT,mathsize:a.INHERIT,mathbackground:a.INHERIT,mathcolor:a.INHERIT}});a.mspace=a.mbase.Subclass({type:"mspace",isToken:b,isSpacelike:function(){return b},defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,width:"0em",height:"0ex",depth:"0ex",linebreak:a.LINEBREAK.AUTO},lineBreak:function(){return(this.Get("linebreak")===a.LINEBREAK.NEWLINE?a.LINEBREAKSTYLE.AFTER:"none")}});a.ms=a.mbase.Subclass({type:"ms",isToken:b,texClass:a.TEXCLASS.ORD,defaults:{mathvariant:a.INHERIT,mathsize:a.INHERIT,mathbackground:a.INHERIT,mathcolor:a.INHERIT,lquote:'"',rquote:'"'}});a.mglyph=a.mbase.Subclass({type:"mglyph",isToken:b,texClass:a.TEXCLASS.ORD,defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,alt:"",src:"",width:a.AUTO,height:a.AUTO,valign:"0em"}});a.mrow=a.mbase.Subclass({type:"mrow",isSpacelike:a.mbase.childrenSpacelike,inferred:d,isEmbellished:function(){var g=d;for(var h=0,f=this.data.length;h<f;h++){if(this.data[h]==null){continue}if(this.data[h].isEmbellished()){if(g){return d}g=b;this.core=h}else{if(!this.data[h].isSpacelike()){return d}}}return g},NonSpaceLength:function(){var h=0;for(var g=0,f=this.data.length;g<f;g++){if(this.data[g]&&!this.data[g].isSpacelike()){h++}}return h},FirstNonSpace:function(){for(var g=0,f=this.data.length;g<f;g++){if(this.data[g]&&!this.data[g].isSpacelike()){return this.data[g]}}return null},LastNonSpace:function(){for(var f=this.data.length-1;f>=0;f--){if(this.data[0]&&!this.data[f].isSpacelike()){return this.data[f]}}return null},Core:function(){if(!(this.isEmbellished())||typeof(this.core)==="undefined"){return this}return this.data[this.core]},CoreMO:function(){if(!(this.isEmbellished())||typeof(this.core)==="undefined"){return this}return this.data[this.core].CoreMO()},toString:function(){if(this.inferred){return"["+this.data.join(",")+"]"}return this.SUPER(arguments).toString.call(this)},setTeXclass:function(h){for(var g=0,f=this.data.length;g<f;g++){if(this.data[g]){h=this.data[g].setTeXclass(h)}}if(this.data[0]){this.updateTeXclass(this.data[0])}return h}});a.mfrac=a.mbase.Subclass({type:"mfrac",num:0,den:1,texClass:a.TEXCLASS.INNER,isEmbellished:a.mbase.childEmbellished,Core:a.mbase.childCore,CoreMO:a.mbase.childCoreMO,defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,linethickness:a.LINETHICKNESS.MEDIUM,numalign:a.ALIGN.CENTER,denomalign:a.ALIGN.CENTER,bevelled:d},adjustChild_displaystyle:function(f){return d},adjustChild_scriptlevel:function(g){var f=this.Get("scriptlevel");if(!this.Get("displaystyle")||f>0){f++}return f},adjustChild_texprimestyle:function(f){if(f==this.den){return true}return this.Get("texprimestyle")},setTeXclass:a.mbase.setSeparateTeXclasses});a.msqrt=a.mbase.Subclass({type:"msqrt",inferRow:b,texClass:a.TEXCLASS.ORD,setTeXclass:a.mbase.setSeparateTeXclasses,adjustChild_texprimestyle:function(f){return b}});a.mroot=a.mbase.Subclass({type:"mroot",texClass:a.TEXCLASS.ORD,adjustChild_displaystyle:function(f){if(f===1){return d}return this.Get("displaystyle")},adjustChild_scriptlevel:function(g){var f=this.Get("scriptlevel");if(g===1){f+=2}return f},adjustChild_texprimestyle:function(f){if(f===0){return b}return this.Get("texprimestyle")},setTeXclass:a.mbase.setSeparateTeXclasses});a.mstyle=a.mbase.Subclass({type:"mstyle",isSpacelike:a.mbase.childrenSpacelike,isEmbellished:a.mbase.childEmbellished,Core:a.mbase.childCore,CoreMO:a.mbase.childCoreMO,inferRow:b,defaults:{scriptlevel:a.INHERIT,displaystyle:a.INHERIT,scriptsizemultiplier:Math.sqrt(1/2),scriptminsize:"8pt",mathbackground:a.INHERIT,mathcolor:a.INHERIT,infixlinebreakstyle:a.LINEBREAKSTYLE.BEFORE,decimalseparator:"."},adjustChild_scriptlevel:function(h){var g=this.scriptlevel;if(g==null){g=this.Get("scriptlevel")}else{if(String(g).match(/^ *[-+]/)){delete this.scriptlevel;var f=this.Get("scriptlevel");this.scriptlevel=g;g=f+parseInt(g)}}return g},inheritFromMe:b,noInherit:{mpadded:{width:b,height:b,depth:b,lspace:b,voffset:b},mtable:{width:b,height:b,depth:b,align:b}},setTeXclass:a.mbase.setChildTeXclass});a.merror=a.mbase.Subclass({type:"merror",inferRow:b,texClass:a.TEXCLASS.ORD});a.mpadded=a.mbase.Subclass({type:"mpadded",inferRow:b,isSpacelike:a.mbase.childrenSpacelike,isEmbellished:a.mbase.childEmbellished,Core:a.mbase.childCore,CoreMO:a.mbase.childCoreMO,defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,width:"",height:"",depth:"",lspace:0,voffset:0},setTeXclass:a.mbase.setChildTeXclass});a.mphantom=a.mbase.Subclass({type:"mphantom",texClass:a.TEXCLASS.ORD,inferRow:b,isSpacelike:a.mbase.childrenSpacelike,isEmbellished:a.mbase.childEmbellished,Core:a.mbase.childCore,CoreMO:a.mbase.childCoreMO,setTeXclass:a.mbase.setChildTeXclass});a.mfenced=a.mbase.Subclass({type:"mfenced",defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,open:"(",close:")",separators:","},texClass:a.TEXCLASS.OPEN,setTeXclass:function(j){this.getPrevClass(j);var g=this.getValues("open","close","separators");g.open=g.open.replace(/[ \t\n\r]/g,"");g.close=g.close.replace(/[ \t\n\r]/g,"");g.separators=g.separators.replace(/[ \t\n\r]/g,"");if(g.open!==""){this.SetData("open",a.mo(g.open).With({stretchy:true,texClass:a.TEXCLASS.OPEN}));j=this.data.open.setTeXclass(j)}if(g.separators!==""){while(g.separators.length<this.data.length){g.separators+=g.separators.charAt(g.separators.length-1)}}if(this.data[0]){j=this.data[0].setTeXclass(j)}for(var h=1,f=this.data.length;h<f;h++){if(this.data[h]){if(g.separators!==""){this.SetData("sep"+h,a.mo(g.separators.charAt(h-1)));j=this.data["sep"+h].setTeXclass(j)}j=this.data[h].setTeXclass(j)}}if(g.close!==""){this.SetData("close",a.mo(g.close).With({stretchy:true,texClass:a.TEXCLASS.CLOSE}));j=this.data.close.setTeXclass(j)}this.updateTeXclass(this.data.open);return j}});a.menclose=a.mbase.Subclass({type:"menclose",inferRow:b,defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,notation:a.NOTATION.LONGDIV,texClass:a.TEXCLASS.ORD},setTeXclass:a.mbase.setSeparateTeXclasses});a.msubsup=a.mbase.Subclass({type:"msubsup",base:0,sub:1,sup:2,isEmbellished:a.mbase.childEmbellished,Core:a.mbase.childCore,CoreMO:a.mbase.childCoreMO,defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,subscriptshift:"",superscriptshift:"",texClass:a.AUTO},autoDefault:function(f){if(f==="texClass"){return(this.isEmbellished()?this.CoreMO().Get(f):a.TEXCLASS.ORD)}return 0},adjustChild_displaystyle:function(f){if(f>0){return d}return this.Get("displaystyle")},adjustChild_scriptlevel:function(g){var f=this.Get("scriptlevel");if(g>0){f++}return f},adjustChild_texprimestyle:function(f){if(f===this.sub){return b}return this.Get("texprimestyle")},setTeXclass:a.mbase.setBaseTeXclasses});a.msub=a.msubsup.Subclass({type:"msub"});a.msup=a.msubsup.Subclass({type:"msup",sub:2,sup:1});a.mmultiscripts=a.msubsup.Subclass({type:"mmultiscripts",adjustChild_texprimestyle:function(f){if(f%2===1){return b}return this.Get("texprimestyle")}});a.mprescripts=a.mbase.Subclass({type:"mprescripts"});a.none=a.mbase.Subclass({type:"none"});a.munderover=a.mbase.Subclass({type:"munderover",base:0,under:1,over:2,sub:1,sup:2,ACCENTS:["","accentunder","accent"],isEmbellished:a.mbase.childEmbellished,Core:a.mbase.childCore,CoreMO:a.mbase.childCoreMO,defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,accent:a.AUTO,accentunder:a.AUTO,align:a.ALIGN.CENTER,texClass:a.AUTO,subscriptshift:"",superscriptshift:""},autoDefault:function(f){if(f==="texClass"){return(this.isEmbellished()?this.CoreMO().Get(f):a.TEXCLASS.ORD)}if(f==="accent"&&this.data[this.over]){return this.data[this.over].CoreMO().Get("accent")}if(f==="accentunder"&&this.data[this.under]){return this.data[this.under].CoreMO().Get("accent")}return d},adjustChild_displaystyle:function(f){if(f>0){return d}return this.Get("displaystyle")},adjustChild_scriptlevel:function(g){var f=this.Get("scriptlevel");if(g==this.under&&!this.Get("accentunder")){f++}if(g==this.over&&!this.Get("accent")){f++}return f},adjustChild_texprimestyle:function(f){if(f===this.base&&this.data[this.over]){return b}return this.Get("texprimestyle")},setTeXclass:a.mbase.setBaseTeXclasses});a.munder=a.munderover.Subclass({type:"munder"});a.mover=a.munderover.Subclass({type:"mover",over:1,under:2,sup:1,sub:2,ACCENTS:["","accent","accentunder"]});a.mtable=a.mbase.Subclass({type:"mtable",defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,align:a.ALIGN.AXIS,rowalign:a.ALIGN.BASELINE,columnalign:a.ALIGN.CENTER,groupalign:"{left}",alignmentscope:b,columnwidth:a.WIDTH.AUTO,width:a.WIDTH.AUTO,rowspacing:"1ex",columnspacing:".8em",rowlines:a.LINES.NONE,columnlines:a.LINES.NONE,frame:a.LINES.NONE,framespacing:"0.4em 0.5ex",equalrows:d,equalcolumns:d,displaystyle:d,side:a.SIDE.RIGHT,minlabelspacing:"0.8em",texClass:a.TEXCLASS.ORD,useHeight:1},inheritFromMe:b,noInherit:{mtable:{align:b,rowalign:b,columnalign:b,groupalign:b,alignmentscope:b,columnwidth:b,width:b,rowspacing:b,columnspacing:b,rowlines:b,columnlines:b,frame:b,framespacing:b,equalrows:b,equalcolumns:b,side:b,minlabelspacing:b,texClass:b,useHeight:1}},Append:function(){for(var g=0,f=arguments.length;g<f;g++){if(!((arguments[g] instanceof a.mtr)||(arguments[g] instanceof a.mlabeledtr))){arguments[g]=a.mtd(arguments[g])}}this.SUPER(arguments).Append.apply(this,arguments)},setTeXclass:a.mbase.setSeparateTeXclasses});a.mtr=a.mbase.Subclass({type:"mtr",defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,rowalign:a.INHERIT,columnalign:a.INHERIT,groupalign:a.INHERIT},inheritFromMe:b,noInherit:{mrow:{rowalign:b,columnalign:b,groupalign:b},mtable:{rowalign:b,columnalign:b,groupalign:b}},Append:function(){for(var g=0,f=arguments.length;g<f;g++){if(!(arguments[g] instanceof a.mtd)){arguments[g]=a.mtd(arguments[g])}}this.SUPER(arguments).Append.apply(this,arguments)},setTeXclass:a.mbase.setSeparateTeXclasses});a.mtd=a.mbase.Subclass({type:"mtd",inferRow:b,isEmbellished:a.mbase.childEmbellished,Core:a.mbase.childCore,CoreMO:a.mbase.childCoreMO,defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,rowspan:1,columnspan:1,rowalign:a.INHERIT,columnalign:a.INHERIT,groupalign:a.INHERIT},setTeXclass:a.mbase.setSeparateTeXclasses});a.maligngroup=a.mbase.Subclass({type:"malign",isSpacelike:function(){return b},defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,groupalign:a.INHERIT},inheritFromMe:b,noInherit:{mrow:{groupalign:b},mtable:{groupalign:b}}});a.malignmark=a.mbase.Subclass({type:"malignmark",defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,edge:a.SIDE.LEFT},isSpacelike:function(){return b}});a.mlabeledtr=a.mtr.Subclass({type:"mlabeledtr"});a.maction=a.mbase.Subclass({type:"maction",defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,actiontype:a.ACTIONTYPE.TOGGLE,selection:1},selected:function(){return this.data[this.Get("selection")-1]||a.NULL},isEmbellished:function(){return this.selected().isEmbellished()},isSpacelike:function(){return this.selected().isSpacelike()},Core:function(){return this.selected().Core()},CoreMO:function(){return this.selected().CoreMO()},setTeXclass:function(f){return this.selected().setTeXclass(f)}});a.semantics=a.mbase.Subclass({type:"semantics",isEmbellished:a.mbase.childEmbellished,Core:a.mbase.childCore,CoreMO:a.mbase.childCoreMO,defaults:{definitionURL:null,encoding:null},setTeXclass:a.mbase.setChildTeXclass});a.annotation=a.mbase.Subclass({type:"annotation",isToken:b,defaults:{definitionURL:null,encoding:null,cd:"mathmlkeys",name:"",src:null}});a["annotation-xml"]=a.mbase.Subclass({type:"annotation-xml",defaults:{definitionURL:null,encoding:null,cd:"mathmlkeys",name:"",src:null}});a.math=a.mstyle.Subclass({type:"math",defaults:{mathvariant:a.VARIANT.NORMAL,mathsize:a.SIZE.NORMAL,mathcolor:"",mathbackground:a.COLOR.TRANSPARENT,scriptlevel:0,displaystyle:a.AUTO,display:"inline",maxwidth:"",overflow:a.OVERFLOW.LINEBREAK,altimg:"","altimg-width":"","altimg-height":"","altimg-valign":"",alttext:"",cdgroup:"",scriptsizemultiplier:Math.sqrt(1/2),scriptminsize:"8px",infixlinebreakstyle:a.LINEBREAKSTYLE.BEFORE,lineleading:"1ex",indentshift:"auto",indentalign:a.INDENTALIGN.AUTO,indentalignfirst:a.INDENTALIGN.INDENTALIGN,indentshiftfirst:a.INDENTSHIFT.INDENTSHIFT,decimalseparator:".",texprimestyle:d},autoDefault:function(f){if(f==="displaystyle"){return this.Get("display")==="block"}return""},setTeXclass:a.mbase.setChildTeXclass});a.chars=a.mbase.Subclass({type:"chars",Append:function(){this.data.push.apply(this.data,arguments)},value:function(){return this.data.join("")},toString:function(){return this.data.join("")}});a.entity=a.mbase.Subclass({type:"entity",Append:function(){this.data.push.apply(this.data,arguments)},value:function(){if(this.data[0].substr(0,2)==="#x"){return parseInt(this.data[0].substr(2),16)}else{if(this.data[0].substr(0,1)==="#"){return parseInt(this.data[0].substr(1))}else{return 0}}},toString:function(){var f=this.value();if(f<=65535){return String.fromCharCode(f)}return this.PLANE1+String.fromCharCode(f-119808+56320)}});a.xml=a.mbase.Subclass({type:"xml",Init:function(){this.div=document.createElement("div");return this.SUPER(arguments).Init.apply(this,arguments)},Append:function(){for(var g=0,f=arguments.length;g<f;g++){var h=this.Import(arguments[g]);this.data.push(h);this.div.appendChild(h)}},Import:function(k){if(document.importNode){return document.importNode(k,true)}var g,h,f;if(k.nodeType===1){g=document.createElement(k.nodeName);if(k.className){g.className=iNode.className}for(h=0,f=k.attributes.length;h<f;h++){var j=k.attributes[h];if(j.specified&&j.nodeValue!=null&&j.nodeValue!=""){g.setAttribute(j.nodeName,j.nodeValue)}if(j.nodeName==="style"){g.style.cssText=j.nodeValue}}if(k.className){g.className=k.className}}else{if(k.nodeType===3||k.nodeType===4){g=document.createTextNode(k.nodeValue)}else{if(k.nodeType===8){g=document.createComment(k.nodeValue)}else{return document.createTextNode("")}}}for(h=0,f=k.childNodes.length;h<f;h++){g.appendChild(this.Import(k.childNodes[h]))}return g},value:function(){return this.div},toString:function(){return this.div.innerHTML}});a.TeXAtom=a.mbase.Subclass({type:"texatom",inferRow:b,texClass:a.TEXCLASS.ORD,setTeXclass:function(f){this.getPrevClass(f);this.data[0].setTeXclass();return this}});a.NULL=a.mbase().With({type:"null"});var c=a.TEXCLASS;var e={ORD:[0,0,c.ORD],ORD11:[1,1,c.ORD],ORD21:[2,1,c.ORD],ORD02:[0,2,c.ORD],ORD55:[5,5,c.ORD],OP:[1,2,c.OP,{largeop:true,movablelimits:true,symmetric:true}],OPFIXED:[1,2,c.OP,{largeop:true,movablelimits:true}],INTEGRAL:[0,1,c.OP,{largeop:true,symmetric:true}],INTEGRAL2:[1,2,c.OP,{largeop:true,symmetric:true}],BIN3:[3,3,c.BIN],BIN4:[4,4,c.BIN],BIN01:[0,1,c.BIN],TALLBIN:[4,4,c.BIN,{stretchy:true}],BINOP:[4,4,c.BIN,{largeop:true,movablelimits:true}],REL:[5,5,c.REL],REL1:[1,1,c.REL,{stretchy:true}],REL4:[4,4,c.REL],WIDEREL:[5,5,c.REL,{stretchy:true}],RELACCENT:[5,5,c.REL,{accent:true,stretchy:true}],OPEN:[0,0,c.OPEN,{fence:true,stretchy:true,symmetric:true}],CLOSE:[0,0,c.CLOSE,{fence:true,stretchy:true,symmetric:true}],INNER:[0,0,c.INNER],PUNCT:[0,3,c.PUNCT],ACCENT:[0,0,c.ORD,{accent:true}],WIDEACCENT:[0,0,c.ORD,{accent:true,stretchy:true}]};a.mo.Augment({SPACE:["0em","0.1111em","0.1667em","0.2222em","0.2667em","0.3333em"],RANGES:[[32,127,c.REL,"BasicLatin"],[160,255,c.ORD,"Latin1Supplement"],[256,383,c.ORD],[384,591,c.ORD],[688,767,c.ORD,"SpacingModLetters"],[768,879,c.ORD,"CombDiacritMarks"],[880,1023,c.ORD,"GreekAndCoptic"],[7680,7935,c.ORD],[8192,8303,c.PUNCT,"GeneralPunctuation"],[8304,8351,c.ORD],[8352,8399,c.ORD],[8400,8447,c.ORD,"CombDiactForSymbols"],[8448,8527,c.ORD,"LetterlikeSymbols"],[8528,8591,c.ORD],[8592,8703,c.REL,"Arrows"],[8704,8959,c.BIN,"MathOperators"],[8960,9215,c.ORD,"MiscTechnical"],[9312,9471,c.ORD],[9632,9727,c.ORD,"GeometricShapes"],[9984,10175,c.ORD,"Dingbats"],[10176,10223,c.ORD,"MiscMathSymbolsA"],[10496,10623,c.REL,"SupplementalArrowsB"],[10624,10751,c.ORD,"MiscMathSymbolsB"],[10752,11007,c.BIN,"SuppMathOperators"],[11008,11263,c.ORD],[119808,120831,c.ORD]],OPTABLE:{prefix:{"\u2111":e.ORD11,"\u2113":e.ORD11,"\u211C":e.ORD11,"\u2200":e.ORD21,"\u2202":e.ORD21,"\u2203":e.ORD21,"\u2207":e.ORD21,"\u220F":e.OP,"\u2210":e.OP,"\u2211":e.OP,"\u2212":e.BIN01,"\u2213":e.BIN01,"\u221A":[1,1,c.ORD,{stretchy:true}],"\u2220":e.ORD,"\u222B":e.INTEGRAL,"\u222E":e.INTEGRAL,"\u22C0":e.OP,"\u22C1":e.OP,"\u22C2":e.OP,"\u22C3":e.OP,"\u2308":e.OPEN,"\u230A":e.OPEN,"\u27E8":e.OPEN,"\u2A00":e.OP,"\u2A01":e.OP,"\u2A02":e.OP,"\u2A04":e.OP,"\u2A06":e.OP,"\u00AC":e.ORD21,"\u00B1":e.BIN01,"(":e.OPEN,"+":e.BIN01,"-":e.BIN01,"[":e.OPEN,"{":e.OPEN,"|":e.OPEN},postfix:{"!":[1,0,c.CLOSE],"&":e.ORD,"\u2032":e.ORD02,"\u203E":e.WIDEACCENT,"\u2309":e.CLOSE,"\u230B":e.CLOSE,"\u23DE":e.WIDEACCENT,"\u23DF":e.WIDEACCENT,"\u266D":e.ORD02,"\u266E":e.ORD02,"\u266F":e.ORD02,"\u27E9":e.CLOSE,"\u02C6":e.WIDEACCENT,"\u02C7":e.WIDEACCENT,"\u02D8":e.ACCENT,"\u02D9":e.ACCENT,"\u02DC":e.WIDEACCENT,"\u0302":e.ACCENT,"\u00A8":e.ACCENT,"\u00AF":e.WIDEACCENT,")":e.CLOSE,"]":e.CLOSE,"^":e.WIDEACCENT,_:e.WIDEACCENT,"`":e.ACCENT,"|":e.CLOSE,"}":e.CLOSE,"~":e.WIDEACCENT},infix:{"%":[3,3,c.ORD],"\u2022":e.BIN4,"\u2026":e.INNER,"\u2044":e.TALLBIN,"\u2061":e.ORD,"\u2062":e.ORD,"\u2063":[0,0,c.ORD,{separator:true}],"\u2064":e.ORD,"\u2190":e.RELACCENT,"\u2191":e.WIDEREL,"\u2192":e.RELACCENT,"\u2193":e.WIDEREL,"\u2194":e.RELACCENT,"\u2195":e.WIDEREL,"\u2196":e.WIDEREL,"\u2197":e.WIDEREL,"\u2198":e.WIDEREL,"\u2199":e.WIDEREL,"\u21A6":e.WIDEREL,"\u21A9":e.WIDEREL,"\u21AA":e.WIDEREL,"\u21BC":e.RELACCENT,"\u21BD":e.WIDEREL,"\u21C0":e.RELACCENT,"\u21C1":e.WIDEREL,"\u21CC":e.WIDEREL,"\u21D0":e.WIDEREL,"\u21D1":e.WIDEREL,"\u21D2":e.WIDEREL,"\u21D3":e.WIDEREL,"\u21D4":e.WIDEREL,"\u21D5":e.WIDEREL,"\u2208":e.REL,"\u2209":e.REL,"\u220B":e.REL,"\u2212":e.BIN4,"\u2213":e.BIN4,"\u2215":e.TALLBIN,"\u2216":e.BIN4,"\u2217":e.BIN4,"\u2218":e.BIN4,"\u2219":e.BIN4,"\u221D":e.REL,"\u2223":e.REL,"\u2225":e.REL,"\u2227":e.BIN4,"\u2228":e.BIN4,"\u2229":e.BIN4,"\u222A":e.BIN4,"\u223C":e.REL,"\u2240":e.BIN4,"\u2243":e.REL,"\u2245":e.REL,"\u2248":e.REL,"\u224D":e.REL,"\u2250":e.REL,"\u2260":e.REL,"\u2261":e.REL,"\u2264":e.REL,"\u2265":e.REL,"\u226A":e.REL,"\u226B":e.REL,"\u227A":e.REL,"\u227B":e.REL,"\u2282":e.REL,"\u2283":e.REL,"\u2286":e.REL,"\u2287":e.REL,"\u228E":e.BIN4,"\u2291":e.REL,"\u2292":e.REL,"\u2293":e.BIN4,"\u2294":e.BIN4,"\u2295":e.BIN4,"\u2296":e.BIN4,"\u2297":e.BIN4,"\u2298":e.BIN4,"\u2299":e.BIN4,"\u22A2":e.REL,"\u22A3":e.REL,"\u22A4":e.ORD55,"\u22A5":e.REL,"\u22A8":e.REL,"\u22C4":e.BIN4,"\u22C5":e.BIN4,"\u22C6":e.BIN4,"\u22C8":e.REL,"\u22EE":e.ORD55,"\u22EF":e.INNER,"\u22F1":[5,5,c.INNER],"\u2500":[0,0,c.ORD,{stretchy:true}],"\u25B3":e.BIN4,"\u25B5":e.BIN4,"\u25B9":e.BIN4,"\u25BD":e.BIN4,"\u25BF":e.BIN4,"\u25C3":e.BIN4,"\u2758":[4,4,c.REL,{fence:true,stretchy:true,symmetric:true}],"\u27F5":e.REL1,"\u27F6":e.REL1,"\u27F7":e.REL1,"\u27F8":e.REL1,"\u27F9":e.REL1,"\u27FA":e.REL1,"\u2A2F":e.BIN4,"\u2A3F":e.BIN4,"\u2AAF":e.REL,"\u2AB0":e.REL,"\u00B1":e.BIN4,"\u00B7":e.BIN4,"\u00D7":e.BIN4,"\u00F7":e.BIN4,"*":e.BIN3,"+":e.BIN4,",":[0,3,c.PUNCT,{separator:true}],"-":e.BIN4,".":[3,3,c.ORD],"/":e.ORD11,":":[1,2,c.REL],";":[0,3,c.PUNCT,{separator:true}],"<":e.REL,"=":e.REL,">":e.REL,"?":[1,1,c.CLOSE],"\\":e.ORD,_:e.ORD11,"|":[2,2,c.ORD,{fence:true,stretchy:true,symmetric:true}],"#":e.ORD,"$":e.ORD,"\u002E":[0,3,c.PUNCT,{separator:true}],"\u02B9":e.ORD,"\u02C9":e.ACCENT,"\u02CA":e.ACCENT,"\u02CB":e.ACCENT,"\u0300":e.ACCENT,"\u0301":e.ACCENT,"\u0303":e.WIDEACCENT,"\u0304":e.ACCENT,"\u0306":e.ACCENT,"\u0307":e.ACCENT,"\u0308":e.ACCENT,"\u030C":e.ACCENT,"\u0332":e.WIDEACCENT,"\u0338":e.REL4,"\u2015":[0,0,c.ORD,{stretchy:true}],"\u2017":[0,0,c.ORD,{stretchy:true}],"\u2020":e.BIN3,"\u2021":e.BIN3,"\u20D7":e.ACCENT,"\u2118":e.ORD,"\u2205":e.ORD,"\u221E":e.ORD,"\u2305":e.BIN3,"\u2306":e.BIN3,"\u2322":e.REL4,"\u2323":e.REL4,"\u2329":e.OPEN,"\u232A":e.CLOSE,"\u23AA":e.ORD,"\u23AF":[0,0,c.ORD,{stretchy:true}],"\u23B0":e.OPEN,"\u23B1":e.CLOSE,"\u25EF":e.BIN3,"\u2660":e.ORD,"\u2661":e.ORD,"\u2662":e.ORD,"\u2663":e.ORD,"\u27EE":e.OPEN,"\u27EF":e.CLOSE,"\u27FC":e.REL4,"\u3008":e.OPEN,"\u3009":e.CLOSE,"\uFE37":e.WIDEACCENT,"\uFE38":e.WIDEACCENT}}},{OPTYPES:e})})(MathJax.ElementJax.mml);MathJax.ElementJax.mml.loadComplete("jax.js");
+
diff --git a/static/MathJax/jax/element/mml/optable/Arrows.js b/static/MathJax/jax/element/mml/optable/Arrows.js
new file mode 100644
index 0000000..6520b48
--- /dev/null
+++ b/static/MathJax/jax/element/mml/optable/Arrows.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/element/mml/optable/Arrows.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){var c=a.mo.OPTYPES;var b=a.TEXCLASS;MathJax.Hub.Insert(a.mo.prototype,{OPTABLE:{infix:{"\u219A":c.REL,"\u219B":c.REL,"\u219C":c.WIDEREL,"\u219D":c.WIDEREL,"\u219E":c.WIDEREL,"\u219F":c.WIDEREL,"\u21A0":c.WIDEREL,"\u21A1":c.WIDEREL,"\u21A2":c.WIDEREL,"\u21A3":c.WIDEREL,"\u21A4":c.WIDEREL,"\u21A5":c.WIDEREL,"\u21A7":c.WIDEREL,"\u21A8":c.WIDEREL,"\u21AB":c.WIDEREL,"\u21AC":c.WIDEREL,"\u21AD":c.WIDEREL,"\u21AE":c.REL,"\u21AF":c.WIDEREL,"\u21B0":c.WIDEREL,"\u21B1":c.WIDEREL,"\u21B2":c.WIDEREL,"\u21B3":c.WIDEREL,"\u21B4":c.WIDEREL,"\u21B5":c.WIDEREL,"\u21B6":c.REL,"\u21B7":c.REL,"\u21B8":c.REL,"\u21B9":c.WIDEREL,"\u21BA":c.REL,"\u21BB":c.REL,"\u21BE":c.WIDEREL,"\u21BF":c.WIDEREL,"\u21C2":c.WIDEREL,"\u21C3":c.WIDEREL,"\u21C4":c.WIDEREL,"\u21C5":c.WIDEREL,"\u21C6":c.WIDEREL,"\u21C7":c.WIDEREL,"\u21C8":c.WIDEREL,"\u21C9":c.WIDEREL,"\u21CA":c.WIDEREL,"\u21CB":c.WIDEREL,"\u21CD":c.REL,"\u21CE":c.REL,"\u21CF":c.REL,"\u21D6":c.WIDEREL,"\u21D7":c.WIDEREL,"\u21D8":c.WIDEREL,"\u21D9":c.WIDEREL,"\u21DA":c.WIDEREL,"\u21DB":c.WIDEREL,"\u21DC":c.WIDEREL,"\u21DD":c.WIDEREL,"\u21DE":c.REL,"\u21DF":c.REL,"\u21E0":c.WIDEREL,"\u21E1":c.WIDEREL,"\u21E2":c.WIDEREL,"\u21E3":c.WIDEREL,"\u21E4":c.WIDEREL,"\u21E5":c.WIDEREL,"\u21E6":c.WIDEREL,"\u21E7":c.WIDEREL,"\u21E8":c.WIDEREL,"\u21E9":c.WIDEREL,"\u21EA":c.WIDEREL,"\u21EB":c.WIDEREL,"\u21EC":c.WIDEREL,"\u21ED":c.WIDEREL,"\u21EE":c.WIDEREL,"\u21EF":c.WIDEREL,"\u21F0":c.WIDEREL,"\u21F1":c.REL,"\u21F2":c.REL,"\u21F3":c.WIDEREL,"\u21F4":c.REL,"\u21F5":c.WIDEREL,"\u21F6":c.WIDEREL,"\u21F7":c.REL,"\u21F8":c.REL,"\u21F9":c.REL,"\u21FA":c.REL,"\u21FB":c.REL,"\u21FC":c.REL,"\u21FD":c.WIDEREL,"\u21FE":c.WIDEREL,"\u21FF":c.WIDEREL}}});MathJax.Ajax.loadComplete(a.optableDir+"/Arrows.js")})(MathJax.ElementJax.mml);
+
diff --git a/static/MathJax/jax/element/mml/optable/BasicLatin.js b/static/MathJax/jax/element/mml/optable/BasicLatin.js
new file mode 100644
index 0000000..dbea932
--- /dev/null
+++ b/static/MathJax/jax/element/mml/optable/BasicLatin.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/element/mml/optable/BasicLatin.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){var c=a.mo.OPTYPES;var b=a.TEXCLASS;MathJax.Hub.Insert(a.mo.prototype,{OPTABLE:{postfix:{"!!":[1,0,b.BIN],"'":c.ACCENT,"++":[0,0,b.BIN],"--":[0,0,b.BIN],"..":[0,0,b.BIN],"...":c.ORD},infix:{"!=":c.BIN4,"&&":c.BIN4,"**":[1,1,b.BIN],"*=":c.BIN4,"+=":c.BIN4,"-=":c.BIN4,"->":c.BIN4,"//":c.BIN4,"/=":c.BIN4,":=":c.BIN4,"<=":c.BIN4,"<>":[1,1,b.BIN],"==":c.BIN4,">=":c.BIN4,"@":c.ORD11,"||":c.BIN3}}});MathJax.Ajax.loadComplete(a.optableDir+"/BasicLatin.js")})(MathJax.ElementJax.mml);
+
diff --git a/static/MathJax/jax/element/mml/optable/CombDiacritMarks.js b/static/MathJax/jax/element/mml/optable/CombDiacritMarks.js
new file mode 100644
index 0000000..f683301
--- /dev/null
+++ b/static/MathJax/jax/element/mml/optable/CombDiacritMarks.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/element/mml/optable/CombDiacritMarks.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){var c=a.mo.OPTYPES;var b=a.TEXCLASS;MathJax.Hub.Insert(a.mo.prototype,{OPTABLE:{postfix:{"\u0311":c.ACCENT}}});MathJax.Ajax.loadComplete(a.optableDir+"/CombDiacritMarks.js")})(MathJax.ElementJax.mml);
+
diff --git a/static/MathJax/jax/element/mml/optable/CombDiactForSymbols.js b/static/MathJax/jax/element/mml/optable/CombDiactForSymbols.js
new file mode 100644
index 0000000..14706b0
--- /dev/null
+++ b/static/MathJax/jax/element/mml/optable/CombDiactForSymbols.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/element/mml/optable/CombDiactForSymbols.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){var c=a.mo.OPTYPES;var b=a.TEXCLASS;MathJax.Hub.Insert(a.mo.prototype,{OPTABLE:{postfix:{"\u20DB":c.ACCENT}}});MathJax.Ajax.loadComplete(a.optableDir+"/CombDiactForSymbols.js")})(MathJax.ElementJax.mml);
+
diff --git a/static/MathJax/jax/element/mml/optable/Dingbats.js b/static/MathJax/jax/element/mml/optable/Dingbats.js
new file mode 100644
index 0000000..163c1e6
--- /dev/null
+++ b/static/MathJax/jax/element/mml/optable/Dingbats.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/element/mml/optable/Dingbats.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){var c=a.mo.OPTYPES;var b=a.TEXCLASS;MathJax.Hub.Insert(a.mo.prototype,{OPTABLE:{infix:{"\u2713":c.WIDEACCENT}}});MathJax.Ajax.loadComplete(a.optableDir+"/Dingbats.js")})(MathJax.ElementJax.mml);
+
diff --git a/static/MathJax/jax/element/mml/optable/GeneralPunctuation.js b/static/MathJax/jax/element/mml/optable/GeneralPunctuation.js
new file mode 100644
index 0000000..36384be
--- /dev/null
+++ b/static/MathJax/jax/element/mml/optable/GeneralPunctuation.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/element/mml/optable/GeneralPunctuation.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){var c=a.mo.OPTYPES;var b=a.TEXCLASS;MathJax.Hub.Insert(a.mo.prototype,{OPTABLE:{prefix:{"\u2018":[0,0,b.OPEN,{fence:true}],"\u201C":[0,0,b.OPEN,{fence:true}]},postfix:{"\u2019":[0,0,b.CLOSE,{fence:true}],"\u201D":[0,0,b.CLOSE,{fence:true}]}}});MathJax.Ajax.loadComplete(a.optableDir+"/GeneralPunctuation.js")})(MathJax.ElementJax.mml);
+
diff --git a/static/MathJax/jax/element/mml/optable/GeometricShapes.js b/static/MathJax/jax/element/mml/optable/GeometricShapes.js
new file mode 100644
index 0000000..ecd06e4
--- /dev/null
+++ b/static/MathJax/jax/element/mml/optable/GeometricShapes.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/element/mml/optable/GeometricShapes.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){var c=a.mo.OPTYPES;var b=a.TEXCLASS;MathJax.Hub.Insert(a.mo.prototype,{OPTABLE:{infix:{"\u25A0":c.BIN3,"\u25A1":c.BIN3,"\u25AA":c.BIN3,"\u25AB":c.BIN3,"\u25AD":c.BIN3,"\u25AE":c.BIN3,"\u25AF":c.BIN3,"\u25B0":c.BIN3,"\u25B1":c.BIN3,"\u25B2":c.BIN4,"\u25B4":c.BIN4,"\u25B6":c.BIN4,"\u25B7":c.BIN4,"\u25B8":c.BIN4,"\u25BC":c.BIN4,"\u25BE":c.BIN4,"\u25C0":c.BIN4,"\u25C1":c.BIN4,"\u25C2":c.BIN4,"\u25C4":c.BIN4,"\u25C5":c.BIN4,"\u25C6":c.BIN4,"\u25C7":c.BIN4,"\u25C8":c.BIN4,"\u25C9":c.BIN4,"\u25CC":c.BIN4,"\u25CD":c.BIN4,"\u25CE":c.BIN4,"\u25CF":c.BIN4,"\u25D6":c.BIN4,"\u25D7":c.BIN4,"\u25E6":c.BIN4}}});MathJax.Ajax.loadComplete(a.optableDir+"/GeometricShapes.js")})(MathJax.ElementJax.mml);
+
diff --git a/static/MathJax/jax/element/mml/optable/GreekAndCoptic.js b/static/MathJax/jax/element/mml/optable/GreekAndCoptic.js
new file mode 100644
index 0000000..5c9d9d5
--- /dev/null
+++ b/static/MathJax/jax/element/mml/optable/GreekAndCoptic.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/element/mml/optable/GreekAndCoptic.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){var c=a.mo.OPTYPES;var b=a.TEXCLASS;MathJax.Hub.Insert(a.mo.prototype,{OPTABLE:{prefix:{"\u03C3":c.ORD11}}});MathJax.Ajax.loadComplete(a.optableDir+"/GreekAndCoptic.js")})(MathJax.ElementJax.mml);
+
diff --git a/static/MathJax/jax/element/mml/optable/Latin1Supplement.js b/static/MathJax/jax/element/mml/optable/Latin1Supplement.js
new file mode 100644
index 0000000..7d65b74
--- /dev/null
+++ b/static/MathJax/jax/element/mml/optable/Latin1Supplement.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/element/mml/optable/Latin1Supplement.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){var c=a.mo.OPTYPES;var b=a.TEXCLASS;MathJax.Hub.Insert(a.mo.prototype,{OPTABLE:{postfix:{"\u00B0":c.ORD,"\u00B4":c.ACCENT,"\u00B8":c.ACCENT}}});MathJax.Ajax.loadComplete(a.optableDir+"/Latin1Supplement.js")})(MathJax.ElementJax.mml);
+
diff --git a/static/MathJax/jax/element/mml/optable/LetterlikeSymbols.js b/static/MathJax/jax/element/mml/optable/LetterlikeSymbols.js
new file mode 100644
index 0000000..c01dc8a
--- /dev/null
+++ b/static/MathJax/jax/element/mml/optable/LetterlikeSymbols.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/element/mml/optable/LetterlikeSymbols.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){var c=a.mo.OPTYPES;var b=a.TEXCLASS;MathJax.Hub.Insert(a.mo.prototype,{OPTABLE:{prefix:{"\u2145":c.ORD21,"\u2146":[2,0,b.ORD],"\u2147":c.ORD,"\u2148":c.ORD,"\u2149":c.ORD}}});MathJax.Ajax.loadComplete(a.optableDir+"/LetterlikeSymbols.js")})(MathJax.ElementJax.mml);
+
diff --git a/static/MathJax/jax/element/mml/optable/MathOperators.js b/static/MathJax/jax/element/mml/optable/MathOperators.js
new file mode 100644
index 0000000..4cd76fe
--- /dev/null
+++ b/static/MathJax/jax/element/mml/optable/MathOperators.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/element/mml/optable/MathOperators.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){var c=a.mo.OPTYPES;var b=a.TEXCLASS;MathJax.Hub.Insert(a.mo.prototype,{OPTABLE:{prefix:{"\u2204":c.ORD21,"\u221B":c.ORD11,"\u221C":c.ORD11,"\u2221":c.ORD,"\u2222":c.ORD,"\u222C":c.INTEGRAL,"\u222D":c.INTEGRAL,"\u222F":c.INTEGRAL,"\u2230":c.INTEGRAL,"\u2231":c.INTEGRAL,"\u2232":c.INTEGRAL,"\u2233":c.INTEGRAL},infix:{"\u2201":[1,2,b.ORD],"\u2206":c.BIN3,"\u220A":c.REL,"\u220C":c.REL,"\u220D":c.REL,"\u220E":c.BIN3,"\u2214":c.BIN4,"\u221F":c.REL,"\u2224":c.REL,"\u2226":c.REL,"\u2234":c.REL,"\u2235":c.REL,"\u2236":c.REL,"\u2237":c.REL,"\u2238":c.BIN4,"\u2239":c.REL,"\u223A":c.BIN4,"\u223B":c.REL,"\u223D":c.REL,"\u223D\u0331":c.BIN3,"\u223E":c.REL,"\u223F":c.BIN3,"\u2241":c.REL,"\u2242":c.REL,"\u2242\u0338":c.BIN4,"\u2244":c.REL,"\u2246":c.REL,"\u2247":c.REL,"\u2249":c.REL,"\u224A":c.REL,"\u224B":c.REL,"\u224C":c.REL,"\u224E":c.REL,"\u224E\u0338":c.BIN4,"\u224F":c.REL,"\u224F\u0338":c.BIN4,"\u2251":c.REL,"\u2252":c.REL,"\u2253":c.REL,"\u2254":c.REL,"\u2255":c.REL,"\u2256":c.REL,"\u2257":c.REL,"\u2258":c.REL,"\u2259":c.REL,"\u225A":c.REL,"\u225C":c.REL,"\u225D":c.REL,"\u225E":c.REL,"\u225F":c.REL,"\u2262":c.REL,"\u2263":c.REL,"\u2266":c.REL,"\u2266\u0338":c.BIN4,"\u2267":c.REL,"\u2268":c.REL,"\u2269":c.REL,"\u226A\u0338":c.BIN4,"\u226B\u0338":c.BIN4,"\u226C":c.REL,"\u226D":c.REL,"\u226E":c.REL,"\u226F":c.REL,"\u2270":c.REL,"\u2271":c.REL,"\u2272":c.REL,"\u2273":c.REL,"\u2274":c.REL,"\u2275":c.REL,"\u2276":c.REL,"\u2277":c.REL,"\u2278":c.REL,"\u2279":c.REL,"\u227C":c.REL,"\u227D":c.REL,"\u227E":c.REL,"\u227F":c.REL,"\u227F\u0338":c.BIN4,"\u2280":c.REL,"\u2281":c.REL,"\u2282\u20D2":c.BIN4,"\u2283\u20D2":c.BIN4,"\u2284":c.REL,"\u2285":c.REL,"\u2288":c.REL,"\u2289":c.REL,"\u228A":c.REL,"\u228B":c.REL,"\u228C":c.BIN4,"\u228D":c.BIN4,"\u228F":c.REL,"\u228F\u0338":c.BIN4,"\u2290":c.REL,"\u2290\u0338":c.BIN4,"\u229A":c.BIN4,"\u229B":c.BIN4,"\u229C":c.BIN4,"\u229D":c.BIN4,"\u229E":c.BIN4,"\u229F":c.BIN4,"\u22A0":c.BIN4,"\u22A1":c.BIN4,"\u22A6":c.REL,"\u22A7":c.REL,"\u22A9":c.REL,"\u22AA":c.REL,"\u22AB":c.REL,"\u22AC":c.REL,"\u22AD":c.REL,"\u22AE":c.REL,"\u22AF":c.REL,"\u22B0":c.REL,"\u22B1":c.REL,"\u22B2":c.REL,"\u22B3":c.REL,"\u22B4":c.REL,"\u22B5":c.REL,"\u22B6":c.REL,"\u22B7":c.REL,"\u22B8":c.REL,"\u22B9":c.REL,"\u22BA":c.BIN4,"\u22BB":c.BIN4,"\u22BC":c.BIN4,"\u22BD":c.BIN4,"\u22BE":c.BIN3,"\u22BF":c.BIN3,"\u22C7":c.BIN4,"\u22C9":c.BIN4,"\u22CA":c.BIN4,"\u22CB":c.BIN4,"\u22CC":c.BIN4,"\u22CD":c.REL,"\u22CE":c.BIN4,"\u22CF":c.BIN4,"\u22D0":c.REL,"\u22D1":c.REL,"\u22D2":c.BIN4,"\u22D3":c.BIN4,"\u22D4":c.REL,"\u22D5":c.REL,"\u22D6":c.REL,"\u22D7":c.REL,"\u22D8":c.REL,"\u22D9":c.REL,"\u22DA":c.REL,"\u22DB":c.REL,"\u22DC":c.REL,"\u22DD":c.REL,"\u22DE":c.REL,"\u22DF":c.REL,"\u22E0":c.REL,"\u22E1":c.REL,"\u22E2":c.REL,"\u22E3":c.REL,"\u22E4":c.REL,"\u22E5":c.REL,"\u22E6":c.REL,"\u22E7":c.REL,"\u22E8":c.REL,"\u22E9":c.REL,"\u22EA":c.REL,"\u22EB":c.REL,"\u22EC":c.REL,"\u22ED":c.REL,"\u22F0":c.REL,"\u22F2":c.REL,"\u22F3":c.REL,"\u22F4":c.REL,"\u22F5":c.REL,"\u22F6":c.REL,"\u22F7":c.REL,"\u22F8":c.REL,"\u22F9":c.REL,"\u22FA":c.REL,"\u22FB":c.REL,"\u22FC":c.REL,"\u22FD":c.REL,"\u22FE":c.REL,"\u22FF":c.REL}}});MathJax.Ajax.loadComplete(a.optableDir+"/MathOperators.js")})(MathJax.ElementJax.mml);
+
diff --git a/static/MathJax/jax/element/mml/optable/MiscMathSymbolsA.js b/static/MathJax/jax/element/mml/optable/MiscMathSymbolsA.js
new file mode 100644
index 0000000..47e4eea
--- /dev/null
+++ b/static/MathJax/jax/element/mml/optable/MiscMathSymbolsA.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/element/mml/optable/MiscMathSymbolsA.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){var c=a.mo.OPTYPES;var b=a.TEXCLASS;MathJax.Hub.Insert(a.mo.prototype,{OPTABLE:{prefix:{"\u27E6":c.OPEN},postfix:{"\u27E7":c.CLOSE}}});MathJax.Ajax.loadComplete(a.optableDir+"/MiscMathSymbolsA.js")})(MathJax.ElementJax.mml);
+
diff --git a/static/MathJax/jax/element/mml/optable/MiscMathSymbolsB.js b/static/MathJax/jax/element/mml/optable/MiscMathSymbolsB.js
new file mode 100644
index 0000000..39f6180
--- /dev/null
+++ b/static/MathJax/jax/element/mml/optable/MiscMathSymbolsB.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/element/mml/optable/MiscMathSymbolsB.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){var c=a.mo.OPTYPES;var b=a.TEXCLASS;MathJax.Hub.Insert(a.mo.prototype,{OPTABLE:{prefix:{"\u2983":c.OPEN,"\u2985":c.OPEN,"\u2987":c.OPEN,"\u2989":c.OPEN,"\u298B":c.OPEN,"\u298D":c.OPEN,"\u298F":c.OPEN,"\u2991":c.OPEN,"\u2993":c.OPEN,"\u2995":c.OPEN,"\u2997":c.OPEN,"\u29FC":c.OPEN},postfix:{"\u2984":c.CLOSE,"\u2986":c.CLOSE,"\u2988":c.CLOSE,"\u298A":c.CLOSE,"\u298C":c.CLOSE,"\u298E":c.CLOSE,"\u2990":c.CLOSE,"\u2992":c.CLOSE,"\u2994":c.CLOSE,"\u2996":c.CLOSE,"\u2998":c.CLOSE,"\u29FD":c.CLOSE},infix:{"\u2980":c.ORD,"\u2981":c.BIN3,"\u2982":c.BIN3,"\u2999":c.BIN3,"\u299A":c.BIN3,"\u299B":c.BIN3,"\u299C":c.BIN3,"\u299D":c.BIN3,"\u299E":c.BIN3,"\u299F":c.BIN3,"\u29A0":c.BIN3,"\u29A1":c.BIN3,"\u29A2":c.BIN3,"\u29A3":c.BIN3,"\u29A4":c.BIN3,"\u29A5":c.BIN3,"\u29A6":c.BIN3,"\u29A7":c.BIN3,"\u29A8":c.BIN3,"\u29A9":c.BIN3,"\u29AA":c.BIN3,"\u29AB":c.BIN3,"\u29AC":c.BIN3,"\u29AD":c.BIN3,"\u29AE":c.BIN3,"\u29AF":c.BIN3,"\u29B0":c.BIN3,"\u29B1":c.BIN3,"\u29B2":c.BIN3,"\u29B3":c.BIN3,"\u29B4":c.BIN3,"\u29B5":c.BIN3,"\u29B6":c.BIN4,"\u29B7":c.BIN4,"\u29B8":c.BIN4,"\u29B9":c.BIN4,"\u29BA":c.BIN4,"\u29BB":c.BIN4,"\u29BC":c.BIN4,"\u29BD":c.BIN4,"\u29BE":c.BIN4,"\u29BF":c.BIN4,"\u29C0":c.REL,"\u29C1":c.REL,"\u29C2":c.BIN3,"\u29C3":c.BIN3,"\u29C4":c.BIN4,"\u29C5":c.BIN4,"\u29C6":c.BIN4,"\u29C7":c.BIN4,"\u29C8":c.BIN4,"\u29C9":c.BIN3,"\u29CA":c.BIN3,"\u29CB":c.BIN3,"\u29CC":c.BIN3,"\u29CD":c.BIN3,"\u29CE":c.REL,"\u29CF":c.REL,"\u29CF\u0338":c.BIN4,"\u29D0":c.REL,"\u29D0\u0338":c.BIN4,"\u29D1":c.REL,"\u29D2":c.REL,"\u29D3":c.REL,"\u29D4":c.REL,"\u29D5":c.REL,"\u29D6":c.BIN4,"\u29D7":c.BIN4,"\u29D8":c.BIN3,"\u29D9":c.BIN3,"\u29DB":c.BIN3,"\u29DC":c.BIN3,"\u29DD":c.BIN3,"\u29DE":c.REL,"\u29DF":c.BIN3,"\u29E0":c.BIN3,"\u29E1":c.REL,"\u29E2":c.BIN4,"\u29E3":c.REL,"\u29E4":c.REL,"\u29E5":c.REL,"\u29E6":c.REL,"\u29E7":c.BIN3,"\u29E8":c.BIN3,"\u29E9":c.BIN3,"\u29EA":c.BIN3,"\u29EB":c.BIN3,"\u29EC":c.BIN3,"\u29ED":c.BIN3,"\u29EE":c.BIN3,"\u29EF":c.BIN3,"\u29F0":c.BIN3,"\u29F1":c.BIN3,"\u29F2":c.BIN3,"\u29F3":c.BIN3,"\u29F4":c.REL,"\u29F5":c.BIN4,"\u29F6":c.BIN4,"\u29F7":c.BIN4,"\u29F8":c.BIN3,"\u29F9":c.BIN3,"\u29FA":c.BIN3,"\u29FB":c.BIN3,"\u29FE":c.BIN4,"\u29FF":c.BIN4}}});MathJax.Ajax.loadComplete(a.optableDir+"/MiscMathSymbolsB.js")})(MathJax.ElementJax.mml);
+
diff --git a/static/MathJax/jax/element/mml/optable/MiscTechnical.js b/static/MathJax/jax/element/mml/optable/MiscTechnical.js
new file mode 100644
index 0000000..9f042b5
--- /dev/null
+++ b/static/MathJax/jax/element/mml/optable/MiscTechnical.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/element/mml/optable/MiscTechnical.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){var c=a.mo.OPTYPES;var b=a.TEXCLASS;MathJax.Hub.Insert(a.mo.prototype,{OPTABLE:{postfix:{"\u23B4":c.WIDEACCENT,"\u23B5":c.WIDEACCENT,"\u23DC":c.WIDEACCENT,"\u23DD":c.WIDEACCENT}}});MathJax.Ajax.loadComplete(a.optableDir+"/MiscTechnical.js")})(MathJax.ElementJax.mml);
+
diff --git a/static/MathJax/jax/element/mml/optable/SpacingModLetters.js b/static/MathJax/jax/element/mml/optable/SpacingModLetters.js
new file mode 100644
index 0000000..e1eea9b
--- /dev/null
+++ b/static/MathJax/jax/element/mml/optable/SpacingModLetters.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/element/mml/optable/SpacingModLetters.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){var c=a.mo.OPTYPES;var b=a.TEXCLASS;MathJax.Hub.Insert(a.mo.prototype,{OPTABLE:{postfix:{"\u02DA":c.ACCENT,"\u02DD":c.ACCENT}}});MathJax.Ajax.loadComplete(a.optableDir+"/SpacingModLetters.js")})(MathJax.ElementJax.mml);
+
diff --git a/static/MathJax/jax/element/mml/optable/SuppMathOperators.js b/static/MathJax/jax/element/mml/optable/SuppMathOperators.js
new file mode 100644
index 0000000..ba0e566
--- /dev/null
+++ b/static/MathJax/jax/element/mml/optable/SuppMathOperators.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/element/mml/optable/SuppMathOperators.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){var c=a.mo.OPTYPES;var b=a.TEXCLASS;MathJax.Hub.Insert(a.mo.prototype,{OPTABLE:{prefix:{"\u2A03":c.OP,"\u2A05":c.OP,"\u2A07":c.OP,"\u2A08":c.OP,"\u2A09":c.OP,"\u2A0A":c.OP,"\u2A0B":c.INTEGRAL2,"\u2A0C":c.INTEGRAL,"\u2A0D":c.INTEGRAL2,"\u2A0E":c.INTEGRAL2,"\u2A0F":c.INTEGRAL2,"\u2A10":c.OP,"\u2A11":c.OP,"\u2A12":c.OP,"\u2A13":c.OP,"\u2A14":c.OP,"\u2A15":c.INTEGRAL2,"\u2A16":c.INTEGRAL2,"\u2A17":c.INTEGRAL2,"\u2A18":c.INTEGRAL2,"\u2A19":c.INTEGRAL2,"\u2A1A":c.INTEGRAL2,"\u2A1B":c.INTEGRAL2,"\u2A1C":c.INTEGRAL2,"\u2AFC":c.OP,"\u2AFF":c.OP},infix:{"\u2A1D":c.BIN3,"\u2A1E":c.BIN3,"\u2A1F":c.BIN3,"\u2A20":c.BIN3,"\u2A21":c.BIN3,"\u2A22":c.BIN4,"\u2A23":c.BIN4,"\u2A24":c.BIN4,"\u2A25":c.BIN4,"\u2A26":c.BIN4,"\u2A27":c.BIN4,"\u2A28":c.BIN4,"\u2A29":c.BIN4,"\u2A2A":c.BIN4,"\u2A2B":c.BIN4,"\u2A2C":c.BIN4,"\u2A2D":c.BIN4,"\u2A2E":c.BIN4,"\u2A30":c.BIN4,"\u2A31":c.BIN4,"\u2A32":c.BIN4,"\u2A33":c.BIN4,"\u2A34":c.BIN4,"\u2A35":c.BIN4,"\u2A36":c.BIN4,"\u2A37":c.BIN4,"\u2A38":c.BIN4,"\u2A39":c.BIN4,"\u2A3A":c.BIN4,"\u2A3B":c.BIN4,"\u2A3C":c.BIN4,"\u2A3D":c.BIN4,"\u2A3E":c.BIN4,"\u2A40":c.BIN4,"\u2A41":c.BIN4,"\u2A42":c.BIN4,"\u2A43":c.BIN4,"\u2A44":c.BIN4,"\u2A45":c.BIN4,"\u2A46":c.BIN4,"\u2A47":c.BIN4,"\u2A48":c.BIN4,"\u2A49":c.BIN4,"\u2A4A":c.BIN4,"\u2A4B":c.BIN4,"\u2A4C":c.BIN4,"\u2A4D":c.BIN4,"\u2A4E":c.BIN4,"\u2A4F":c.BIN4,"\u2A50":c.BIN4,"\u2A51":c.BIN4,"\u2A52":c.BIN4,"\u2A53":c.BIN4,"\u2A54":c.BIN4,"\u2A55":c.BIN4,"\u2A56":c.BIN4,"\u2A57":c.BIN4,"\u2A58":c.BIN4,"\u2A59":c.REL,"\u2A5A":c.BIN4,"\u2A5B":c.BIN4,"\u2A5C":c.BIN4,"\u2A5D":c.BIN4,"\u2A5E":c.BIN4,"\u2A5F":c.BIN4,"\u2A60":c.BIN4,"\u2A61":c.BIN4,"\u2A62":c.BIN4,"\u2A63":c.BIN4,"\u2A64":c.BIN4,"\u2A65":c.BIN4,"\u2A66":c.REL,"\u2A67":c.REL,"\u2A68":c.REL,"\u2A69":c.REL,"\u2A6A":c.REL,"\u2A6B":c.REL,"\u2A6C":c.REL,"\u2A6D":c.REL,"\u2A6E":c.REL,"\u2A6F":c.REL,"\u2A70":c.REL,"\u2A71":c.BIN4,"\u2A72":c.BIN4,"\u2A73":c.REL,"\u2A74":c.REL,"\u2A75":c.REL,"\u2A76":c.REL,"\u2A77":c.REL,"\u2A78":c.REL,"\u2A79":c.REL,"\u2A7A":c.REL,"\u2A7B":c.REL,"\u2A7C":c.REL,"\u2A7D":c.REL,"\u2A7D\u0338":c.BIN4,"\u2A7E":c.REL,"\u2A7E\u0338":c.BIN4,"\u2A7F":c.REL,"\u2A80":c.REL,"\u2A81":c.REL,"\u2A82":c.REL,"\u2A83":c.REL,"\u2A84":c.REL,"\u2A85":c.REL,"\u2A86":c.REL,"\u2A87":c.REL,"\u2A88":c.REL,"\u2A89":c.REL,"\u2A8A":c.REL,"\u2A8B":c.REL,"\u2A8C":c.REL,"\u2A8D":c.REL,"\u2A8E":c.REL,"\u2A8F":c.REL,"\u2A90":c.REL,"\u2A91":c.REL,"\u2A92":c.REL,"\u2A93":c.REL,"\u2A94":c.REL,"\u2A95":c.REL,"\u2A96":c.REL,"\u2A97":c.REL,"\u2A98":c.REL,"\u2A99":c.REL,"\u2A9A":c.REL,"\u2A9B":c.REL,"\u2A9C":c.REL,"\u2A9D":c.REL,"\u2A9E":c.REL,"\u2A9F":c.REL,"\u2AA0":c.REL,"\u2AA1":c.REL,"\u2AA1\u0338":c.BIN4,"\u2AA2":c.REL,"\u2AA2\u0338":c.BIN4,"\u2AA3":c.REL,"\u2AA4":c.REL,"\u2AA5":c.REL,"\u2AA6":c.REL,"\u2AA7":c.REL,"\u2AA8":c.REL,"\u2AA9":c.REL,"\u2AAA":c.REL,"\u2AAB":c.REL,"\u2AAC":c.REL,"\u2AAD":c.REL,"\u2AAE":c.REL,"\u2AAF\u0338":c.BIN4,"\u2AB0\u0338":c.BIN4,"\u2AB1":c.REL,"\u2AB2":c.REL,"\u2AB3":c.REL,"\u2AB4":c.REL,"\u2AB5":c.REL,"\u2AB6":c.REL,"\u2AB7":c.REL,"\u2AB8":c.REL,"\u2AB9":c.REL,"\u2ABA":c.REL,"\u2ABB":c.REL,"\u2ABC":c.REL,"\u2ABD":c.REL,"\u2ABE":c.REL,"\u2ABF":c.REL,"\u2AC0":c.REL,"\u2AC1":c.REL,"\u2AC2":c.REL,"\u2AC3":c.REL,"\u2AC4":c.REL,"\u2AC5":c.REL,"\u2AC6":c.REL,"\u2AC7":c.REL,"\u2AC8":c.REL,"\u2AC9":c.REL,"\u2ACA":c.REL,"\u2ACB":c.REL,"\u2ACC":c.REL,"\u2ACD":c.REL,"\u2ACE":c.REL,"\u2ACF":c.REL,"\u2AD0":c.REL,"\u2AD1":c.REL,"\u2AD2":c.REL,"\u2AD3":c.REL,"\u2AD4":c.REL,"\u2AD5":c.REL,"\u2AD6":c.REL,"\u2AD7":c.REL,"\u2AD8":c.REL,"\u2AD9":c.REL,"\u2ADA":c.REL,"\u2ADB":c.REL,"\u2ADC":c.REL,"\u2ADD":c.REL,"\u2ADE":c.REL,"\u2ADF":c.REL,"\u2AE0":c.REL,"\u2AE1":c.REL,"\u2AE2":c.REL,"\u2AE3":c.REL,"\u2AE4":c.REL,"\u2AE5":c.REL,"\u2AE6":c.REL,"\u2AE7":c.REL,"\u2AE8":c.REL,"\u2AE9":c.REL,"\u2AEA":c.REL,"\u2AEB":c.REL,"\u2AEC":c.REL,"\u2AED":c.REL,"\u2AEE":c.REL,"\u2AEF":c.REL,"\u2AF0":c.REL,"\u2AF1":c.REL,"\u2AF2":c.REL,"\u2AF3":c.REL,"\u2AF4":c.BIN4,"\u2AF5":c.BIN4,"\u2AF6":c.BIN4,"\u2AF7":c.REL,"\u2AF8":c.REL,"\u2AF9":c.REL,"\u2AFA":c.REL,"\u2AFB":c.BIN4,"\u2AFD":c.BIN4,"\u2AFE":c.BIN3}}});MathJax.Ajax.loadComplete(a.optableDir+"/SuppMathOperators.js")})(MathJax.ElementJax.mml);
+
diff --git a/static/MathJax/jax/element/mml/optable/SupplementalArrowsB.js b/static/MathJax/jax/element/mml/optable/SupplementalArrowsB.js
new file mode 100644
index 0000000..b7c7c0c
--- /dev/null
+++ b/static/MathJax/jax/element/mml/optable/SupplementalArrowsB.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/element/mml/optable/SupplementalArrowsB.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){var c=a.mo.OPTYPES;var b=a.TEXCLASS;MathJax.Hub.Insert(a.mo.prototype,{OPTABLE:{infix:{"\u2900":c.REL,"\u2901":c.REL,"\u2902":c.REL,"\u2903":c.REL,"\u2904":c.REL,"\u2905":c.REL,"\u2906":c.REL,"\u2907":c.REL,"\u2908":c.REL,"\u2909":c.REL,"\u290A":c.WIDEREL,"\u290B":c.WIDEREL,"\u290C":c.WIDEREL,"\u290D":c.WIDEREL,"\u290E":c.WIDEREL,"\u290F":c.WIDEREL,"\u2910":c.WIDEREL,"\u2911":c.REL,"\u2912":c.WIDEREL,"\u2913":c.WIDEREL,"\u2914":c.REL,"\u2915":c.REL,"\u2916":c.REL,"\u2917":c.REL,"\u2918":c.REL,"\u2919":c.REL,"\u291A":c.REL,"\u291B":c.REL,"\u291C":c.REL,"\u291D":c.REL,"\u291E":c.REL,"\u291F":c.REL,"\u2920":c.REL,"\u2921":c.WIDEREL,"\u2922":c.WIDEREL,"\u2923":c.REL,"\u2924":c.REL,"\u2925":c.REL,"\u2926":c.REL,"\u2927":c.REL,"\u2928":c.REL,"\u2929":c.REL,"\u292A":c.REL,"\u292B":c.REL,"\u292C":c.REL,"\u292D":c.REL,"\u292E":c.REL,"\u292F":c.REL,"\u2930":c.REL,"\u2931":c.REL,"\u2932":c.REL,"\u2933":c.REL,"\u2934":c.REL,"\u2935":c.REL,"\u2936":c.REL,"\u2937":c.REL,"\u2938":c.REL,"\u2939":c.REL,"\u293A":c.REL,"\u293B":c.REL,"\u293C":c.REL,"\u293D":c.REL,"\u293E":c.REL,"\u293F":c.REL,"\u2940":c.REL,"\u2941":c.REL,"\u2942":c.REL,"\u2943":c.REL,"\u2944":c.REL,"\u2945":c.REL,"\u2946":c.REL,"\u2947":c.REL,"\u2948":c.REL,"\u2949":c.REL,"\u294A":c.REL,"\u294B":c.REL,"\u294C":c.REL,"\u294D":c.REL,"\u294E":c.RELACCENT,"\u294F":c.WIDEREL,"\u2950":c.WIDEREL,"\u2951":c.WIDEREL,"\u2952":c.WIDEREL,"\u2953":c.WIDEREL,"\u2954":c.WIDEREL,"\u2955":c.WIDEREL,"\u2956":c.WIDEREL,"\u2957":c.WIDEREL,"\u2958":c.WIDEREL,"\u2959":c.WIDEREL,"\u295A":c.WIDEREL,"\u295B":c.WIDEREL,"\u295C":c.WIDEREL,"\u295D":c.WIDEREL,"\u295E":c.WIDEREL,"\u295F":c.WIDEREL,"\u2960":c.WIDEREL,"\u2961":c.WIDEREL,"\u2962":c.REL,"\u2963":c.REL,"\u2964":c.REL,"\u2965":c.REL,"\u2966":c.REL,"\u2967":c.REL,"\u2968":c.REL,"\u2969":c.REL,"\u296A":c.REL,"\u296B":c.REL,"\u296C":c.REL,"\u296D":c.REL,"\u296E":c.WIDEREL,"\u296F":c.WIDEREL,"\u2970":c.REL,"\u2971":c.REL,"\u2972":c.REL,"\u2973":c.REL,"\u2974":c.REL,"\u2975":c.REL,"\u2976":c.REL,"\u2977":c.REL,"\u2978":c.REL,"\u2979":c.REL,"\u297A":c.REL,"\u297B":c.REL,"\u297C":c.REL,"\u297D":c.REL,"\u297E":c.REL,"\u297F":c.REL}}});MathJax.Ajax.loadComplete(a.optableDir+"/SupplementalArrowsB.js")})(MathJax.ElementJax.mml);
+
diff --git a/static/MathJax/jax/input/MathML/config.js b/static/MathJax/jax/input/MathML/config.js
new file mode 100644
index 0000000..2a0227b
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/config.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/config.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.InputJax.MathML=MathJax.InputJax({id:"MathML",version:"1.1.4",directory:MathJax.InputJax.directory+"/MathML",extensionDir:MathJax.InputJax.extensionDir+"/MathML",entityDir:MathJax.InputJax.directory+"/MathML/entities",config:{useMathMLspacing:false}});MathJax.InputJax.MathML.Register("math/mml");MathJax.InputJax.MathML.loadComplete("config.js");
+
diff --git a/static/MathJax/jax/input/MathML/entities/a.js b/static/MathJax/jax/input/MathML/entities/a.js
new file mode 100644
index 0000000..d0f091b
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/a.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/a.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{AElig:"\u00C6",AMP:"\u0026",Aacute:"\u00C1",Abreve:"\u0102",Acirc:"\u00C2",Acy:"\u0410",Agrave:"\u00C0",Alpha:"\u0391",Amacr:"\u0100",And:"\u2A53",Aogon:"\u0104",Aring:"\u00C5",Assign:"\u2254",Atilde:"\u00C3",Auml:"\u00C4",aacute:"\u00E1",abreve:"\u0103",ac:"\u223E",acE:"\u223E\u0333",acd:"\u223F",acirc:"\u00E2",acy:"\u0430",aelig:"\u00E6",af:"\u2061",agrave:"\u00E0",alefsym:"\u2135",amacr:"\u0101",amp:"\u0026",andand:"\u2A55",andd:"\u2A5C",andslope:"\u2A58",andv:"\u2A5A",ange:"\u29A4",angle:"\u2220",angmsdaa:"\u29A8",angmsdab:"\u29A9",angmsdac:"\u29AA",angmsdad:"\u29AB",angmsdae:"\u29AC",angmsdaf:"\u29AD",angmsdag:"\u29AE",angmsdah:"\u29AF",angrt:"\u221F",angrtvb:"\u22BE",angrtvbd:"\u299D",angst:"\u00C5",angzarr:"\u237C",aogon:"\u0105",ap:"\u2248",apE:"\u2A70",apacir:"\u2A6F",apid:"\u224B",apos:"\u0027",approx:"\u2248",approxeq:"\u224A",aring:"\u00E5",ast:"\u002A",asymp:"\u2248",asympeq:"\u224D",atilde:"\u00E3",auml:"\u00E4",awconint:"\u2233",awint:"\u2A11"});MathJax.Ajax.loadComplete(a.entityDir+"/a.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/b.js b/static/MathJax/jax/input/MathML/entities/b.js
new file mode 100644
index 0000000..edb6719
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/b.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/b.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{Barv:"\u2AE7",Barwed:"\u2306",Bcy:"\u0411",Bernoullis:"\u212C",Beta:"\u0392",Bumpeq:"\u224E",bNot:"\u2AED",backcong:"\u224C",backepsilon:"\u03F6",barvee:"\u22BD",barwed:"\u2305",barwedge:"\u2305",bbrk:"\u23B5",bbrktbrk:"\u23B6",bcong:"\u224C",bcy:"\u0431",bdquo:"\u201E",becaus:"\u2235",because:"\u2235",bemptyv:"\u29B0",bepsi:"\u03F6",bernou:"\u212C",bigcap:"\u22C2",bigcup:"\u22C3",bigvee:"\u22C1",bigwedge:"\u22C0",bkarow:"\u290D",blacksquare:"\u25AA",blacktriangleright:"\u25B8",blank:"\u2423",blk12:"\u2592",blk14:"\u2591",blk34:"\u2593",block:"\u2588",bne:"\u003D\u20E5",bnequiv:"\u2261\u20E5",bnot:"\u2310",bot:"\u22A5",bottom:"\u22A5",boxDL:"\u2557",boxDR:"\u2554",boxDl:"\u2556",boxDr:"\u2553",boxH:"\u2550",boxHD:"\u2566",boxHU:"\u2569",boxHd:"\u2564",boxHu:"\u2567",boxUL:"\u255D",boxUR:"\u255A",boxUl:"\u255C",boxUr:"\u2559",boxV:"\u2551",boxVH:"\u256C",boxVL:"\u2563",boxVR:"\u2560",boxVh:"\u256B",boxVl:"\u2562",boxVr:"\u255F",boxbox:"\u29C9",boxdL:"\u2555",boxdR:"\u2552",boxh:"\u2500",boxhD:"\u2565",boxhU:"\u2568",boxhd:"\u252C",boxhu:"\u2534",boxuL:"\u255B",boxuR:"\u2558",boxv:"\u2502",boxvH:"\u256A",boxvL:"\u2561",boxvR:"\u255E",boxvh:"\u253C",boxvl:"\u2524",boxvr:"\u251C",bprime:"\u2035",breve:"\u02D8",brvbar:"\u00A6",bsemi:"\u204F",bsim:"\u223D",bsime:"\u22CD",bsolb:"\u29C5",bsolhsub:"\u27C8",bullet:"\u2022",bump:"\u224E",bumpE:"\u2AAE",bumpe:"\u224F",bumpeq:"\u224F"});MathJax.Ajax.loadComplete(a.entityDir+"/b.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/c.js b/static/MathJax/jax/input/MathML/entities/c.js
new file mode 100644
index 0000000..e5db378
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/c.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/c.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{CHcy:"\u0427",COPY:"\u00A9",Cacute:"\u0106",CapitalDifferentialD:"\u2145",Cayleys:"\u212D",Ccaron:"\u010C",Ccedil:"\u00C7",Ccirc:"\u0108",Cconint:"\u2230",Cdot:"\u010A",Cedilla:"\u00B8",Chi:"\u03A7",ClockwiseContourIntegral:"\u2232",CloseCurlyDoubleQuote:"\u201D",CloseCurlyQuote:"\u2019",Colon:"\u2237",Colone:"\u2A74",Conint:"\u222F",CounterClockwiseContourIntegral:"\u2233",cacute:"\u0107",capand:"\u2A44",capbrcup:"\u2A49",capcap:"\u2A4B",capcup:"\u2A47",capdot:"\u2A40",caps:"\u2229\uFE00",caret:"\u2041",caron:"\u02C7",ccaps:"\u2A4D",ccaron:"\u010D",ccedil:"\u00E7",ccirc:"\u0109",ccups:"\u2A4C",ccupssm:"\u2A50",cdot:"\u010B",cedil:"\u00B8",cemptyv:"\u29B2",cent:"\u00A2",centerdot:"\u00B7",chcy:"\u0447",checkmark:"\u2713",cir:"\u25CB",cirE:"\u29C3",cire:"\u2257",cirfnint:"\u2A10",cirmid:"\u2AEF",cirscir:"\u29C2",clubsuit:"\u2663",colone:"\u2254",coloneq:"\u2254",comma:"\u002C",commat:"\u0040",compfn:"\u2218",complement:"\u2201",complexes:"\u2102",cong:"\u2245",congdot:"\u2A6D",conint:"\u222E",coprod:"\u2210",copy:"\u00A9",copysr:"\u2117",crarr:"\u21B5",cross:"\u2717",csub:"\u2ACF",csube:"\u2AD1",csup:"\u2AD0",csupe:"\u2AD2",cudarrl:"\u2938",cudarrr:"\u2935",cularrp:"\u293D",cupbrcap:"\u2A48",cupcap:"\u2A46",cupcup:"\u2A4A",cupdot:"\u228D",cupor:"\u2A45",cups:"\u222A\uFE00",curarrm:"\u293C",curlyeqprec:"\u22DE",curlyeqsucc:"\u22DF",curren:"\u00A4",curvearrowleft:"\u21B6",curvearrowright:"\u21B7",cuvee:"\u22CE",cuwed:"\u22CF",cwconint:"\u2232",cwint:"\u2231",cylcty:"\u232D"});MathJax.Ajax.loadComplete(a.entityDir+"/c.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/d.js b/static/MathJax/jax/input/MathML/entities/d.js
new file mode 100644
index 0000000..590b649
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/d.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/d.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{DD:"\u2145",DDotrahd:"\u2911",DJcy:"\u0402",DScy:"\u0405",DZcy:"\u040F",Darr:"\u21A1",Dashv:"\u2AE4",Dcaron:"\u010E",Dcy:"\u0414",DiacriticalAcute:"\u00B4",DiacriticalDot:"\u02D9",DiacriticalDoubleAcute:"\u02DD",DiacriticalGrave:"\u0060",DiacriticalTilde:"\u02DC",Dot:"\u00A8",DotDot:"\u20DC",DoubleContourIntegral:"\u222F",DoubleDownArrow:"\u21D3",DoubleLeftArrow:"\u21D0",DoubleLeftRightArrow:"\u21D4",DoubleLeftTee:"\u2AE4",DoubleLongLeftArrow:"\u27F8",DoubleLongLeftRightArrow:"\u27FA",DoubleLongRightArrow:"\u27F9",DoubleRightArrow:"\u21D2",DoubleUpArrow:"\u21D1",DoubleUpDownArrow:"\u21D5",DownArrowBar:"\u2913",DownArrowUpArrow:"\u21F5",DownBreve:"\u0311",DownLeftRightVector:"\u2950",DownLeftTeeVector:"\u295E",DownLeftVectorBar:"\u2956",DownRightTeeVector:"\u295F",DownRightVectorBar:"\u2957",DownTeeArrow:"\u21A7",Dstrok:"\u0110",dArr:"\u21D3",dHar:"\u2965",darr:"\u2193",dash:"\u2010",dashv:"\u22A3",dbkarow:"\u290F",dblac:"\u02DD",dcaron:"\u010F",dcy:"\u0434",dd:"\u2146",ddagger:"\u2021",ddotseq:"\u2A77",demptyv:"\u29B1",dfisht:"\u297F",dharl:"\u21C3",dharr:"\u21C2",diam:"\u22C4",diamond:"\u22C4",diamondsuit:"\u2666",diams:"\u2666",die:"\u00A8",disin:"\u22F2",divide:"\u00F7",divonx:"\u22C7",djcy:"\u0452",dlcorn:"\u231E",dlcrop:"\u230D",dollar:"\u0024",doteq:"\u2250",dotminus:"\u2238",doublebarwedge:"\u2306",downarrow:"\u2193",downdownarrows:"\u21CA",downharpoonleft:"\u21C3",downharpoonright:"\u21C2",drbkarow:"\u2910",drcorn:"\u231F",drcrop:"\u230C",dscy:"\u0455",dsol:"\u29F6",dstrok:"\u0111",dtri:"\u25BF",dtrif:"\u25BE",duarr:"\u21F5",duhar:"\u296F",dwangle:"\u29A6",dzcy:"\u045F",dzigrarr:"\u27FF"});MathJax.Ajax.loadComplete(a.entityDir+"/d.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/e.js b/static/MathJax/jax/input/MathML/entities/e.js
new file mode 100644
index 0000000..1ec4cfc
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/e.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/e.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{ENG:"\u014A",ETH:"\u00D0",Eacute:"\u00C9",Ecaron:"\u011A",Ecirc:"\u00CA",Ecy:"\u042D",Edot:"\u0116",Egrave:"\u00C8",Emacr:"\u0112",EmptySmallSquare:"\u25FB",EmptyVerySmallSquare:"\u25AB",Eogon:"\u0118",Epsilon:"\u0395",Equal:"\u2A75",Esim:"\u2A73",Eta:"\u0397",Euml:"\u00CB",eDDot:"\u2A77",eDot:"\u2251",eacute:"\u00E9",easter:"\u2A6E",ecaron:"\u011B",ecirc:"\u00EA",ecolon:"\u2255",ecy:"\u044D",edot:"\u0117",ee:"\u2147",eg:"\u2A9A",egrave:"\u00E8",egsdot:"\u2A98",el:"\u2A99",elinters:"\u23E7",elsdot:"\u2A97",emacr:"\u0113",emptyset:"\u2205",emptyv:"\u2205",emsp:"\u2003",emsp13:"\u2004",emsp14:"\u2005",eng:"\u014B",ensp:"\u2002",eogon:"\u0119",epar:"\u22D5",eparsl:"\u29E3",eplus:"\u2A71",epsilon:"\u03B5",eqcirc:"\u2256",eqcolon:"\u2255",eqsim:"\u2242",eqslantgtr:"\u2A96",eqslantless:"\u2A95",equals:"\u003D",equest:"\u225F",equiv:"\u2261",equivDD:"\u2A78",eqvparsl:"\u29E5",erarr:"\u2971",esdot:"\u2250",esim:"\u2242",euml:"\u00EB",euro:"\u20AC",excl:"\u0021",exist:"\u2203",expectation:"\u2130",exponentiale:"\u2147"});MathJax.Ajax.loadComplete(a.entityDir+"/e.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/f.js b/static/MathJax/jax/input/MathML/entities/f.js
new file mode 100644
index 0000000..211c8b9
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/f.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/f.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{Fcy:"\u0424",FilledSmallSquare:"\u25FC",Fouriertrf:"\u2131",fallingdotseq:"\u2252",fcy:"\u0444",female:"\u2640",ffilig:"\uFB03",fflig:"\uFB00",ffllig:"\uFB04",filig:"\uFB01",fjlig:"\u0066\u006A",fllig:"\uFB02",fltns:"\u25B1",fnof:"\u0192",forall:"\u2200",forkv:"\u2AD9",fpartint:"\u2A0D",frac12:"\u00BD",frac13:"\u2153",frac14:"\u00BC",frac15:"\u2155",frac16:"\u2159",frac18:"\u215B",frac23:"\u2154",frac25:"\u2156",frac34:"\u00BE",frac35:"\u2157",frac38:"\u215C",frac45:"\u2158",frac56:"\u215A",frac58:"\u215D",frac78:"\u215E",frasl:"\u2044"});MathJax.Ajax.loadComplete(a.entityDir+"/f.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/fr.js b/static/MathJax/jax/input/MathML/entities/fr.js
new file mode 100644
index 0000000..2fd687a
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/fr.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/fr.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{Afr:"\uD835\uDD04",Bfr:"\uD835\uDD05",Cfr:"\u212D",Dfr:"\uD835\uDD07",Efr:"\uD835\uDD08",Ffr:"\uD835\uDD09",Gfr:"\uD835\uDD0A",Hfr:"\u210C",Ifr:"\u2111",Jfr:"\uD835\uDD0D",Kfr:"\uD835\uDD0E",Lfr:"\uD835\uDD0F",Mfr:"\uD835\uDD10",Nfr:"\uD835\uDD11",Ofr:"\uD835\uDD12",Pfr:"\uD835\uDD13",Qfr:"\uD835\uDD14",Rfr:"\u211C",Sfr:"\uD835\uDD16",Tfr:"\uD835\uDD17",Ufr:"\uD835\uDD18",Vfr:"\uD835\uDD19",Wfr:"\uD835\uDD1A",Xfr:"\uD835\uDD1B",Yfr:"\uD835\uDD1C",Zfr:"\u2128",afr:"\uD835\uDD1E",bfr:"\uD835\uDD1F",cfr:"\uD835\uDD20",dfr:"\uD835\uDD21",efr:"\uD835\uDD22",ffr:"\uD835\uDD23",gfr:"\uD835\uDD24",hfr:"\uD835\uDD25",ifr:"\uD835\uDD26",jfr:"\uD835\uDD27",kfr:"\uD835\uDD28",lfr:"\uD835\uDD29",mfr:"\uD835\uDD2A",nfr:"\uD835\uDD2B",ofr:"\uD835\uDD2C",pfr:"\uD835\uDD2D",qfr:"\uD835\uDD2E",rfr:"\uD835\uDD2F",sfr:"\uD835\uDD30",tfr:"\uD835\uDD31",ufr:"\uD835\uDD32",vfr:"\uD835\uDD33",wfr:"\uD835\uDD34",xfr:"\uD835\uDD35",yfr:"\uD835\uDD36",zfr:"\uD835\uDD37"});MathJax.Ajax.loadComplete(a.entityDir+"/fr.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/g.js b/static/MathJax/jax/input/MathML/entities/g.js
new file mode 100644
index 0000000..48be18a
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/g.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/g.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{GJcy:"\u0403",GT:"\u003E",Gammad:"\u03DC",Gbreve:"\u011E",Gcedil:"\u0122",Gcirc:"\u011C",Gcy:"\u0413",Gdot:"\u0120",GreaterGreater:"\u2AA2",Gt:"\u226B",gE:"\u2267",gacute:"\u01F5",gammad:"\u03DD",gbreve:"\u011F",gcirc:"\u011D",gcy:"\u0433",gdot:"\u0121",ge:"\u2265",gel:"\u22DB",geq:"\u2265",geqq:"\u2267",geqslant:"\u2A7E",ges:"\u2A7E",gescc:"\u2AA9",gesdot:"\u2A80",gesdoto:"\u2A82",gesdotol:"\u2A84",gesl:"\u22DB\uFE00",gesles:"\u2A94",gg:"\u226B",ggg:"\u22D9",gjcy:"\u0453",gl:"\u2277",glE:"\u2A92",gla:"\u2AA5",glj:"\u2AA4",gnapprox:"\u2A8A",gneq:"\u2A88",gneqq:"\u2269",grave:"\u0060",gsim:"\u2273",gsime:"\u2A8E",gsiml:"\u2A90",gtcc:"\u2AA7",gtcir:"\u2A7A",gtlPar:"\u2995",gtquest:"\u2A7C",gtrapprox:"\u2A86",gtrarr:"\u2978",gtrdot:"\u22D7",gtreqless:"\u22DB",gtreqqless:"\u2A8C",gtrless:"\u2277",gtrsim:"\u2273",gvertneqq:"\u2269\uFE00",gvnE:"\u2269\uFE00"});MathJax.Ajax.loadComplete(a.entityDir+"/g.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/h.js b/static/MathJax/jax/input/MathML/entities/h.js
new file mode 100644
index 0000000..608e4a2
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/h.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/h.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{HARDcy:"\u042A",Hcirc:"\u0124",HilbertSpace:"\u210B",HorizontalLine:"\u2500",Hstrok:"\u0126",hArr:"\u21D4",hairsp:"\u200A",half:"\u00BD",hamilt:"\u210B",hardcy:"\u044A",harr:"\u2194",harrcir:"\u2948",hcirc:"\u0125",hearts:"\u2665",heartsuit:"\u2665",hercon:"\u22B9",hksearow:"\u2925",hkswarow:"\u2926",hoarr:"\u21FF",homtht:"\u223B",horbar:"\u2015",hslash:"\u210F",hstrok:"\u0127",hybull:"\u2043",hyphen:"\u2010"});MathJax.Ajax.loadComplete(a.entityDir+"/h.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/i.js b/static/MathJax/jax/input/MathML/entities/i.js
new file mode 100644
index 0000000..6b4e1c6
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/i.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/i.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{IEcy:"\u0415",IJlig:"\u0132",IOcy:"\u0401",Iacute:"\u00CD",Icirc:"\u00CE",Icy:"\u0418",Idot:"\u0130",Igrave:"\u00CC",Imacr:"\u012A",Implies:"\u21D2",Int:"\u222C",Iogon:"\u012E",Iota:"\u0399",Itilde:"\u0128",Iukcy:"\u0406",Iuml:"\u00CF",iacute:"\u00ED",ic:"\u2063",icirc:"\u00EE",icy:"\u0438",iecy:"\u0435",iexcl:"\u00A1",iff:"\u21D4",igrave:"\u00EC",ii:"\u2148",iiiint:"\u2A0C",iiint:"\u222D",iinfin:"\u29DC",iiota:"\u2129",ijlig:"\u0133",imacr:"\u012B",image:"\u2111",imagline:"\u2110",imagpart:"\u2111",imof:"\u22B7",imped:"\u01B5","in":"\u2208",incare:"\u2105",infintie:"\u29DD",inodot:"\u0131","int":"\u222B",integers:"\u2124",intercal:"\u22BA",intlarhk:"\u2A17",intprod:"\u2A3C",iocy:"\u0451",iogon:"\u012F",iprod:"\u2A3C",iquest:"\u00BF",isin:"\u2208",isinE:"\u22F9",isindot:"\u22F5",isins:"\u22F4",isinsv:"\u22F3",isinv:"\u2208",it:"\u2062",itilde:"\u0129",iukcy:"\u0456",iuml:"\u00EF"});MathJax.Ajax.loadComplete(a.entityDir+"/i.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/j.js b/static/MathJax/jax/input/MathML/entities/j.js
new file mode 100644
index 0000000..b66dac0
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/j.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/j.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{Jcirc:"\u0134",Jcy:"\u0419",Jsercy:"\u0408",Jukcy:"\u0404",jcirc:"\u0135",jcy:"\u0439",jsercy:"\u0458",jukcy:"\u0454"});MathJax.Ajax.loadComplete(a.entityDir+"/j.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/k.js b/static/MathJax/jax/input/MathML/entities/k.js
new file mode 100644
index 0000000..1b66ebd
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/k.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/k.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{KHcy:"\u0425",KJcy:"\u040C",Kappa:"\u039A",Kcedil:"\u0136",Kcy:"\u041A",kcedil:"\u0137",kcy:"\u043A",kgreen:"\u0138",khcy:"\u0445",kjcy:"\u045C"});MathJax.Ajax.loadComplete(a.entityDir+"/k.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/l.js b/static/MathJax/jax/input/MathML/entities/l.js
new file mode 100644
index 0000000..efc168d
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/l.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/l.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{LJcy:"\u0409",LT:"\u003C",Lacute:"\u0139",Lang:"\u27EA",Laplacetrf:"\u2112",Lcaron:"\u013D",Lcedil:"\u013B",Lcy:"\u041B",LeftArrowBar:"\u21E4",LeftDoubleBracket:"\u27E6",LeftDownTeeVector:"\u2961",LeftDownVectorBar:"\u2959",LeftRightVector:"\u294E",LeftTeeArrow:"\u21A4",LeftTeeVector:"\u295A",LeftTriangleBar:"\u29CF",LeftUpDownVector:"\u2951",LeftUpTeeVector:"\u2960",LeftUpVectorBar:"\u2958",LeftVectorBar:"\u2952",LessLess:"\u2AA1",Lmidot:"\u013F",LowerLeftArrow:"\u2199",LowerRightArrow:"\u2198",Lstrok:"\u0141",Lt:"\u226A",lAarr:"\u21DA",lArr:"\u21D0",lAtail:"\u291B",lBarr:"\u290E",lE:"\u2266",lHar:"\u2962",lacute:"\u013A",laemptyv:"\u29B4",lagran:"\u2112",lang:"\u27E8",langd:"\u2991",langle:"\u27E8",laquo:"\u00AB",larr:"\u2190",larrb:"\u21E4",larrbfs:"\u291F",larrfs:"\u291D",larrhk:"\u21A9",larrpl:"\u2939",larrsim:"\u2973",lat:"\u2AAB",latail:"\u2919",late:"\u2AAD",lates:"\u2AAD\uFE00",lbarr:"\u290C",lbbrk:"\u2772",lbrke:"\u298B",lbrksld:"\u298F",lbrkslu:"\u298D",lcaron:"\u013E",lcedil:"\u013C",lceil:"\u2308",lcub:"\u007B",lcy:"\u043B",ldca:"\u2936",ldquo:"\u201C",ldquor:"\u201E",ldrdhar:"\u2967",ldrushar:"\u294B",ldsh:"\u21B2",leftarrow:"\u2190",leftarrowtail:"\u21A2",leftharpoondown:"\u21BD",leftharpoonup:"\u21BC",leftrightarrow:"\u2194",leftrightarrows:"\u21C6",leftrightharpoons:"\u21CB",leftrightsquigarrow:"\u21AD",leg:"\u22DA",leq:"\u2264",leqq:"\u2266",leqslant:"\u2A7D",les:"\u2A7D",lescc:"\u2AA8",lesdot:"\u2A7F",lesdoto:"\u2A81",lesdotor:"\u2A83",lesg:"\u22DA\uFE00",lesges:"\u2A93",lessapprox:"\u2A85",lesseqgtr:"\u22DA",lesseqqgtr:"\u2A8B",lessgtr:"\u2276",lesssim:"\u2272",lfisht:"\u297C",lfloor:"\u230A",lg:"\u2276",lgE:"\u2A91",lhard:"\u21BD",lharu:"\u21BC",lharul:"\u296A",lhblk:"\u2584",ljcy:"\u0459",ll:"\u226A",llarr:"\u21C7",llcorner:"\u231E",llhard:"\u296B",lltri:"\u25FA",lmidot:"\u0140",lmoustache:"\u23B0",lnapprox:"\u2A89",lneq:"\u2A87",lneqq:"\u2268",loang:"\u27EC",loarr:"\u21FD",lobrk:"\u27E6",longleftarrow:"\u27F5",longleftrightarrow:"\u27F7",longrightarrow:"\u27F6",looparrowleft:"\u21AB",lopar:"\u2985",loplus:"\u2A2D",lotimes:"\u2A34",lowbar:"\u005F",lozenge:"\u25CA",lozf:"\u29EB",lpar:"\u0028",lparlt:"\u2993",lrarr:"\u21C6",lrcorner:"\u231F",lrhar:"\u21CB",lrhard:"\u296D",lrm:"\u200E",lrtri:"\u22BF",lsaquo:"\u2039",lsh:"\u21B0",lsim:"\u2272",lsime:"\u2A8D",lsimg:"\u2A8F",lsqb:"\u005B",lsquo:"\u2018",lsquor:"\u201A",lstrok:"\u0142",ltcc:"\u2AA6",ltcir:"\u2A79",ltdot:"\u22D6",lthree:"\u22CB",ltlarr:"\u2976",ltquest:"\u2A7B",ltrPar:"\u2996",ltrie:"\u22B4",ltrif:"\u25C2",lurdshar:"\u294A",luruhar:"\u2966",lvertneqq:"\u2268\uFE00",lvnE:"\u2268\uFE00"});MathJax.Ajax.loadComplete(a.entityDir+"/l.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/m.js b/static/MathJax/jax/input/MathML/entities/m.js
new file mode 100644
index 0000000..764851b
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/m.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/m.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{Map:"\u2905",Mcy:"\u041C",MediumSpace:"\u205F",Mellintrf:"\u2133",Mu:"\u039C",mDDot:"\u223A",male:"\u2642",maltese:"\u2720",map:"\u21A6",mapsto:"\u21A6",mapstodown:"\u21A7",mapstoleft:"\u21A4",mapstoup:"\u21A5",marker:"\u25AE",mcomma:"\u2A29",mcy:"\u043C",mdash:"\u2014",measuredangle:"\u2221",micro:"\u00B5",mid:"\u2223",midast:"\u002A",midcir:"\u2AF0",middot:"\u00B7",minus:"\u2212",minusb:"\u229F",minusd:"\u2238",minusdu:"\u2A2A",mlcp:"\u2ADB",mldr:"\u2026",mnplus:"\u2213",models:"\u22A7",mp:"\u2213",mstpos:"\u223E",mumap:"\u22B8"});MathJax.Ajax.loadComplete(a.entityDir+"/m.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/n.js b/static/MathJax/jax/input/MathML/entities/n.js
new file mode 100644
index 0000000..2c674a1
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/n.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/n.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{NJcy:"\u040A",Nacute:"\u0143",Ncaron:"\u0147",Ncedil:"\u0145",Ncy:"\u041D",NegativeMediumSpace:"\u200B",NegativeThickSpace:"\u200B",NegativeThinSpace:"\u200B",NegativeVeryThinSpace:"\u200B",NewLine:"\u000A",NoBreak:"\u2060",NonBreakingSpace:"\u00A0",Not:"\u2AEC",NotCongruent:"\u2262",NotCupCap:"\u226D",NotEqualTilde:"\u2242\u0338",NotGreaterFullEqual:"\u2267\u0338",NotGreaterGreater:"\u226B\u0338",NotGreaterLess:"\u2279",NotGreaterSlantEqual:"\u2A7E\u0338",NotGreaterTilde:"\u2275",NotHumpDownHump:"\u224E\u0338",NotHumpEqual:"\u224F\u0338",NotLeftTriangleBar:"\u29CF\u0338",NotLessGreater:"\u2278",NotLessLess:"\u226A\u0338",NotLessSlantEqual:"\u2A7D\u0338",NotLessTilde:"\u2274",NotNestedGreaterGreater:"\u2AA2\u0338",NotNestedLessLess:"\u2AA1\u0338",NotPrecedesEqual:"\u2AAF\u0338",NotReverseElement:"\u220C",NotRightTriangleBar:"\u29D0\u0338",NotSquareSubset:"\u228F\u0338",NotSquareSubsetEqual:"\u22E2",NotSquareSuperset:"\u2290\u0338",NotSquareSupersetEqual:"\u22E3",NotSubset:"\u2282\u20D2",NotSucceedsEqual:"\u2AB0\u0338",NotSucceedsTilde:"\u227F\u0338",NotSuperset:"\u2283\u20D2",NotTildeEqual:"\u2244",NotTildeFullEqual:"\u2247",NotTildeTilde:"\u2249",Ntilde:"\u00D1",Nu:"\u039D",nGg:"\u22D9\u0338",nGt:"\u226B\u20D2",nGtv:"\u226B\u0338",nLl:"\u22D8\u0338",nLt:"\u226A\u20D2",nLtv:"\u226A\u0338",nabla:"\u2207",nacute:"\u0144",nang:"\u2220\u20D2",nap:"\u2249",napE:"\u2A70\u0338",napid:"\u224B\u0338",napos:"\u0149",napprox:"\u2249",natural:"\u266E",naturals:"\u2115",nbsp:"\u00A0",nbump:"\u224E\u0338",nbumpe:"\u224F\u0338",ncap:"\u2A43",ncaron:"\u0148",ncedil:"\u0146",ncong:"\u2247",ncongdot:"\u2A6D\u0338",ncup:"\u2A42",ncy:"\u043D",ndash:"\u2013",ne:"\u2260",neArr:"\u21D7",nearhk:"\u2924",nearrow:"\u2197",nedot:"\u2250\u0338",nequiv:"\u2262",nesear:"\u2928",nesim:"\u2242\u0338",nexist:"\u2204",nexists:"\u2204",ngE:"\u2267\u0338",nge:"\u2271",ngeq:"\u2271",ngeqq:"\u2267\u0338",ngeqslant:"\u2A7E\u0338",nges:"\u2A7E\u0338",ngsim:"\u2275",ngt:"\u226F",ngtr:"\u226F",nhArr:"\u21CE",nhpar:"\u2AF2",ni:"\u220B",nis:"\u22FC",nisd:"\u22FA",niv:"\u220B",njcy:"\u045A",nlArr:"\u21CD",nlE:"\u2266\u0338",nldr:"\u2025",nle:"\u2270",nleftarrow:"\u219A",nleftrightarrow:"\u21AE",nleq:"\u2270",nleqq:"\u2266\u0338",nleqslant:"\u2A7D\u0338",nles:"\u2A7D\u0338",nless:"\u226E",nlsim:"\u2274",nlt:"\u226E",nltri:"\u22EA",nltrie:"\u22EC",nmid:"\u2224",notin:"\u2209",notinE:"\u22F9\u0338",notindot:"\u22F5\u0338",notinva:"\u2209",notinvb:"\u22F7",notinvc:"\u22F6",notni:"\u220C",notniva:"\u220C",notnivb:"\u22FE",notnivc:"\u22FD",npar:"\u2226",nparallel:"\u2226",nparsl:"\u2AFD\u20E5",npart:"\u2202\u0338",npolint:"\u2A14",npr:"\u2280",nprcue:"\u22E0",npre:"\u2AAF\u0338",nprec:"\u2280",npreceq:"\u2AAF\u0338",nrArr:"\u21CF",nrarrc:"\u2933\u0338",nrarrw:"\u219D\u0338",nrightarrow:"\u219B",nrtri:"\u22EB",nrtrie:"\u22ED",nsc:"\u2281",nsccue:"\u22E1",nsce:"\u2AB0\u0338",nshortmid:"\u2224",nshortparallel:"\u2226",nsim:"\u2241",nsime:"\u2244",nsimeq:"\u2244",nsmid:"\u2224",nspar:"\u2226",nsqsube:"\u22E2",nsqsupe:"\u22E3",nsub:"\u2284",nsubE:"\u2AC5\u0338",nsube:"\u2288",nsubset:"\u2282\u20D2",nsubseteq:"\u2288",nsubseteqq:"\u2AC5\u0338",nsucc:"\u2281",nsucceq:"\u2AB0\u0338",nsup:"\u2285",nsupE:"\u2AC6\u0338",nsupe:"\u2289",nsupset:"\u2283\u20D2",nsupseteq:"\u2289",nsupseteqq:"\u2AC6\u0338",ntgl:"\u2279",ntilde:"\u00F1",ntlg:"\u2278",ntriangleleft:"\u22EA",ntrianglelefteq:"\u22EC",ntriangleright:"\u22EB",ntrianglerighteq:"\u22ED",num:"\u0023",numero:"\u2116",numsp:"\u2007",nvHarr:"\u2904",nvap:"\u224D\u20D2",nvge:"\u2265\u20D2",nvgt:"\u003E\u20D2",nvinfin:"\u29DE",nvlArr:"\u2902",nvle:"\u2264\u20D2",nvlt:"\u003C\u20D2",nvltrie:"\u22B4\u20D2",nvrArr:"\u2903",nvrtrie:"\u22B5\u20D2",nvsim:"\u223C\u20D2",nwArr:"\u21D6",nwarhk:"\u2923",nwarrow:"\u2196",nwnear:"\u2927"});MathJax.Ajax.loadComplete(a.entityDir+"/n.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/o.js b/static/MathJax/jax/input/MathML/entities/o.js
new file mode 100644
index 0000000..d8fd4df
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/o.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/o.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{OElig:"\u0152",Oacute:"\u00D3",Ocirc:"\u00D4",Ocy:"\u041E",Odblac:"\u0150",Ograve:"\u00D2",Omacr:"\u014C",Omicron:"\u039F",OpenCurlyDoubleQuote:"\u201C",OpenCurlyQuote:"\u2018",Or:"\u2A54",Oslash:"\u00D8",Otilde:"\u00D5",Otimes:"\u2A37",Ouml:"\u00D6",OverBracket:"\u23B4",OverParenthesis:"\u23DC",oS:"\u24C8",oacute:"\u00F3",oast:"\u229B",ocir:"\u229A",ocirc:"\u00F4",ocy:"\u043E",odash:"\u229D",odblac:"\u0151",odiv:"\u2A38",odot:"\u2299",odsold:"\u29BC",oelig:"\u0153",ofcir:"\u29BF",ogon:"\u02DB",ograve:"\u00F2",ogt:"\u29C1",ohbar:"\u29B5",ohm:"\u03A9",oint:"\u222E",olarr:"\u21BA",olcir:"\u29BE",olcross:"\u29BB",oline:"\u203E",olt:"\u29C0",omacr:"\u014D",omid:"\u29B6",ominus:"\u2296",opar:"\u29B7",operp:"\u29B9",oplus:"\u2295",orarr:"\u21BB",ord:"\u2A5D",order:"\u2134",orderof:"\u2134",ordf:"\u00AA",ordm:"\u00BA",origof:"\u22B6",oror:"\u2A56",orslope:"\u2A57",orv:"\u2A5B",oslash:"\u00F8",otilde:"\u00F5",otimes:"\u2297",otimesas:"\u2A36",ouml:"\u00F6",ovbar:"\u233D"});MathJax.Ajax.loadComplete(a.entityDir+"/o.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/opf.js b/static/MathJax/jax/input/MathML/entities/opf.js
new file mode 100644
index 0000000..8f901cd
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/opf.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/opf.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{Aopf:"\uD835\uDD38",Bopf:"\uD835\uDD39",Copf:"\u2102",Dopf:"\uD835\uDD3B",Eopf:"\uD835\uDD3C",Fopf:"\uD835\uDD3D",Gopf:"\uD835\uDD3E",Hopf:"\u210D",Iopf:"\uD835\uDD40",Jopf:"\uD835\uDD41",Kopf:"\uD835\uDD42",Lopf:"\uD835\uDD43",Mopf:"\uD835\uDD44",Nopf:"\u2115",Oopf:"\uD835\uDD46",Popf:"\u2119",Qopf:"\u211A",Ropf:"\u211D",Sopf:"\uD835\uDD4A",Topf:"\uD835\uDD4B",Uopf:"\uD835\uDD4C",Vopf:"\uD835\uDD4D",Wopf:"\uD835\uDD4E",Xopf:"\uD835\uDD4F",Yopf:"\uD835\uDD50",Zopf:"\u2124",aopf:"\uD835\uDD52",bopf:"\uD835\uDD53",copf:"\uD835\uDD54",dopf:"\uD835\uDD55",eopf:"\uD835\uDD56",fopf:"\uD835\uDD57",gopf:"\uD835\uDD58",hopf:"\uD835\uDD59",iopf:"\uD835\uDD5A",jopf:"\uD835\uDD5B",kopf:"\uD835\uDD5C",lopf:"\uD835\uDD5D",mopf:"\uD835\uDD5E",nopf:"\uD835\uDD5F",oopf:"\uD835\uDD60",popf:"\uD835\uDD61",qopf:"\uD835\uDD62",ropf:"\uD835\uDD63",sopf:"\uD835\uDD64",topf:"\uD835\uDD65",uopf:"\uD835\uDD66",vopf:"\uD835\uDD67",wopf:"\uD835\uDD68",xopf:"\uD835\uDD69",yopf:"\uD835\uDD6A",zopf:"\uD835\uDD6B"});MathJax.Ajax.loadComplete(a.entityDir+"/opf.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/p.js b/static/MathJax/jax/input/MathML/entities/p.js
new file mode 100644
index 0000000..3db66d2
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/p.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/p.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{Pcy:"\u041F",Poincareplane:"\u210C",Pr:"\u2ABB",Prime:"\u2033",Proportion:"\u2237",par:"\u2225",para:"\u00B6",parallel:"\u2225",parsim:"\u2AF3",parsl:"\u2AFD",part:"\u2202",pcy:"\u043F",percnt:"\u0025",permil:"\u2030",perp:"\u22A5",pertenk:"\u2031",phmmat:"\u2133",phone:"\u260E",pitchfork:"\u22D4",planck:"\u210F",planckh:"\u210E",plankv:"\u210F",plus:"\u002B",plusacir:"\u2A23",plusb:"\u229E",pluscir:"\u2A22",plusdo:"\u2214",plusdu:"\u2A25",pluse:"\u2A72",plusmn:"\u00B1",plussim:"\u2A26",plustwo:"\u2A27",pm:"\u00B1",pointint:"\u2A15",pound:"\u00A3",pr:"\u227A",prE:"\u2AB3",prcue:"\u227C",pre:"\u2AAF",prec:"\u227A",precapprox:"\u2AB7",preccurlyeq:"\u227C",preceq:"\u2AAF",precsim:"\u227E",primes:"\u2119",prnE:"\u2AB5",prnap:"\u2AB9",prnsim:"\u22E8",prod:"\u220F",profalar:"\u232E",profline:"\u2312",profsurf:"\u2313",prop:"\u221D",propto:"\u221D",prsim:"\u227E",prurel:"\u22B0",puncsp:"\u2008"});MathJax.Ajax.loadComplete(a.entityDir+"/p.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/q.js b/static/MathJax/jax/input/MathML/entities/q.js
new file mode 100644
index 0000000..0afdbe3
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/q.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/q.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{QUOT:"\u0022",qint:"\u2A0C",qprime:"\u2057",quaternions:"\u210D",quatint:"\u2A16",quest:"\u003F",questeq:"\u225F",quot:"\u0022"});MathJax.Ajax.loadComplete(a.entityDir+"/q.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/r.js b/static/MathJax/jax/input/MathML/entities/r.js
new file mode 100644
index 0000000..a8b4a29
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/r.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/r.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{RBarr:"\u2910",REG:"\u00AE",Racute:"\u0154",Rang:"\u27EB",Rarrtl:"\u2916",Rcaron:"\u0158",Rcedil:"\u0156",Rcy:"\u0420",ReverseElement:"\u220B",ReverseUpEquilibrium:"\u296F",Rho:"\u03A1",RightArrowBar:"\u21E5",RightDoubleBracket:"\u27E7",RightDownTeeVector:"\u295D",RightDownVectorBar:"\u2955",RightTeeVector:"\u295B",RightTriangleBar:"\u29D0",RightUpDownVector:"\u294F",RightUpTeeVector:"\u295C",RightUpVectorBar:"\u2954",RightVectorBar:"\u2953",RoundImplies:"\u2970",RuleDelayed:"\u29F4",rAarr:"\u21DB",rArr:"\u21D2",rAtail:"\u291C",rBarr:"\u290F",rHar:"\u2964",race:"\u223D\u0331",racute:"\u0155",radic:"\u221A",raemptyv:"\u29B3",rang:"\u27E9",rangd:"\u2992",range:"\u29A5",rangle:"\u27E9",raquo:"\u00BB",rarr:"\u2192",rarrap:"\u2975",rarrb:"\u21E5",rarrbfs:"\u2920",rarrc:"\u2933",rarrfs:"\u291E",rarrhk:"\u21AA",rarrlp:"\u21AC",rarrpl:"\u2945",rarrsim:"\u2974",rarrw:"\u219D",ratail:"\u291A",ratio:"\u2236",rationals:"\u211A",rbarr:"\u290D",rbbrk:"\u2773",rbrke:"\u298C",rbrksld:"\u298E",rbrkslu:"\u2990",rcaron:"\u0159",rcedil:"\u0157",rceil:"\u2309",rcub:"\u007D",rcy:"\u0440",rdca:"\u2937",rdldhar:"\u2969",rdquo:"\u201D",rdquor:"\u201D",rdsh:"\u21B3",real:"\u211C",realine:"\u211B",realpart:"\u211C",reals:"\u211D",rect:"\u25AD",reg:"\u00AE",rfisht:"\u297D",rfloor:"\u230B",rhard:"\u21C1",rharu:"\u21C0",rharul:"\u296C",rightarrow:"\u2192",rightarrowtail:"\u21A3",rightharpoondown:"\u21C1",rightharpoonup:"\u21C0",rightleftarrows:"\u21C4",rightleftharpoons:"\u21CC",rightsquigarrow:"\u219D",risingdotseq:"\u2253",rlarr:"\u21C4",rlhar:"\u21CC",rlm:"\u200F",rmoustache:"\u23B1",rnmid:"\u2AEE",roang:"\u27ED",roarr:"\u21FE",robrk:"\u27E7",ropar:"\u2986",roplus:"\u2A2E",rotimes:"\u2A35",rpar:"\u0029",rpargt:"\u2994",rppolint:"\u2A12",rrarr:"\u21C9",rsaquo:"\u203A",rsh:"\u21B1",rsqb:"\u005D",rsquo:"\u2019",rsquor:"\u2019",rthree:"\u22CC",rtrie:"\u22B5",rtrif:"\u25B8",rtriltri:"\u29CE",ruluhar:"\u2968",rx:"\u211E"});MathJax.Ajax.loadComplete(a.entityDir+"/r.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/s.js b/static/MathJax/jax/input/MathML/entities/s.js
new file mode 100644
index 0000000..2ac47c1
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/s.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/s.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{SHCHcy:"\u0429",SHcy:"\u0428",SOFTcy:"\u042C",Sacute:"\u015A",Sc:"\u2ABC",Scaron:"\u0160",Scedil:"\u015E",Scirc:"\u015C",Scy:"\u0421",ShortDownArrow:"\u2193",ShortLeftArrow:"\u2190",ShortRightArrow:"\u2192",ShortUpArrow:"\u2191",Sub:"\u22D0",Sup:"\u22D1",sacute:"\u015B",sbquo:"\u201A",sc:"\u227B",scE:"\u2AB4",scaron:"\u0161",sccue:"\u227D",sce:"\u2AB0",scedil:"\u015F",scirc:"\u015D",scpolint:"\u2A13",scsim:"\u227F",scy:"\u0441",sdotb:"\u22A1",sdote:"\u2A66",seArr:"\u21D8",searhk:"\u2925",searrow:"\u2198",semi:"\u003B",seswar:"\u2929",setminus:"\u2216",setmn:"\u2216",sext:"\u2736",sfrown:"\u2322",shchcy:"\u0449",shcy:"\u0448",shortmid:"\u2223",shortparallel:"\u2225",shy:"\u00AD",sigmaf:"\u03C2",sim:"\u223C",simdot:"\u2A6A",sime:"\u2243",simeq:"\u2243",simg:"\u2A9E",simgE:"\u2AA0",siml:"\u2A9D",simlE:"\u2A9F",simplus:"\u2A24",simrarr:"\u2972",slarr:"\u2190",smallsetminus:"\u2216",smashp:"\u2A33",smeparsl:"\u29E4",smid:"\u2223",smt:"\u2AAA",smte:"\u2AAC",smtes:"\u2AAC\uFE00",softcy:"\u044C",sol:"\u002F",solb:"\u29C4",solbar:"\u233F",spadesuit:"\u2660",spar:"\u2225",sqcap:"\u2293",sqcaps:"\u2293\uFE00",sqcup:"\u2294",sqcups:"\u2294\uFE00",sqsub:"\u228F",sqsube:"\u2291",sqsubset:"\u228F",sqsubseteq:"\u2291",sqsup:"\u2290",sqsupe:"\u2292",sqsupset:"\u2290",sqsupseteq:"\u2292",squ:"\u25A1",square:"\u25A1",squarf:"\u25AA",squf:"\u25AA",srarr:"\u2192",ssetmn:"\u2216",ssmile:"\u2323",sstarf:"\u22C6",star:"\u2606",starf:"\u2605",straightepsilon:"\u03F5",straightphi:"\u03D5",strns:"\u00AF",subdot:"\u2ABD",sube:"\u2286",subedot:"\u2AC3",submult:"\u2AC1",subplus:"\u2ABF",subrarr:"\u2979",subset:"\u2282",subseteq:"\u2286",subseteqq:"\u2AC5",subsetneq:"\u228A",subsetneqq:"\u2ACB",subsim:"\u2AC7",subsub:"\u2AD5",subsup:"\u2AD3",succ:"\u227B",succapprox:"\u2AB8",succcurlyeq:"\u227D",succeq:"\u2AB0",succnapprox:"\u2ABA",succneqq:"\u2AB6",succnsim:"\u22E9",succsim:"\u227F",sum:"\u2211",sung:"\u266A",sup:"\u2283",sup1:"\u00B9",sup2:"\u00B2",sup3:"\u00B3",supdot:"\u2ABE",supdsub:"\u2AD8",supe:"\u2287",supedot:"\u2AC4",suphsol:"\u27C9",suphsub:"\u2AD7",suplarr:"\u297B",supmult:"\u2AC2",supplus:"\u2AC0",supset:"\u2283",supseteq:"\u2287",supseteqq:"\u2AC6",supsetneq:"\u228B",supsetneqq:"\u2ACC",supsim:"\u2AC8",supsub:"\u2AD4",supsup:"\u2AD6",swArr:"\u21D9",swarhk:"\u2926",swarrow:"\u2199",swnwar:"\u292A",szlig:"\u00DF"});MathJax.Ajax.loadComplete(a.entityDir+"/s.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/scr.js b/static/MathJax/jax/input/MathML/entities/scr.js
new file mode 100644
index 0000000..0182485
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/scr.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/scr.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{Ascr:"\uD835\uDC9C",Bscr:"\u212C",Cscr:"\uD835\uDC9E",Dscr:"\uD835\uDC9F",Escr:"\u2130",Fscr:"\u2131",Gscr:"\uD835\uDCA2",Hscr:"\u210B",Iscr:"\u2110",Jscr:"\uD835\uDCA5",Kscr:"\uD835\uDCA6",Lscr:"\u2112",Mscr:"\u2133",Nscr:"\uD835\uDCA9",Oscr:"\uD835\uDCAA",Pscr:"\uD835\uDCAB",Qscr:"\uD835\uDCAC",Rscr:"\u211B",Sscr:"\uD835\uDCAE",Tscr:"\uD835\uDCAF",Uscr:"\uD835\uDCB0",Vscr:"\uD835\uDCB1",Wscr:"\uD835\uDCB2",Xscr:"\uD835\uDCB3",Yscr:"\uD835\uDCB4",Zscr:"\uD835\uDCB5",ascr:"\uD835\uDCB6",bscr:"\uD835\uDCB7",cscr:"\uD835\uDCB8",dscr:"\uD835\uDCB9",escr:"\u212F",fscr:"\uD835\uDCBB",gscr:"\u210A",hscr:"\uD835\uDCBD",iscr:"\uD835\uDCBE",jscr:"\uD835\uDCBF",kscr:"\uD835\uDCC0",lscr:"\uD835\uDCC1",mscr:"\uD835\uDCC2",nscr:"\uD835\uDCC3",oscr:"\u2134",pscr:"\uD835\uDCC5",qscr:"\uD835\uDCC6",rscr:"\uD835\uDCC7",sscr:"\uD835\uDCC8",tscr:"\uD835\uDCC9",uscr:"\uD835\uDCCA",vscr:"\uD835\uDCCB",wscr:"\uD835\uDCCC",xscr:"\uD835\uDCCD",yscr:"\uD835\uDCCE",zscr:"\uD835\uDCCF"});MathJax.Ajax.loadComplete(a.entityDir+"/scr.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/t.js b/static/MathJax/jax/input/MathML/entities/t.js
new file mode 100644
index 0000000..0ec6203
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/t.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/t.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{THORN:"\u00DE",TRADE:"\u2122",TSHcy:"\u040B",TScy:"\u0426",Tab:"\u0009",Tau:"\u03A4",Tcaron:"\u0164",Tcedil:"\u0162",Tcy:"\u0422",ThickSpace:"\u205F\u200A",ThinSpace:"\u2009",TripleDot:"\u20DB",Tstrok:"\u0166",target:"\u2316",tbrk:"\u23B4",tcaron:"\u0165",tcedil:"\u0163",tcy:"\u0442",tdot:"\u20DB",telrec:"\u2315",there4:"\u2234",therefore:"\u2234",thetasym:"\u03D1",thickapprox:"\u2248",thicksim:"\u223C",thinsp:"\u2009",thkap:"\u2248",thksim:"\u223C",thorn:"\u00FE",timesb:"\u22A0",timesbar:"\u2A31",timesd:"\u2A30",tint:"\u222D",toea:"\u2928",top:"\u22A4",topbot:"\u2336",topcir:"\u2AF1",topfork:"\u2ADA",tosa:"\u2929",tprime:"\u2034",trade:"\u2122",triangledown:"\u25BF",triangleleft:"\u25C3",trianglelefteq:"\u22B4",triangleright:"\u25B9",trianglerighteq:"\u22B5",tridot:"\u25EC",trie:"\u225C",triminus:"\u2A3A",triplus:"\u2A39",trisb:"\u29CD",tritime:"\u2A3B",trpezium:"\u23E2",tscy:"\u0446",tshcy:"\u045B",tstrok:"\u0167",twixt:"\u226C",twoheadleftarrow:"\u219E",twoheadrightarrow:"\u21A0"});MathJax.Ajax.loadComplete(a.entityDir+"/t.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/u.js b/static/MathJax/jax/input/MathML/entities/u.js
new file mode 100644
index 0000000..500ca59
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/u.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/u.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{Uacute:"\u00DA",Uarr:"\u219F",Uarrocir:"\u2949",Ubrcy:"\u040E",Ubreve:"\u016C",Ucirc:"\u00DB",Ucy:"\u0423",Udblac:"\u0170",Ugrave:"\u00D9",Umacr:"\u016A",UnderBracket:"\u23B5",UnderParenthesis:"\u23DD",Uogon:"\u0172",UpArrowBar:"\u2912",UpArrowDownArrow:"\u21C5",UpEquilibrium:"\u296E",UpTeeArrow:"\u21A5",UpperLeftArrow:"\u2196",UpperRightArrow:"\u2197",Upsi:"\u03D2",Uring:"\u016E",Utilde:"\u0168",Uuml:"\u00DC",uArr:"\u21D1",uHar:"\u2963",uacute:"\u00FA",uarr:"\u2191",ubrcy:"\u045E",ubreve:"\u016D",ucirc:"\u00FB",ucy:"\u0443",udarr:"\u21C5",udblac:"\u0171",udhar:"\u296E",ufisht:"\u297E",ugrave:"\u00F9",uharl:"\u21BF",uharr:"\u21BE",uhblk:"\u2580",ulcorn:"\u231C",ulcorner:"\u231C",ulcrop:"\u230F",ultri:"\u25F8",umacr:"\u016B",uml:"\u00A8",uogon:"\u0173",uparrow:"\u2191",updownarrow:"\u2195",upharpoonleft:"\u21BF",upharpoonright:"\u21BE",uplus:"\u228E",upsih:"\u03D2",upsilon:"\u03C5",urcorn:"\u231D",urcorner:"\u231D",urcrop:"\u230E",uring:"\u016F",urtri:"\u25F9",utdot:"\u22F0",utilde:"\u0169",utri:"\u25B5",utrif:"\u25B4",uuarr:"\u21C8",uuml:"\u00FC",uwangle:"\u29A7"});MathJax.Ajax.loadComplete(a.entityDir+"/u.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/v.js b/static/MathJax/jax/input/MathML/entities/v.js
new file mode 100644
index 0000000..ae9fba4
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/v.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/v.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{VDash:"\u22AB",Vbar:"\u2AEB",Vcy:"\u0412",Vdashl:"\u2AE6",Verbar:"\u2016",Vert:"\u2016",VerticalLine:"\u007C",VerticalSeparator:"\u2758",VeryThinSpace:"\u200A",vArr:"\u21D5",vBar:"\u2AE8",vBarv:"\u2AE9",vDash:"\u22A8",vangrt:"\u299C",varepsilon:"\u03F5",varkappa:"\u03F0",varnothing:"\u2205",varphi:"\u03D5",varpi:"\u03D6",varpropto:"\u221D",varr:"\u2195",varrho:"\u03F1",varsigma:"\u03C2",varsubsetneq:"\u228A\uFE00",varsubsetneqq:"\u2ACB\uFE00",varsupsetneq:"\u228B\uFE00",varsupsetneqq:"\u2ACC\uFE00",vartheta:"\u03D1",vartriangleleft:"\u22B2",vartriangleright:"\u22B3",vcy:"\u0432",vdash:"\u22A2",vee:"\u2228",veeeq:"\u225A",verbar:"\u007C",vert:"\u007C",vltri:"\u22B2",vnsub:"\u2282\u20D2",vnsup:"\u2283\u20D2",vprop:"\u221D",vrtri:"\u22B3",vsubnE:"\u2ACB\uFE00",vsubne:"\u228A\uFE00",vsupnE:"\u2ACC\uFE00",vsupne:"\u228B\uFE00",vzigzag:"\u299A"});MathJax.Ajax.loadComplete(a.entityDir+"/v.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/w.js b/static/MathJax/jax/input/MathML/entities/w.js
new file mode 100644
index 0000000..9c59c47
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/w.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/w.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{Wcirc:"\u0174",wcirc:"\u0175",wedbar:"\u2A5F",wedge:"\u2227",wedgeq:"\u2259",wp:"\u2118",wr:"\u2240",wreath:"\u2240"});MathJax.Ajax.loadComplete(a.entityDir+"/w.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/x.js b/static/MathJax/jax/input/MathML/entities/x.js
new file mode 100644
index 0000000..b4c7416
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/x.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/x.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{xcap:"\u22C2",xcirc:"\u25EF",xcup:"\u22C3",xdtri:"\u25BD",xhArr:"\u27FA",xharr:"\u27F7",xlArr:"\u27F8",xlarr:"\u27F5",xmap:"\u27FC",xnis:"\u22FB",xodot:"\u2A00",xoplus:"\u2A01",xotime:"\u2A02",xrArr:"\u27F9",xrarr:"\u27F6",xsqcup:"\u2A06",xuplus:"\u2A04",xutri:"\u25B3",xvee:"\u22C1",xwedge:"\u22C0"});MathJax.Ajax.loadComplete(a.entityDir+"/x.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/y.js b/static/MathJax/jax/input/MathML/entities/y.js
new file mode 100644
index 0000000..601b0e8
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/y.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/y.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{YAcy:"\u042F",YIcy:"\u0407",YUcy:"\u042E",Yacute:"\u00DD",Ycirc:"\u0176",Ycy:"\u042B",Yuml:"\u0178",yacute:"\u00FD",yacy:"\u044F",ycirc:"\u0177",ycy:"\u044B",yicy:"\u0457",yucy:"\u044E",yuml:"\u00FF"});MathJax.Ajax.loadComplete(a.entityDir+"/y.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/entities/z.js b/static/MathJax/jax/input/MathML/entities/z.js
new file mode 100644
index 0000000..1f553c5
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/entities/z.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/entities/z.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(a){MathJax.Hub.Insert(a.Parse.Entity,{ZHcy:"\u0416",Zacute:"\u0179",Zcaron:"\u017D",Zcy:"\u0417",Zdot:"\u017B",ZeroWidthSpace:"\u200B",Zeta:"\u0396",zacute:"\u017A",zcaron:"\u017E",zcy:"\u0437",zdot:"\u017C",zeetrf:"\u2128",zhcy:"\u0436",zwj:"\u200D",zwnj:"\u200C"});MathJax.Ajax.loadComplete(a.entityDir+"/z.js")})(MathJax.InputJax.MathML);
+
diff --git a/static/MathJax/jax/input/MathML/jax.js b/static/MathJax/jax/input/MathML/jax.js
new file mode 100644
index 0000000..144b815
--- /dev/null
+++ b/static/MathJax/jax/input/MathML/jax.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/MathML/jax.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(b,c){var a;b.Parse=MathJax.Object.Subclass({Init:function(d){this.Parse(d)},Parse:function(f){var g;if(typeof f!=="string"){g=f.parentNode}else{if(f.match(/^<[a-z]+:/i)&&!f.match(/^<[^<>]* xmlns:/)){f=f.replace(/^<([a-z]+)(:math)/i,'<$1$2 xmlns:$1="http://www.w3.org/1998/Math/MathML"')}f=f.replace(/^\s*(?:\/\/)?<!(--)?\[CDATA\[((.|\n)*)(\/\/)?\]\]\1>\s*$/,"$2");f=f.replace(/&([a-z][a-z0-9]*);/ig,this.replaceEntity);g=b.ParseXML(f);if(g==null){b.Error("Error parsing MathML")}}var e=g.getElementsByTagName("parsererror")[0];if(e){b.Error("Error parsing MathML: "+e.textContent.replace(/This page.*?errors:|XML Parsing Error: |Below is a rendering of the page.*/g,""))}if(g.childNodes.length!==1){b.Error("MathML must be formed by a single element")}if(g.firstChild.nodeName.toLowerCase()==="html"){var d=g.getElementsByTagName("h1")[0];if(d&&d.textContent==="XML parsing error"&&d.nextSibling){b.Error("Error parsing MathML: "+String(d.nextSibling.nodeValue).replace(/fatal parsing error: /,""))}}if(g.firstChild.nodeName.toLowerCase().replace(/^[a-z]+:/,"")!=="math"){b.Error("MathML must be formed by a <math> element, not <"+g.firstChild.nodeName+">")}this.mml=this.MakeMML(g.firstChild)},MakeMML:function(h){var l=h.nodeName.toLowerCase().replace(/^[a-z]+:/,"");if(!(a[l]&&a[l].isa&&a[l].isa(a.mbase))){return a.merror("Unknown node type: "+l)}var d=a[l](),k,j,e,n;for(k=0,j=h.attributes.length;k<j;k++){e=h.attributes[k].name;if(e=="xlink:href"){e="href"}if(e.match(/:/)){continue}n=h.attributes[k].value;if(n.toLowerCase()==="true"){n=true}else{if(n.toLowerCase()==="false"){n=false}}d[e]=n}for(k=0,j=h.childNodes.length;k<j;k++){var f=h.childNodes[k];if(f.nodeName==="#comment"){continue}if(f.nodeName==="#text"){if(d.isToken&&!d.mmlSelfClosing){var o=this.trimSpace(f.nodeValue);if(d.isa(a.mo)&&o.length===1&&this.Remap[o.charAt(0)]){o=this.Remap[o.charAt(0)]}o=o.replace(/&([a-z][a-z0-9]*);/ig,this.replaceEntity);d.Append(a.chars(o))}else{if(f.nodeValue.match(/\S/)){b.Error("Unexpected text node: '"+f.nodeValue+"'")}}}else{if(d.type==="annotation-xml"){d.Append(a.xml(f))}else{var g=this.MakeMML(f);d.Append(g);if(g.mmlSelfClosing&&g.data.length){d.Append.apply(d,g.data);g.data=[]}}}}if(b.config.useMathMLspacing){d.useMMLspacing=8}return d},trimSpace:function(d){return d.replace(/^[ \t\n\r]+/,"").replace(/[ \t\n\r]+$/,"").replace(/[ \t\n\r][ \t\n\r]+/g," ")},replaceEntity:function(f,e){if(e.match(/^(lt|amp|quot)$/)){return f}if(b.Parse.Entity[e]){return b.Parse.Entity[e]}var g=e.charAt(0).toLowerCase();var d=e.match(/^[a-zA-Z](fr|scr|opf)$/);if(d){g=d[1]}if(!b.Parse.loaded[g]){b.Parse.loaded[g]=true;MathJax.Hub.RestartAfter(MathJax.Ajax.Require(b.entityDir+"/"+g+".js"))}return f},Remap:{"\u0027":"\u2032","\u002A":"\u2217","\u002D":"\u2212"}},{loaded:[]});b.Augment({Translate:function(d){if(!this.ParseXML){this.ParseXML=this.createParser()}var e,g;if(d.firstChild&&d.firstChild.nodeName.toLowerCase().replace(/^[a-z]+:/,"")==="math"){g=this.prefilterMathML(d.firstChild)}else{g=d.innerHTML.replace(/^\s+/,"").replace(/\s+$/,"");if(c.isMSIE){g=g.replace(/(&nbsp;)+$/,"")}else{if(c.isKonqueror){g=g.replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&")}}g=this.prefilterMath(g,d)}try{e=b.Parse(g).mml}catch(f){if(!f.mathmlError){throw f}e=this.formatError(f,g,d)}return a(e)},prefilterMath:function(e,d){return e},prefilterMathML:function(d){return d},formatError:function(f,e,d){return a.merror(f.message.replace(/\n.*/,""))},Error:function(d){throw MathJax.Hub.Insert(Error(d),{mathmlError:true})},parseDOM:function(d){return this.parser.parseFromString(d,"text/xml")},parseMS:function(d){return(this.parser.loadXML(d)?this.parser:null)},parseDIV:function(d){this.div.innerHTML=d.replace(/<([a-z]+)([^>]*)\/>/g,"<$1$2></$1>");return this.div},parseError:function(d){return null},createParser:function(){if(window.DOMParser){this.parser=new DOMParser();return(this.parseDOM)}else{if(window.ActiveXObject){var e=["MSXML2.DOMDocument.6.0","MSXML2.DOMDocument.5.0","MSXML2.DOMDocument.4.0","MSXML2.DOMDocument.3.0","MSXML2.DOMDocument.2.0","Microsoft.XMLDOM"];for(var f=0,d=e.length;f<d&&!this.parser;f++){try{this.parser=new ActiveXObject(e[f])}catch(g){}}if(!this.parser){alert("MathJax can't create an XML parser for MathML. Check that\nthe 'Script ActiveX controls marked safe for scripting' security\nsetting is enabled (use the Internet Options item in the Tools\nmenu, and select the Security panel, then press the Custom Level\nbutton to check this).\n\nMathML equations will not be able to be processed by MathJax.");return(this.parseError)}this.parser.async=false;return(this.parseMS)}}this.div=MathJax.Hub.Insert(document.createElement("div"),{style:{visibility:"hidden",overflow:"hidden",height:"1px",position:"absolute",top:0}});if(!document.body.firstChild){document.body.appendChild(this.div)}else{document.body.insertBefore(this.div,document.body.firstChild)}return(this.parseDIV)},Startup:function(){a=MathJax.ElementJax.mml;a.mspace.Augment({mmlSelfClosing:true});a.none.Augment({mmlSelfClosing:true});a.mprescripts.Augment({mmlSelfClossing:true})}});b.Parse.Entity={ApplyFunction:"\u2061",Backslash:"\u2216",Because:"\u2235",Breve:"\u02D8",Cap:"\u22D2",CenterDot:"\u00B7",CircleDot:"\u2299",CircleMinus:"\u2296",CirclePlus:"\u2295",CircleTimes:"\u2297",Congruent:"\u2261",ContourIntegral:"\u222E",Coproduct:"\u2210",Cross:"\u2A2F",Cup:"\u22D3",CupCap:"\u224D",Dagger:"\u2021",Del:"\u2207",Delta:"\u0394",Diamond:"\u22C4",DifferentialD:"\u2146",DotEqual:"\u2250",DoubleDot:"\u00A8",DoubleRightTee:"\u22A8",DoubleVerticalBar:"\u2225",DownArrow:"\u2193",DownLeftVector:"\u21BD",DownRightVector:"\u21C1",DownTee:"\u22A4",Downarrow:"\u21D3",Element:"\u2208",EqualTilde:"\u2242",Equilibrium:"\u21CC",Exists:"\u2203",ExponentialE:"\u2147",FilledVerySmallSquare:"\u25AA",ForAll:"\u2200",Gamma:"\u0393",Gg:"\u22D9",GreaterEqual:"\u2265",GreaterEqualLess:"\u22DB",GreaterFullEqual:"\u2267",GreaterLess:"\u2277",GreaterSlantEqual:"\u2A7E",GreaterTilde:"\u2273",Hacek:"\u02C7",Hat:"\u005E",HumpDownHump:"\u224E",HumpEqual:"\u224F",Im:"\u2111",ImaginaryI:"\u2148",Integral:"\u222B",Intersection:"\u22C2",InvisibleComma:"\u2063",InvisibleTimes:"\u2062",Lambda:"\u039B",Larr:"\u219E",LeftAngleBracket:"\u27E8",LeftArrow:"\u2190",LeftArrowRightArrow:"\u21C6",LeftCeiling:"\u2308",LeftDownVector:"\u21C3",LeftFloor:"\u230A",LeftRightArrow:"\u2194",LeftTee:"\u22A3",LeftTriangle:"\u22B2",LeftTriangleEqual:"\u22B4",LeftUpVector:"\u21BF",LeftVector:"\u21BC",Leftarrow:"\u21D0",Leftrightarrow:"\u21D4",LessEqualGreater:"\u22DA",LessFullEqual:"\u2266",LessGreater:"\u2276",LessSlantEqual:"\u2A7D",LessTilde:"\u2272",Ll:"\u22D8",Lleftarrow:"\u21DA",LongLeftArrow:"\u27F5",LongLeftRightArrow:"\u27F7",LongRightArrow:"\u27F6",Longleftarrow:"\u27F8",Longleftrightarrow:"\u27FA",Longrightarrow:"\u27F9",Lsh:"\u21B0",MinusPlus:"\u2213",NestedGreaterGreater:"\u226B",NestedLessLess:"\u226A",NotDoubleVerticalBar:"\u2226",NotElement:"\u2209",NotEqual:"\u2260",NotExists:"\u2204",NotGreater:"\u226F",NotGreaterEqual:"\u2271",NotLeftTriangle:"\u22EA",NotLeftTriangleEqual:"\u22EC",NotLess:"\u226E",NotLessEqual:"\u2270",NotPrecedes:"\u2280",NotPrecedesSlantEqual:"\u22E0",NotRightTriangle:"\u22EB",NotRightTriangleEqual:"\u22ED",NotSubsetEqual:"\u2288",NotSucceeds:"\u2281",NotSucceedsSlantEqual:"\u22E1",NotSupersetEqual:"\u2289",NotTilde:"\u2241",NotVerticalBar:"\u2224",Omega:"\u03A9",OverBar:"\u203E",OverBrace:"\u23DE",PartialD:"\u2202",Phi:"\u03A6",Pi:"\u03A0",PlusMinus:"\u00B1",Precedes:"\u227A",PrecedesEqual:"\u2AAF",PrecedesSlantEqual:"\u227C",PrecedesTilde:"\u227E",Product:"\u220F",Proportional:"\u221D",Psi:"\u03A8",Rarr:"\u21A0",Re:"\u211C",ReverseEquilibrium:"\u21CB",RightAngleBracket:"\u27E9",RightArrow:"\u2192",RightArrowLeftArrow:"\u21C4",RightCeiling:"\u2309",RightDownVector:"\u21C2",RightFloor:"\u230B",RightTee:"\u22A2",RightTeeArrow:"\u21A6",RightTriangle:"\u22B3",RightTriangleEqual:"\u22B5",RightUpVector:"\u21BE",RightVector:"\u21C0",Rightarrow:"\u21D2",Rrightarrow:"\u21DB",Rsh:"\u21B1",Sigma:"\u03A3",SmallCircle:"\u2218",Sqrt:"\u221A",Square:"\u25A1",SquareIntersection:"\u2293",SquareSubset:"\u228F",SquareSubsetEqual:"\u2291",SquareSuperset:"\u2290",SquareSupersetEqual:"\u2292",SquareUnion:"\u2294",Star:"\u22C6",Subset:"\u22D0",SubsetEqual:"\u2286",Succeeds:"\u227B",SucceedsEqual:"\u2AB0",SucceedsSlantEqual:"\u227D",SucceedsTilde:"\u227F",SuchThat:"\u220B",Sum:"\u2211",Superset:"\u2283",SupersetEqual:"\u2287",Supset:"\u22D1",Therefore:"\u2234",Theta:"\u0398",Tilde:"\u223C",TildeEqual:"\u2243",TildeFullEqual:"\u2245",TildeTilde:"\u2248",UnderBar:"\u005F",UnderBrace:"\u23DF",Union:"\u22C3",UnionPlus:"\u228E",UpArrow:"\u2191",UpDownArrow:"\u2195",UpTee:"\u22A5",Uparrow:"\u21D1",Updownarrow:"\u21D5",Upsilon:"\u03A5",Vdash:"\u22A9",Vee:"\u22C1",VerticalBar:"\u2223",VerticalTilde:"\u2240",Vvdash:"\u22AA",Wedge:"\u22C0",Xi:"\u039E",acute:"\u00B4",aleph:"\u2135",alpha:"\u03B1",amalg:"\u2A3F",and:"\u2227",ang:"\u2220",angmsd:"\u2221",angsph:"\u2222",ape:"\u224A",backprime:"\u2035",backsim:"\u223D",backsimeq:"\u22CD",beta:"\u03B2",beth:"\u2136",between:"\u226C",bigcirc:"\u25EF",bigodot:"\u2A00",bigoplus:"\u2A01",bigotimes:"\u2A02",bigsqcup:"\u2A06",bigstar:"\u2605",bigtriangledown:"\u25BD",bigtriangleup:"\u25B3",biguplus:"\u2A04",blacklozenge:"\u29EB",blacktriangle:"\u25B4",blacktriangledown:"\u25BE",blacktriangleleft:"\u25C2",bowtie:"\u22C8",boxdl:"\u2510",boxdr:"\u250C",boxminus:"\u229F",boxplus:"\u229E",boxtimes:"\u22A0",boxul:"\u2518",boxur:"\u2514",bsol:"\u005C",bull:"\u2022",cap:"\u2229",check:"\u2713",chi:"\u03C7",circ:"\u02C6",circeq:"\u2257",circlearrowleft:"\u21BA",circlearrowright:"\u21BB",circledR:"\u00AE",circledS:"\u24C8",circledast:"\u229B",circledcirc:"\u229A",circleddash:"\u229D",clubs:"\u2663",colon:"\u003A",comp:"\u2201",ctdot:"\u22EF",cuepr:"\u22DE",cuesc:"\u22DF",cularr:"\u21B6",cup:"\u222A",curarr:"\u21B7",curlyvee:"\u22CE",curlywedge:"\u22CF",dagger:"\u2020",daleth:"\u2138",ddarr:"\u21CA",deg:"\u00B0",delta:"\u03B4",digamma:"\u03DD",div:"\u00F7",divideontimes:"\u22C7",dot:"\u02D9",doteqdot:"\u2251",dotplus:"\u2214",dotsquare:"\u22A1",dtdot:"\u22F1",ecir:"\u2256",efDot:"\u2252",egs:"\u2A96",ell:"\u2113",els:"\u2A95",empty:"\u2205",epsi:"\u03B5",epsiv:"\u03F5",erDot:"\u2253",eta:"\u03B7",eth:"\u00F0",flat:"\u266D",fork:"\u22D4",frown:"\u2322",gEl:"\u2A8C",gamma:"\u03B3",gap:"\u2A86",gimel:"\u2137",gnE:"\u2269",gnap:"\u2A8A",gne:"\u2A88",gnsim:"\u22E7",gt:"\u003E",gtdot:"\u22D7",harrw:"\u21AD",hbar:"\u210F",hellip:"\u2026",hookleftarrow:"\u21A9",hookrightarrow:"\u21AA",imath:"\u0131",infin:"\u221E",intcal:"\u22BA",iota:"\u03B9",jmath:"\u0237",kappa:"\u03BA",kappav:"\u03F0",lEg:"\u2A8B",lambda:"\u03BB",lap:"\u2A85",larrlp:"\u21AB",larrtl:"\u21A2",lbrace:"\u007B",lbrack:"\u005B",le:"\u2264",leftleftarrows:"\u21C7",leftthreetimes:"\u22CB",lessdot:"\u22D6",lmoust:"\u23B0",lnE:"\u2268",lnap:"\u2A89",lne:"\u2A87",lnsim:"\u22E6",longmapsto:"\u27FC",looparrowright:"\u21AC",lowast:"\u2217",loz:"\u25CA",lt:"\u003C",ltimes:"\u22C9",ltri:"\u25C3",macr:"\u00AF",malt:"\u2720",mho:"\u2127",mu:"\u03BC",multimap:"\u22B8",nLeftarrow:"\u21CD",nLeftrightarrow:"\u21CE",nRightarrow:"\u21CF",nVDash:"\u22AF",nVdash:"\u22AE",natur:"\u266E",nearr:"\u2197",nharr:"\u21AE",nlarr:"\u219A",not:"\u00AC",nrarr:"\u219B",nu:"\u03BD",nvDash:"\u22AD",nvdash:"\u22AC",nwarr:"\u2196",omega:"\u03C9",omicron:"\u03BF",or:"\u2228",osol:"\u2298",period:"\u002E",phi:"\u03C6",phiv:"\u03D5",pi:"\u03C0",piv:"\u03D6",prap:"\u2AB7",precnapprox:"\u2AB9",precneqq:"\u2AB5",precnsim:"\u22E8",prime:"\u2032",psi:"\u03C8",rarrtl:"\u21A3",rbrace:"\u007D",rbrack:"\u005D",rho:"\u03C1",rhov:"\u03F1",rightrightarrows:"\u21C9",rightthreetimes:"\u22CC",ring:"\u02DA",rmoust:"\u23B1",rtimes:"\u22CA",rtri:"\u25B9",scap:"\u2AB8",scnE:"\u2AB6",scnap:"\u2ABA",scnsim:"\u22E9",sdot:"\u22C5",searr:"\u2198",sect:"\u00A7",sharp:"\u266F",sigma:"\u03C3",sigmav:"\u03C2",simne:"\u2246",smile:"\u2323",spades:"\u2660",sub:"\u2282",subE:"\u2AC5",subnE:"\u2ACB",subne:"\u228A",supE:"\u2AC6",supnE:"\u2ACC",supne:"\u228B",swarr:"\u2199",tau:"\u03C4",theta:"\u03B8",thetav:"\u03D1",tilde:"\u02DC",times:"\u00D7",triangle:"\u25B5",triangleq:"\u225C",upsi:"\u03C5",upuparrows:"\u21C8",veebar:"\u22BB",vellip:"\u22EE",weierp:"\u2118",xi:"\u03BE",yen:"\u00A5",zeta:"\u03B6",zigrarr:"\u21DD"};b.loadComplete("jax.js")})(MathJax.InputJax.MathML,MathJax.Hub.Browser);
+
diff --git a/static/MathJax/jax/input/TeX/config.js b/static/MathJax/jax/input/TeX/config.js
new file mode 100644
index 0000000..84b8bc4
--- /dev/null
+++ b/static/MathJax/jax/input/TeX/config.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/TeX/config.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.InputJax.TeX=MathJax.InputJax({id:"TeX",version:"1.1.1",directory:MathJax.InputJax.directory+"/TeX",extensionDir:MathJax.InputJax.extensionDir+"/TeX",config:{TagSide:"right",TagIndent:"0.8em",MultLineWidth:"85%"}});MathJax.InputJax.TeX.Register("math/tex");MathJax.InputJax.TeX.loadComplete("config.js");
+
diff --git a/static/MathJax/jax/input/TeX/jax.js b/static/MathJax/jax/input/TeX/jax.js
new file mode 100644
index 0000000..a419b84
--- /dev/null
+++ b/static/MathJax/jax/input/TeX/jax.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/input/TeX/jax.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(d){var c=true,f=false,i,h=String.fromCharCode(160);var e=MathJax.Object.Subclass({Init:function(k){this.global={};this.data=[b.start().With({global:this.global})];if(k){this.data[0].env=k}this.env=this.data[0].env},Push:function(){var l,k,n,o;for(l=0,k=arguments.length;l<k;l++){n=arguments[l];if(n instanceof i.mbase){n=b.mml(n)}n.global=this.global;o=(this.data.length?this.Top().checkItem(n):c);if(o instanceof Array){this.Pop();this.Push.apply(this,o)}else{if(o instanceof b){this.Pop();this.Push(o)}else{if(o){this.data.push(n);if(n.env){for(var p in this.env){if(this.env.hasOwnProperty(p)){n.env[p]=this.env[p]}}this.env=n.env}else{n.env=this.env}}}}}},Pop:function(){var k=this.data.pop();if(!k.isOpen){delete k.env}this.env=(this.data.length?this.Top().env:{});return k},Top:function(k){if(k==null){k=1}if(this.data.length<k){return null}return this.data[this.data.length-k]},Prev:function(k){var l=this.Top();if(k){return l.data[l.data.length-1]}else{return l.Pop()}},toString:function(){return"stack[\n "+this.data.join("\n ")+"\n]"}});var b=e.Item=MathJax.Object.Subclass({type:"base",closeError:"Extra close brace or missing open brace",rightError:"Missing \\left or extra \\right",Init:function(){if(this.isOpen){this.env={}}this.data=[];this.Push.apply(this,arguments)},Push:function(){this.data.push.apply(this.data,arguments)},Pop:function(){return this.data.pop()},mmlData:function(k,l){if(k==null){k=c}if(this.data.length===1&&!l){return this.data[0]}return i.mrow.apply(i,this.data).With((k?{inferred:c}:{}))},checkItem:function(k){if(k.type==="over"&&this.isOpen){k.num=this.mmlData(f);this.data=[]}if(k.type==="cell"&&this.isOpen){d.Error("Misplaced "+k.name)}if(k.isClose&&this[k.type+"Error"]){d.Error(this[k.type+"Error"])}if(!k.isNotStack){return c}this.Push(k.data[0]);return f},With:function(k){for(var l in k){if(k.hasOwnProperty(l)){this[l]=k[l]}}return this},toString:function(){return this.type+"["+this.data.join("; ")+"]"}});b.start=b.Subclass({type:"start",isOpen:c,checkItem:function(k){if(k.type==="stop"){return b.mml(this.mmlData())}return this.SUPER(arguments).checkItem.call(this,k)}});b.stop=b.Subclass({type:"stop",isClose:c});b.open=b.Subclass({type:"open",isOpen:c,stopError:"Extra open brace or missing close brace",checkItem:function(l){if(l.type==="close"){var k=this.mmlData();return b.mml(i.TeXAtom(k))}return this.SUPER(arguments).checkItem.call(this,l)}});b.close=b.Subclass({type:"close",isClose:c});b.subsup=b.Subclass({type:"subsup",stopError:"Missing superscript or subscript argument",checkItem:function(l){var k=["","subscript","superscript"][this.position];if(l.type==="open"||l.type==="left"){return c}if(l.type==="mml"){this.data[0].SetData(this.position,l.data[0]);return b.mml(this.data[0])}if(this.SUPER(arguments).checkItem.call(this,l)){d.Error("Missing open brace for "+k)}},Pop:function(){}});b.over=b.Subclass({type:"over",isClose:c,name:"\\over",checkItem:function(m,k){if(m.type==="over"){d.Error("Ambiguous use of "+m.name)}if(m.isClose){var l=i.mfrac(this.num,this.mmlData(f));if(this.thickness!=null){l.linethickness=this.thickness}if(this.open||this.close){l.texClass=i.TEXCLASS.INNER;l.texWithDelims=c;l=i.mfenced(l).With({open:this.open,close:this.close})}return[b.mml(l),m]}return this.SUPER(arguments).checkItem.call(this,m)},toString:function(){return"over["+this.num+" / "+this.data.join("; ")+"]"}});b.left=b.Subclass({type:"left",isOpen:c,delim:"(",stopError:"Extra \\left or missing \\right",checkItem:function(l){if(l.type==="right"){var k=i.mfenced(this.data.length===1?this.data[0]:i.mrow.apply(i,this.data));return b.mml(k.With({open:this.delim,close:l.delim}))}return this.SUPER(arguments).checkItem.call(this,l)}});b.right=b.Subclass({type:"right",isClose:c,delim:")"});b.begin=b.Subclass({type:"begin",isOpen:c,checkItem:function(k){if(k.type==="end"){if(k.name!==this.name){d.Error("\\begin{"+this.name+"} ended with \\end{"+k.name+"}")}if(!this.end){return b.mml(this.mmlData())}return this.parse[this.end].call(this.parse,this,this.data)}if(k.type==="stop"){d.Error("Missing \\end{"+this.name+"}")}return this.SUPER(arguments).checkItem.call(this,k)}});b.end=b.Subclass({type:"end",isClose:c});b.style=b.Subclass({type:"style",checkItem:function(l){if(!l.isClose){return this.SUPER(arguments).checkItem.call(this,l)}var k=i.mstyle.apply(i,this.data).With(this.styles);return[b.mml(k),l]}});b.position=b.Subclass({type:"position",checkItem:function(l){if(l.isClose){d.Error("Missing box for "+this.name)}if(l.isNotStack){var k=l.mmlData();switch(this.move){case"vertical":k=i.mpadded(k).With({height:this.dh,depth:this.dd,voffset:this.dh});return[b.mml(k)];case"horizontal":return[b.mml(this.left),l,b.mml(this.right)]}}return this.SUPER(arguments).checkItem.call(this,l)}});b.array=b.Subclass({type:"array",isOpen:c,arraydef:{},Init:function(){this.table=[];this.row=[];this.env={};this.SUPER(arguments).Init.apply(this,arguments)},checkItem:function(l){if(l.isClose&&l.type!=="over"){if(l.isEntry){this.EndEntry();this.clearEnv();return f}if(l.isCR){this.EndEntry();this.EndRow();this.clearEnv();return f}this.EndTable();this.clearEnv();var k=i.mtable.apply(i,this.table).With(this.arraydef);if(this.open||this.close){k=i.mfenced(k).With({open:this.open,close:this.close})}k=b.mml(k);if(this.requireClose){if(l.type==="close"){return k}d.Error("Missing close brace")}return[k,l]}return this.SUPER(arguments).checkItem.call(this,l)},EndEntry:function(){this.row.push(i.mtd.apply(i,this.data));this.data=[]},EndRow:function(){this.table.push(i.mtr.apply(i,this.row));this.row=[]},EndTable:function(){if(this.data.length||this.row.length){this.EndEntry();this.EndRow()}this.checkLines()},checkLines:function(){if(this.arraydef.rowlines){var k=this.arraydef.rowlines.split(/ /);if(k.length===this.table.length){this.arraydef.frame=k.pop();this.arraydef.rowlines=k.join(" ")}else{if(k.length<this.table.length-1){this.arraydef.rowlines+=" none"}}}},clearEnv:function(){for(var k in this.env){if(this.env.hasOwnProperty(k)){delete this.env[k]}}}});b.cell=b.Subclass({type:"cell",isClose:c});b.mml=b.Subclass({type:"mml",isNotStack:c,Push:function(){for(var l=0,k=arguments.length;l<k;l++){if(arguments[l].type!=="mo"&&arguments[l].isEmbellished()){arguments[l]=i.TeXAtom(arguments[l]).With({isEmbellishedWrapper:c})}}this.data.push.apply(this.data,arguments)},Add:function(){this.data.push.apply(this.data,arguments);return this}});var g={};var j=function(){i=MathJax.ElementJax.mml;MathJax.Hub.Insert(g,{letter:/[a-z]/i,digit:/[0-9.]/,number:/^(?:[0-9]+(?:\{,\}[0-9]{3})*(?:\.[0-9]*)*|\.[0-9]+)/,special:{"\\":"ControlSequence","{":"Open","}":"Close","~":"Tilde","^":"Superscript",_:"Subscript"," ":"Space","\t":"Space","\r":"Space","\n":"Space","'":"Prime","%":"Comment","&":"Entry","#":"Hash","\u2019":"Prime"},remap:{"-":"2212","*":"2217"},mathchar0mi:{alpha:"03B1",beta:"03B2",gamma:"03B3",delta:"03B4",epsilon:"03F5",zeta:"03B6",eta:"03B7",theta:"03B8",iota:"03B9",kappa:"03BA",lambda:"03BB",mu:"03BC",nu:"03BD",xi:"03BE",omicron:"03BF",pi:"03C0",rho:"03C1",sigma:"03C3",tau:"03C4",upsilon:"03C5",phi:"03D5",chi:"03C7",psi:"03C8",omega:"03C9",varepsilon:"03B5",vartheta:"03D1",varpi:"03D6",varrho:"03F1",varsigma:"03C2",varphi:"03C6",S:"00A7",aleph:["2135",{mathvariant:i.VARIANT.NORMAL}],hbar:"210F",imath:"0131",jmath:"0237",ell:"2113",wp:["2118",{mathvariant:i.VARIANT.NORMAL}],Re:["211C",{mathvariant:i.VARIANT.NORMAL}],Im:["2111",{mathvariant:i.VARIANT.NORMAL}],partial:["2202",{mathvariant:i.VARIANT.NORMAL}],infty:["221E",{mathvariant:i.VARIANT.NORMAL}],prime:["2032",{mathvariant:i.VARIANT.NORMAL}],emptyset:["2205",{mathvariant:i.VARIANT.NORMAL}],nabla:["2207",{mathvariant:i.VARIANT.NORMAL}],top:["22A4",{mathvariant:i.VARIANT.NORMAL}],bot:["22A5",{mathvariant:i.VARIANT.NORMAL}],angle:["2220",{mathvariant:i.VARIANT.NORMAL}],triangle:["25B3",{mathvariant:i.VARIANT.NORMAL}],backslash:["2216",{mathvariant:i.VARIANT.NORMAL}],forall:["2200",{mathvariant:i.VARIANT.NORMAL}],exists:["2203",{mathvariant:i.VARIANT.NORMAL}],neg:["00AC",{mathvariant:i.VARIANT.NORMAL}],lnot:["00AC",{mathvariant:i.VARIANT.NORMAL}],flat:["266D",{mathvariant:i.VARIANT.NORMAL}],natural:["266E",{mathvariant:i.VARIANT.NORMAL}],sharp:["266F",{mathvariant:i.VARIANT.NORMAL}],clubsuit:["2663",{mathvariant:i.VARIANT.NORMAL}],diamondsuit:["2662",{mathvariant:i.VARIANT.NORMAL}],heartsuit:["2661",{mathvariant:i.VARIANT.NORMAL}],spadesuit:["2660",{mathvariant:i.VARIANT.NORMAL}]},mathchar0mo:{surd:"221A",coprod:["2210",{texClass:i.TEXCLASS.OP,movesupsub:c}],bigvee:["22C1",{texClass:i.TEXCLASS.OP,movesupsub:c}],bigwedge:["22C0",{texClass:i.TEXCLASS.OP,movesupsub:c}],biguplus:["2A04",{texClass:i.TEXCLASS.OP,movesupsub:c}],bigcap:["22C2",{texClass:i.TEXCLASS.OP,movesupsub:c}],bigcup:["22C3",{texClass:i.TEXCLASS.OP,movesupsub:c}],"int":["222B",{texClass:i.TEXCLASS.OP}],intop:["222B",{texClass:i.TEXCLASS.OP,movesupsub:c,movablelimits:c}],iint:["222C",{texClass:i.TEXCLASS.OP}],iiint:["222D",{texClass:i.TEXCLASS.OP}],prod:["220F",{texClass:i.TEXCLASS.OP,movesupsub:c}],sum:["2211",{texClass:i.TEXCLASS.OP,movesupsub:c}],bigotimes:["2A02",{texClass:i.TEXCLASS.OP,movesupsub:c}],bigoplus:["2A01",{texClass:i.TEXCLASS.OP,movesupsub:c}],bigodot:["2A00",{texClass:i.TEXCLASS.OP,movesupsub:c}],oint:["222E",{texClass:i.TEXCLASS.OP}],bigsqcup:["2A06",{texClass:i.TEXCLASS.OP,movesupsub:c}],smallint:["222B",{largeop:f}],triangleleft:"25C3",triangleright:"25B9",bigtriangleup:"25B3",bigtriangledown:"25BD",wedge:"2227",land:"2227",vee:"2228",lor:"2228",cap:"2229",cup:"222A",ddagger:"2021",dagger:"2020",sqcap:"2293",sqcup:"2294",uplus:"228E",amalg:"2A3F",diamond:"22C4",bullet:"2219",wr:"2240",div:"00F7",odot:["2299",{largeop:f}],oslash:["2298",{largeop:f}],otimes:["2297",{largeop:f}],ominus:["2296",{largeop:f}],oplus:["2295",{largeop:f}],mp:"2213",pm:"00B1",circ:"2218",bigcirc:"25EF",setminus:"2216",cdot:"22C5",ast:"2217",times:"00D7",star:"22C6",propto:"221D",sqsubseteq:"2291",sqsupseteq:"2292",parallel:"2225",mid:"2223",dashv:"22A3",vdash:"22A2",leq:"2264",le:"2264",geq:"2265",ge:"2265",lt:"003C",gt:"003E",succ:"227B",prec:"227A",approx:"2248",succeq:"2AB0",preceq:"2AAF",supset:"2283",subset:"2282",supseteq:"2287",subseteq:"2286","in":"2208",ni:"220B",notin:"2209",owns:"220B",gg:"226B",ll:"226A",sim:"223C",simeq:"2243",perp:"22A5",equiv:"2261",asymp:"224D",smile:"2323",frown:"2322",ne:"2260",neq:"2260",cong:"2245",doteq:"2250",bowtie:"22C8",models:"22A8",notChar:"0338",Leftrightarrow:"21D4",Leftarrow:"21D0",Rightarrow:"21D2",leftrightarrow:"2194",leftarrow:"2190",gets:"2190",rightarrow:"2192",to:"2192",mapsto:"21A6",leftharpoonup:"21BC",leftharpoondown:"21BD",rightharpoonup:"21C0",rightharpoondown:"21C1",nearrow:"2197",searrow:"2198",nwarrow:"2196",swarrow:"2199",rightleftharpoons:"21CC",hookrightarrow:"21AA",hookleftarrow:"21A9",longleftarrow:"27F5",Longleftarrow:"27F8",longrightarrow:"27F6",Longrightarrow:"27F9",Longleftrightarrow:"27FA",longleftrightarrow:"27F7",longmapsto:"27FC",ldots:"2026",cdots:"22EF",vdots:"22EE",ddots:"22F1",dots:"2026",dotsc:"2026",dotsb:"22EF",dotsm:"22EF",dotsi:"22EF",dotso:"2026",ldotp:["002E",{texClass:i.TEXCLASS.PUNCT}],cdotp:["22C5",{texClass:i.TEXCLASS.PUNCT}],colon:["003A",{texClass:i.TEXCLASS.PUNCT}]},mathchar7:{Gamma:"0393",Delta:"0394",Theta:"0398",Lambda:"039B",Xi:"039E",Pi:"03A0",Sigma:"03A3",Upsilon:"03A5",Phi:"03A6",Psi:"03A8",Omega:"03A9",_:"005F","#":"0023","$":"0024","%":"0025","&":"0026",And:"0026"},delimiter:{"(":"(",")":")","[":"[","]":"]","<":"27E8",">":"27E9","\\lt":"27E8","\\gt":"27E9","/":"/","|":["|",{texClass:i.TEXCLASS.ORD}],".":"","\\\\":"\\","\\lmoustache":"23B0","\\rmoustache":"23B1","\\lgroup":"27EE","\\rgroup":"27EF","\\arrowvert":"23D0","\\Arrowvert":"2016","\\bracevert":"23AA","\\Vert":["2225",{texClass:i.TEXCLASS.ORD}],"\\|":["2225",{texClass:i.TEXCLASS.ORD}],"\\vert":["|",{texClass:i.TEXCLASS.ORD}],"\\uparrow":"2191","\\downarrow":"2193","\\updownarrow":"2195","\\Uparrow":"21D1","\\Downarrow":"21D3","\\Updownarrow":"21D5","\\backslash":"\\","\\rangle":"27E9","\\langle":"27E8","\\rbrace":"}","\\lbrace":"{","\\}":"}","\\{":"{","\\rceil":"2309","\\lceil":"2308","\\rfloor":"230B","\\lfloor":"230A","\\lbrack":"[","\\rbrack":"]"},macros:{displaystyle:["SetStyle","D",c,0],textstyle:["SetStyle","T",f,0],scriptstyle:["SetStyle","S",f,1],scriptscriptstyle:["SetStyle","SS",f,2],rm:["SetFont",i.VARIANT.NORMAL],mit:["SetFont",i.VARIANT.ITALIC],oldstyle:["SetFont",i.VARIANT.OLDSTYLE],cal:["SetFont",i.VARIANT.CALIGRAPHIC],it:["SetFont",i.VARIANT.ITALIC],bf:["SetFont",i.VARIANT.BOLD],bbFont:["SetFont",i.VARIANT.DOUBLESTRUCK],scr:["SetFont",i.VARIANT.SCRIPT],frak:["SetFont",i.VARIANT.FRAKTUR],sf:["SetFont",i.VARIANT.SANSSERIF],tt:["SetFont",i.VARIANT.MONOSPACE],tiny:["SetSize",0.5],Tiny:["SetSize",0.6],scriptsize:["SetSize",0.7],small:["SetSize",0.85],normalsize:["SetSize",1],large:["SetSize",1.2],Large:["SetSize",1.44],LARGE:["SetSize",1.73],huge:["SetSize",2.07],Huge:["SetSize",2.49],arcsin:["NamedOp",0],arccos:["NamedOp",0],arctan:["NamedOp",0],arg:["NamedOp",0],cos:["NamedOp",0],cosh:["NamedOp",0],cot:["NamedOp",0],coth:["NamedOp",0],csc:["NamedOp",0],deg:["NamedOp",0],det:"NamedOp",dim:["NamedOp",0],exp:["NamedOp",0],gcd:"NamedOp",hom:["NamedOp",0],inf:"NamedOp",ker:["NamedOp",0],lg:["NamedOp",0],lim:"NamedOp",liminf:["NamedOp",null,"lim&thinsp;inf"],limsup:["NamedOp",null,"lim&thinsp;sup"],ln:["NamedOp",0],log:["NamedOp",0],max:"NamedOp",min:"NamedOp",Pr:"NamedOp",sec:["NamedOp",0],sin:["NamedOp",0],sinh:["NamedOp",0],sup:"NamedOp",tan:["NamedOp",0],tanh:["NamedOp",0],limits:["Limits",1],nolimits:["Limits",0],overline:["UnderOver","203E"],underline:["UnderOver","005F"],overbrace:["UnderOver","23DE",1],underbrace:["UnderOver","23DF",1],overrightarrow:["UnderOver","2192"],underrightarrow:["UnderOver","2192"],overleftarrow:["UnderOver","2190"],underleftarrow:["UnderOver","2190"],overleftrightarrow:["UnderOver","2194"],underleftrightarrow:["UnderOver","2194"],overset:"Overset",underset:"Underset",stackrel:["Macro","\\mathrel{\\mathop{#2}\\limits^{#1}}",2],over:"Over",overwithdelims:"Over",atop:"Over",atopwithdelims:"Over",above:"Over",abovewithdelims:"Over",brace:["Over","{","}"],brack:["Over","[","]"],choose:["Over","(",")"],frac:"Frac",sqrt:"Sqrt",root:"Root",uproot:["MoveRoot","upRoot"],leftroot:["MoveRoot","leftRoot"],left:"LeftRight",right:"LeftRight",llap:"Lap",rlap:"Lap",raise:"RaiseLower",lower:"RaiseLower",moveleft:"MoveLeftRight",moveright:"MoveLeftRight",",":["Spacer",i.LENGTH.THINMATHSPACE],":":["Spacer",i.LENGTH.THINMATHSPACE],">":["Spacer",i.LENGTH.MEDIUMMATHSPACE],";":["Spacer",i.LENGTH.THICKMATHSPACE],"!":["Spacer",i.LENGTH.NEGATIVETHINMATHSPACE],enspace:["Spacer",".5em"],quad:["Spacer","1em"],qquad:["Spacer","2em"],thinspace:["Spacer",i.LENGTH.THINMATHSPACE],negthinspace:["Spacer",i.LENGTH.NEGATIVETHINMATHSPACE],hskip:"Hskip",hspace:"Hskip",kern:"Hskip",mskip:"Hskip",mspace:"Hskip",mkern:"Hskip",Rule:["Rule"],Space:["Rule","blank"],big:["MakeBig",i.TEXCLASS.ORD,0.85],Big:["MakeBig",i.TEXCLASS.ORD,1.15],bigg:["MakeBig",i.TEXCLASS.ORD,1.45],Bigg:["MakeBig",i.TEXCLASS.ORD,1.75],bigl:["MakeBig",i.TEXCLASS.OPEN,0.85],Bigl:["MakeBig",i.TEXCLASS.OPEN,1.15],biggl:["MakeBig",i.TEXCLASS.OPEN,1.45],Biggl:["MakeBig",i.TEXCLASS.OPEN,1.75],bigr:["MakeBig",i.TEXCLASS.CLOSE,0.85],Bigr:["MakeBig",i.TEXCLASS.CLOSE,1.15],biggr:["MakeBig",i.TEXCLASS.CLOSE,1.45],Biggr:["MakeBig",i.TEXCLASS.CLOSE,1.75],bigm:["MakeBig",i.TEXCLASS.REL,0.85],Bigm:["MakeBig",i.TEXCLASS.REL,1.15],biggm:["MakeBig",i.TEXCLASS.REL,1.45],Biggm:["MakeBig",i.TEXCLASS.REL,1.75],mathord:["TeXAtom",i.TEXCLASS.ORD],mathop:["TeXAtom",i.TEXCLASS.OP],mathopen:["TeXAtom",i.TEXCLASS.OPEN],mathclose:["TeXAtom",i.TEXCLASS.CLOSE],mathbin:["TeXAtom",i.TEXCLASS.BIN],mathrel:["TeXAtom",i.TEXCLASS.REL],mathpunct:["TeXAtom",i.TEXCLASS.PUNCT],mathinner:["TeXAtom",i.TEXCLASS.INNER],vcenter:["TeXAtom",i.TEXCLASS.VCENTER],mathchoice:["Extension","mathchoice"],buildrel:"BuildRel",hbox:["HBox",0],text:"HBox",mbox:["HBox",0],fbox:"FBox",strut:"Strut",mathstrut:["Macro","\\vphantom{(}"],phantom:"Phantom",vphantom:["Phantom",1,0],hphantom:["Phantom",0,1],smash:"Smash",acute:["Accent","02CA"],grave:["Accent","02CB"],ddot:["Accent","00A8"],tilde:["Accent","02DC"],bar:["Accent","02C9"],breve:["Accent","02D8"],check:["Accent","02C7"],hat:["Accent","02C6"],vec:["Accent","20D7"],dot:["Accent","02D9"],widetilde:["Accent","02DC",1],widehat:["Accent","02C6",1],matrix:"Matrix",array:"Matrix",pmatrix:["Matrix","(",")"],cases:["Matrix","{","","left left",null,".1em"],eqalign:["Matrix",null,null,"right left",i.LENGTH.THICKMATHSPACE,".5em","D"],displaylines:["Matrix",null,null,"center",null,".5em","D"],cr:"Cr","\\":"Cr",newline:"Cr",hline:["HLine","solid"],hdashline:["HLine","dashed"],eqalignno:["Matrix",null,null,"right left right",i.LENGTH.THICKMATHSPACE+" 3em",".5em","D"],leqalignno:["Matrix",null,null,"right left right",i.LENGTH.THICKMATHSPACE+" 3em",".5em","D"],bmod:["Macro","\\mathbin{\\rm mod}"],pmod:["Macro","\\pod{{\\rm mod}\\kern 6mu #1}",1],mod:["Macro","\\mathchoice{\\kern18mu}{\\kern12mu}{\\kern12mu}{\\kern12mu}{\\rm mod}\\,\\,#1",1],pod:["Macro","\\mathchoice{\\kern18mu}{\\kern8mu}{\\kern8mu}{\\kern8mu}(#1)",1],iff:["Macro","\\;\\Longleftrightarrow\\;"],skew:["Macro","{{#2{#3\\mkern#1mu}\\mkern-#1mu}{}}",3],mathcal:["Macro","{\\cal #1}",1],mathscr:["Macro","{\\scr #1}",1],mathrm:["Macro","{\\rm #1}",1],mathbf:["Macro","{\\bf #1}",1],mathbb:["Macro","{\\bbFont #1}",1],Bbb:["Macro","{\\bbFont #1}",1],mathit:["Macro","{\\it #1}",1],mathfrak:["Macro","{\\frak #1}",1],mathsf:["Macro","{\\sf #1}",1],mathtt:["Macro","{\\tt #1}",1],textrm:["Macro","\\mathord{\\rm\\text{#1}}",1],textit:["Macro","\\mathord{\\it{\\text{#1}}}",1],textbf:["Macro","\\mathord{\\bf{\\text{#1}}}",1],pmb:["Macro","\\rlap{#1}\\kern1px{#1}",1],TeX:["Macro","T\\kern-.14em\\lower.5ex{E}\\kern-.115em X"],LaTeX:["Macro","L\\kern-.325em\\raise.21em{\\scriptstyle{A}}\\kern-.17em\\TeX"],not:["Macro","\\mathrel{\\rlap{\\kern.5em\\notChar}}"]," ":["Macro","\\text{ }"],space:"Tilde",begin:"Begin",end:"End",newcommand:["Extension","newcommand"],renewcommand:["Extension","newcommand"],newenvironment:["Extension","newcommand"],def:["Extension","newcommand"],verb:["Extension","verb"],boldsymbol:["Extension","boldsymbol"],tag:["Extension","AMSmath"],notag:["Extension","AMSmath"],label:["Macro","",1],nonumber:["Macro",""],unicode:["Extension","unicode"],color:"Color",href:["Extension","HTML"],"class":["Extension","HTML"],style:["Extension","HTML"],cssId:["Extension","HTML"],require:"Require"},environment:{array:["Array"],matrix:["Array",null,null,null,"c"],pmatrix:["Array",null,"(",")","c"],bmatrix:["Array",null,"[","]","c"],Bmatrix:["Array",null,"\\{","\\}","c"],vmatrix:["Array",null,"\\vert","\\vert","c"],Vmatrix:["Array",null,"\\Vert","\\Vert","c"],cases:["Array",null,"\\{",".","ll",null,".1em"],eqnarray:["Array",null,null,null,"rcl",i.LENGTH.THICKMATHSPACE,".5em","D"],"eqnarray*":["Array",null,null,null,"rcl",i.LENGTH.THICKMATHSPACE,".5em","D"],equation:[null,"Equation"],"equation*":[null,"Equation"],align:["ExtensionEnv",null,"AMSmath"],"align*":["ExtensionEnv",null,"AMSmath"],aligned:["ExtensionEnv",null,"AMSmath"],multline:["ExtensionEnv",null,"AMSmath"],"multline*":["ExtensionEnv",null,"AMSmath"],split:["ExtensionEnv",null,"AMSmath"],gather:["ExtensionEnv",null,"AMSmath"],"gather*":["ExtensionEnv",null,"AMSmath"],gathered:["ExtensionEnv",null,"AMSmath"],alignat:["ExtensionEnv",null,"AMSmath"],"alignat*":["ExtensionEnv",null,"AMSmath"],alignedat:["ExtensionEnv",null,"AMSmath"]},p_height:1.2/0.85});if(this.config.Macros){var k=this.config.Macros;for(var l in k){if(k.hasOwnProperty(l)){if(typeof(k[l])==="string"){g.macros[l]=["Macro",k[l]]}else{g.macros[l]=["Macro"].concat(k[l])}}}}};var a=MathJax.Object.Subclass({Init:function(l,m){this.string=l;this.i=0;this.macroCount=0;var k;if(m){k={};for(var n in m){if(m.hasOwnProperty(n)){k[n]=m[n]}}}this.stack=d.Stack(k);this.Parse();this.Push(b.stop())},Parse:function(){var k;while(this.i<this.string.length){k=this.string.charAt(this.i++);if(g.special[k]){this[g.special[k]](k)}else{if(g.letter.test(k)){this.Variable(k)}else{if(g.digit.test(k)){this.Number(k)}else{this.Other(k)}}}}},Push:function(){this.stack.Push.apply(this.stack,arguments)},mml:function(){if(this.stack.Top().type!=="mml"){return null}return this.stack.Top().data[0]},mmlToken:function(k){return k},ControlSequence:function(q){var k=this.GetCS(),p,n;if(g.macros[k]){var m=g.macros[k];if(!(m instanceof Array)){m=[m]}var l=m[0];if(!(l instanceof Function)){l=this[l]}l.apply(this,["\\"+k].concat(m.slice(1)))}else{if(g.mathchar0mi[k]){p=g.mathchar0mi[k];n={mathvariant:i.VARIANT.ITALIC};if(p instanceof Array){n=p[1];p=p[0]}this.Push(this.mmlToken(i.mi(i.entity("#x"+p)).With(n)))}else{if(g.mathchar0mo[k]){p=g.mathchar0mo[k];n={stretchy:f};if(p instanceof Array){n=p[1];n.stretchy=f;p=p[0]}this.Push(this.mmlToken(i.mo(i.entity("#x"+p)).With(n)))}else{if(g.mathchar7[k]){p=g.mathchar7[k];n={mathvariant:i.VARIANT.NORMAL};if(p instanceof Array){n=p[1];p=p[0]}if(this.stack.env.font){n.mathvariant=this.stack.env.font}this.Push(this.mmlToken(i.mi(i.entity("#x"+p)).With(n)))}else{if(g.delimiter["\\"+k]!=null){var o=g.delimiter["\\"+k];n={};if(o instanceof Array){n=o[1];o=o[0]}if(o.length===4){o=i.entity("#x"+o)}else{o=i.chars(o)}this.Push(this.mmlToken(i.mo(o).With({fence:f,stretchy:f}).With(n)))}else{this.csUndefined("\\"+k)}}}}}},csUndefined:function(k){d.Error("Undefined control sequence "+k)},Variable:function(l){var k={};if(this.stack.env.font){k.mathvariant=this.stack.env.font}this.Push(this.mmlToken(i.mi(i.chars(l)).With(k)))},Number:function(m){var k,l=this.string.slice(this.i-1).match(g.number);if(l){k=i.mn(l[0].replace(/[{}]/g,""));this.i+=l[0].length-1}else{k=i.mo(i.chars(m))}if(this.stack.env.font){k.mathvariant=this.stack.env.font}this.Push(this.mmlToken(k))},Open:function(k){this.Push(b.open())},Close:function(k){this.Push(b.close())},Tilde:function(k){this.Push(i.mtext(i.chars(h)))},Space:function(k){},Superscript:function(m){var k,l=this.stack.Prev();if(!l){l=i.mi("")}if(l.isEmbellishedWrapper){l=l.data[0].data[0]}if(l.type==="msubsup"){if(l.data[l.sup]){if(!l.data[l.sup].isPrime){d.Error("Double exponent: use braces to clarify")}l=i.msubsup(l,null,null)}k=l.sup}else{if(l.movesupsub){if(l.type!=="munderover"||l.data[l.over]){l=i.munderover(l,null,null).With({movesupsub:c})}k=l.over}else{l=i.msubsup(l,null,null);k=l.sup}}this.Push(b.subsup(l).With({position:k}))},Subscript:function(m){var k,l=this.stack.Prev();if(!l){l=i.mi("")}if(l.isEmbellishedWrapper){l=l.data[0].data[0]}if(l.type==="msubsup"){if(l.data[l.sub]){d.Error("Double subscripts: use braces to clarify")}k=l.sub}else{if(l.movesupsub){if(l.type!=="munderover"||l.data[l.under]){l=i.munderover(l,null,null).With({movesupsub:c})}k=l.under}else{l=i.msubsup(l,null,null);k=l.sub}}this.Push(b.subsup(l).With({position:k}))},PRIME:String.fromCharCode(8242),SMARTQUOTE:String.fromCharCode(8217),Prime:function(m){var l=this.stack.Prev();if(!l){l=i.mi()}if(l.type==="msubsup"&&l.data[l.sup]){d.Error("Prime causes double exponent: use braces to clarify")}var k="";this.i--;do{k+=this.PRIME;this.i++,m=this.GetNext()}while(m==="'"||m===this.SMARTQUOTE);k=this.mmlToken(i.mo(i.chars(k)).With({isPrime:c,variantForm:d.isSTIX}));this.Push(i.msubsup(l,null,k))},Comment:function(k){while(this.i<this.string.length&&this.string.charAt(this.i)!="\n"){this.i++}},Hash:function(k){d.Error("You can't use 'macro parameter character #' in math mode")},Other:function(m){var l={stretchy:false},k;if(this.stack.env.font){l.mathvariant=this.stack.env.font}if(g.remap[m]){m=g.remap[m];if(m instanceof Array){l=m[1];m=m[0]}k=i.mo(i.entity("#x"+m))}else{k=i.mo(m)}if(k.autoDefault("texClass",true)==""){k=i.TeXAtom(k)}this.Push(this.mmlToken(k.With(l)))},SetFont:function(l,k){this.stack.env.font=k},SetStyle:function(l,k,m,n){this.stack.env.style=k;this.stack.env.level=n;this.Push(b.style().With({styles:{displaystyle:m,scriptlevel:n}}))},SetSize:function(k,l){this.stack.env.size=l;this.Push(b.style().With({styles:{mathsize:l+"em"}}))},Color:function(m){var l=this.GetArgument(m);var k=this.stack.env.color;this.stack.env.color=l;var n=this.ParseArg(m);if(k){this.stack.env.color}else{delete this.stack.env.color}this.Push(i.mstyle(n).With({mathcolor:l}))},Spacer:function(k,l){this.Push(i.mspace().With({width:l,mathsize:i.SIZE.NORMAL,scriptlevel:1}))},LeftRight:function(k){this.Push(b[k.substr(1)]().With({delim:this.GetDelimiter(k)}))},NamedOp:function(m,l,o){var n=(l!=null&&l===0?f:c);if(!o){o=m.substr(1)}l=((l||l==null)?c:f);o=o.replace(/&thinsp;/,String.fromCharCode(8198));var k=i.mo(o).With({movablelimits:l,movesupsub:n,form:i.FORM.PREFIX,texClass:i.TEXCLASS.OP});k.useMMLspacing&=~k.SPACE_ATTR.form;this.Push(this.mmlToken(k))},Limits:function(l,k){var m=this.stack.Prev("nopop");if(m.texClass!==i.TEXCLASS.OP){d.Error(l+" is allowed only on operators")}m.movesupsub=(k?c:f);m.movablelimits=f},Over:function(m,l,n){var k=b.over().With({name:m});if(l||n){k.open=l;k.close=n}else{if(m.match(/withdelims$/)){k.open=this.GetDelimiter(m);k.close=this.GetDelimiter(m)}}if(m.match(/^\\above/)){k.thickness=this.GetDimen(m)}else{if(m.match(/^\\atop/)||l||n){k.thickness=0}}this.Push(k)},Frac:function(l){var k=this.ParseArg(l);var m=this.ParseArg(l);this.Push(i.mfrac(k,m))},Sqrt:function(l){var m=this.GetBrackets(l),k=this.ParseArg(l);if(m==""){k=i.msqrt.apply(i,k.array())}else{k=i.mroot(k,this.parseRoot(m))}this.Push(k)},Root:function(l){var m=this.GetUpTo(l,"\\of");var k=this.ParseArg(l);this.Push(i.mroot(k,this.parseRoot(m)))},parseRoot:function(p){var l=this.stack.env,k=l.inRoot;l.inRoot=true;var o=d.Parse(p,l);p=o.mml();var m=o.stack.global;if(m.leftRoot||m.upRoot){p=i.mpadded(p);if(m.leftRoot){p.width=m.leftRoot}if(m.upRoot){p.voffset=m.upRoot;p.height=m.upRoot}}l.inRoot=k;return p},MoveRoot:function(k,m){if(!this.stack.env.inRoot){d.Error(k+" can appear only within a root")}if(this.stack.global[m]){d.Error("Multiple use of "+k)}var l=this.GetArgument(k);if(!l.match(/-?[0-9]+/)){d.Error("The argument to "+k+" must be an integer")}l=(l/15)+"em";if(l.substr(0,1)!=="-"){l="+"+l}this.stack.global[m]=l},Accent:function(m,k,p){var o=this.ParseArg(m);var n={accent:true};if(this.stack.env.font){n.mathvariant=this.stack.env.font}var l=this.mmlToken(i.mo(i.entity("#x"+k)).With(n));l.stretchy=(p?c:f);this.Push(i.munderover(o,null,l).With({accent:c}))},UnderOver:function(m,p,k){var o={o:"over",u:"under"}[m.charAt(1)];var n=this.ParseArg(m);if(n.Get("movablelimits")){n.movablelimits=false}var l=i.munderover(n,null,null);if(k){l.movesupsub=c}l.data[l[o]]=this.mmlToken(i.mo(i.entity("#x"+p)).With({stretchy:c,accent:(o=="under")}));this.Push(l)},Overset:function(k){var m=this.ParseArg(k),l=this.ParseArg(k);this.Push(i.munderover(l,null,m))},Underset:function(k){var m=this.ParseArg(k),l=this.ParseArg(k);this.Push(i.munderover(l,m,null))},TeXAtom:function(n,p){var o={texClass:p},m;if(p==i.TEXCLASS.OP){o.movesupsub=o.movablelimits=c;var k=this.GetArgument(n);var l=k.match(/^\s*\\rm\s+([a-zA-Z0-9 ]+)$/);if(l){m=this.mmlToken(i.mo(l[1]).With({movablelimits:c,movesupsub:c,mathvariant:i.VARIANT.NORMAL,form:i.FORM.PREFIX,texClass:i.TEXCLASS.OP}));m.useMMLspacing&=~m.SPACE_ATTR.form}else{m=i.TeXAtom(d.Parse(k,this.stack.env).mml()).With(o)}}else{m=i.TeXAtom(this.ParseArg(n)).With(o)}this.Push(m)},Strut:function(k){this.Push(i.mpadded(i.mrow()).With({height:"8.6pt",depth:"3pt",width:0}))},Phantom:function(l,k,m){var n=i.mphantom(this.ParseArg(l));if(k||m){n=i.mpadded(n);if(m){n.height=n.depth=0}if(k){n.width=0}}this.Push(n)},Smash:function(m){var l=this.trimSpaces(this.GetBrackets(m));var k=i.mpadded(this.ParseArg(m));switch(l){case"b":k.depth=0;break;case"t":k.height=0;break;default:k.height=k.depth=0}this.Push(k)},Lap:function(l){var k=i.mpadded(this.ParseArg(l)).With({width:0});if(l==="\\llap"){k.lspace="-1 width"}this.Push(k)},RaiseLower:function(k){var l=this.GetDimen(k);var m=b.position().With({name:k,move:"vertical"});if(l.charAt(0)==="-"){l=l.slice(1);k={raise:"\\lower",lower:"\\raise"}[k.substr(1)]}if(k==="\\lower"){m.dh="-"+l;m.dd="+"+l}else{m.dh="+"+l;m.dd="-"+l}this.Push(m)},MoveLeftRight:function(k){var n=this.GetDimen(k);var m=(n.charAt(0)==="-"?n.slice(1):"-"+n);if(k==="\\moveleft"){var l=n;n=m;m=l}this.Push(b.position().With({name:k,move:"horizontal",left:i.mspace().With({width:n,mathsize:i.SIZE.NORMAL,scriptlevel:1}),right:i.mspace().With({width:m,mathsize:i.SIZE.NORMAL,scriptlevel:1})}))},Hskip:function(k){this.Push(i.mspace().With({width:this.GetDimen(k),mathsize:i.SIZE.NORMAL,scriptlevel:0}))},Rule:function(m,o){var k=this.GetDimen(m),n=this.GetDimen(m),q=this.GetDimen(m);var l,p={width:k,height:n,depth:q};if(o!=="blank"){l=i.mpadded(i.mrow()).With(p);if(parseFloat(k)&&parseFloat(n)+parseFloat(q)){l=i.mstyle(l).With({mathbackground:(this.stack.env.color||"black")})}}else{l=i.mspace().With(p)}this.Push(l)},MakeBig:function(k,n,l){l*=g.p_height;l=String(l).replace(/(\.\d\d\d).+/,"$1")+"em";var m=this.GetDelimiter(k);this.Push(i.TeXAtom(i.mo(m).With({minsize:l,maxsize:l,scriptlevel:0,fence:c,stretchy:c,symmetric:c})).With({texClass:n}))},BuildRel:function(k){var l=this.ParseUpTo(k,"\\over");var m=this.ParseArg(k);this.Push(i.TeXAtom(i.munderover(m,null,l)).With({mclass:i.TEXCLASS.REL}))},HBox:function(k,l){this.Push.apply(this,this.InternalMath(this.GetArgument(k),l))},FBox:function(k){this.Push(i.menclose.apply(i,this.InternalMath(this.GetArgument(k))).With({notation:"box"}))},Require:function(k){var l=this.GetArgument(k);this.Extension(null,l)},Extension:function(k,l,m){if(k&&!typeof(k)==="string"){k=k.name}l=d.extensionDir+"/"+l;if(!l.match(/\.js$/)){l+=".js"}if(!MathJax.Ajax.loaded[MathJax.Ajax.fileURL(l)]){if(k!=null){delete g[m||"macros"][k.replace(/^\\/,"")]}MathJax.Hub.RestartAfter(MathJax.Ajax.Require(l))}},Macro:function(l,o,n){if(n){var k=[];for(var m=0;m<n;m++){k.push(this.GetArgument(l))}o=this.SubstituteArgs(k,o)}this.string=this.AddArgs(o,this.string.slice(this.i));this.i=0;if(++this.macroCount>d.config.MAXMACROS){d.Error("MathJax maximum macro substitution count exceeded; is there a recursive macro call?")}},Matrix:function(l,n,s,p,q,m,k){var r=this.GetNext();if(r===""){d.Error("Missing argument for "+l)}if(r==="{"){this.i++}else{this.string=r+"}"+this.string.slice(this.i+1);this.i=0}var o=b.array().With({requireClose:c,arraydef:{rowspacing:(m||"4pt"),columnspacing:(q||"1em")}});if(n||s){o.open=n;o.close=s}if(k==="D"){o.arraydef.displaystyle=c}if(p!=null){o.arraydef.columnalign=p}this.Push(o)},Entry:function(k){this.Push(b.cell().With({isEntry:c,name:k}))},Cr:function(k){this.Push(b.cell().With({isCR:c,name:k}))},HLine:function(l,m){if(m==null){m="solid"}var n=this.stack.Top();if(n.type!=="array"||n.data.length){d.Error("Misplaced "+l)}if(n.table.length==0){n.arraydef.frame=m}else{var k=(n.arraydef.rowlines?n.arraydef.rowlines.split(/ /):[]);while(k.length<n.table.length){k.push("none")}k[n.table.length-1]=m;n.arraydef.rowlines=k.join(" ")}},Begin:function(l){var m=this.GetArgument(l);if(m.match(/[^a-z*]/i)){d.Error('Invalid environment name "'+m+'"')}if(!g.environment[m]){d.Error('Unknown environment "'+m+'"')}if(++this.macroCount>d.config.MAXMACROS){d.Error("MathJax maximum substitution count exceeded; is there a recursive latex environment?")}var n=g.environment[m];if(!(n instanceof Array)){n=[n]}var k=b.begin().With({name:m,end:n[1],parse:this});if(n[0]&&this[n[0]]){k=this[n[0]].apply(this,[k].concat(n.slice(2)))}this.Push(k)},End:function(k){this.Push(b.end().With({name:this.GetArgument(k)}))},Equation:function(k,l){return l},ExtensionEnv:function(l,k){this.Extension(l.name,k,"environment")},Array:function(m,o,t,r,s,n,k,p){if(!r){r=this.GetArgument("\\begin{"+m.name+"}")}var u=("c"+r).replace(/[^clr|:]/g,"").replace(/[^|:]([|:])+/g,"$1");r=r.replace(/[^clr]/g,"").split("").join(" ");r=r.replace(/l/g,"left").replace(/r/g,"right").replace(/c/g,"center");var q=b.array().With({arraydef:{columnalign:r,columnspacing:(s||"1em"),rowspacing:(n||"4pt")}});if(u.match(/[|:]/)){var l=(u.charAt(0)+u.charAt(u.length-1)).replace(/[^|:]/g,"");if(l!==""){q.arraydef.frame={"|":"solid",":":"dashed"}[l.charAt(0)];q.arraydef.framespacing=".5em .5ex"}u=u.substr(1,u.length-2);q.arraydef.columnlines=u.split("").join(" ").replace(/[^|: ]/g,"none").replace(/\|/g,"solid").replace(/:/g,"dashed")}if(o){q.open=this.convertDelimiter(o)}if(t){q.close=this.convertDelimiter(t)}if(k==="D"){q.arraydef.displaystyle=c}if(k==="S"){q.arraydef.scriptlevel=1}if(p){q.arraydef.useHeight=f}this.Push(m);return q},convertDelimiter:function(k){if(k){k=g.delimiter[k]}if(k==null){return null}if(k instanceof Array){k=k[0]}if(k.length===4){k=String.fromCharCode(parseInt(k,16))}return k},trimSpaces:function(k){if(typeof(k)!="string"){return k}return k.replace(/^\s+|\s+$/g,"")},nextIsSpace:function(){return this.string.charAt(this.i).match(/[ \n\r\t]/)},GetNext:function(){while(this.nextIsSpace()){this.i++}return this.string.charAt(this.i)},GetCS:function(){var k=this.string.slice(this.i).match(/^([a-z]+|.) ?/i);if(k){this.i+=k[1].length;return k[1]}else{this.i++;return" "}},GetArgument:function(l,m){switch(this.GetNext()){case"":if(!m){d.Error("Missing argument for "+l)}return null;case"}":if(!m){d.Error("Extra close brace or missing open brace")}return null;case"\\":this.i++;return"\\"+this.GetCS();case"{":var k=++this.i,n=1;while(this.i<this.string.length){switch(this.string.charAt(this.i++)){case"\\":this.i++;break;case"{":n++;break;case"}":if(n==0){d.Error("Extra close brace")}if(--n==0){return this.string.slice(k,this.i-1)}break}}d.Error("Missing close brace");break}return this.string.charAt(this.i++)},GetBrackets:function(l){if(this.GetNext()!="["){return""}var k=++this.i,m=0;while(this.i<this.string.length){switch(this.string.charAt(this.i++)){case"{":m++;break;case"\\":this.i++;break;case"}":if(m--<=0){d.Error("Extra close brace while looking for ']'")}break;case"]":if(m==0){return this.string.slice(k,this.i-1)}break}}d.Error("Couldn't find closing ']' for argument to "+l)},GetDelimiter:function(k){while(this.nextIsSpace()){this.i++}var l=this.string.charAt(this.i);if(this.i<this.string.length){this.i++;if(l=="\\"){l+=this.GetCS(k)}if(g.delimiter[l]!=null){return this.convertDelimiter(l)}}d.Error("Missing or unrecognized delimiter for "+k)},GetDimen:function(l){var m;if(this.nextIsSpace()){this.i++}if(this.string.charAt(this.i)=="{"){m=this.GetArgument(l);if(m.match(/^\s*([-+]?(\.\d+|\d+(\.\d*)?))\s*(pt|em|ex|mu|px|mm|cm|in|pc)\s*$/)){return m.replace(/ /g,"")}}else{m=this.string.slice(this.i);var k=m.match(/^\s*(([-+]?(\.\d+|\d+(\.\d*)?))\s*(pt|em|ex|mu|px|mm|cm|in|pc)) ?/);if(k){this.i+=k[0].length;return k[1].replace(/ /g,"")}}d.Error("Missing dimension or its units for "+l)},GetUpTo:function(n,o){while(this.nextIsSpace()){this.i++}var m=this.i,l,q,p=0;while(this.i<this.string.length){l=this.i;q=this.string.charAt(this.i++);switch(q){case"\\":q+=this.GetCS();break;case"{":p++;break;case"}":if(p==0){d.Error("Extra close brace while looking for "+o)}p--;break}if(p==0&&q==o){return this.string.slice(m,l)}}d.Error("Couldn't find "+o+" for "+n)},ParseArg:function(k){return d.Parse(this.GetArgument(k),this.stack.env).mml()},ParseUpTo:function(k,l){return d.Parse(this.GetUpTo(k,l),this.stack.env).mml()},InternalMath:function(q,s){var p={displaystyle:f};if(s!=null){p.scriptlevel=s}if(this.stack.env.font){p.mathvariant=this.stack.env.font}if(!q.match(/\$|\\\(/)){return[this.InternalText(q,p)]}var o=0,l=0,r,n="";var m=[];while(o<q.length){r=q.charAt(o++);if(r==="$"){if(n==="$"){m.push(i.TeXAtom(d.Parse(q.slice(l,o-1)).mml().With(p)));n="";l=o}else{if(n===""){if(l<o-1){m.push(this.InternalText(q.slice(l,o-1),p))}n="$";l=o}}}else{if(r==="\\"){r=q.charAt(o++);if(r==="("&&n===""){if(l<o-2){m.push(this.InternalText(q.slice(l,o-2),p))}n=")";l=o}else{if(r===")"&&n===")"){m.push(i.TeXAtom(d.Parse(q.slice(l,o-2)).mml().With(p)));n="";l=o}}}}}if(n!==""){d.Error("Math not terminated in text box")}if(l<q.length){m.push(this.InternalText(q.slice(l),p))}return m},InternalText:function(l,k){l=l.replace(/^\s+/,h).replace(/\s+$/,h);return i.mtext(i.chars(l)).With(k)},SubstituteArgs:function(l,k){var o="";var n="";var p;var m=0;while(m<k.length){p=k.charAt(m++);if(p==="\\"){o+=p+k.charAt(m++)}else{if(p==="#"){p=k.charAt(m++);if(p==="#"){o+=p}else{if(!p.match(/[1-9]/)||p>l.length){d.Error("Illegal macro parameter reference")}n=this.AddArgs(this.AddArgs(n,o),l[p-1]);o=""}}else{o+=p}}}return this.AddArgs(n,o)},AddArgs:function(l,k){if(k.match(/^[a-z]/i)&&l.match(/(^|[^\\])(\\\\)*\\[a-z]+$/i)){l+=" "}if(l.length+k.length>d.config.MAXBUFFER){d.Error("MathJax internal buffer size exceeded; is there a recursive macro call?")}return l+k}});d.Augment({Stack:e,Parse:a,Definitions:g,Startup:j,config:{MAXMACROS:10000,MAXBUFFER:5*1024},Translate:function(k){var l,n=k.innerHTML.replace(/^\s+/,"").replace(/\s+$/,"");if(MathJax.Hub.Browser.isKonqueror){n=n.replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&")}var o=(k.type.replace(/\n/g," ").match(/(;|\s|\n)mode\s*=\s*display(;|\s|\n|$)/)!=null);n=d.prefilterMath(n,o,k);try{l=d.Parse(n).mml()}catch(m){if(!m.texError){throw m}l=this.formatError(m,n,o,k)}if(l.inferred){l=i.apply(MathJax.ElementJax,l.data)}else{l=i(l)}if(o){l.root.display="block"}return this.postfilterMath(l,o,k)},prefilterMath:function(l,m,k){return l.replace(/([_^]\s*\d)([0-9.,])/g,"$1 $2")},postfilterMath:function(l,m,k){this.combineRelations(l.root);return l},formatError:function(m,l,n,k){return i.merror(m.message.replace(/\n.*/,""))},Error:function(k){throw MathJax.Hub.Insert(Error(k),{texError:c})},Macro:function(k,l,m){g.macros[k]=["Macro"].concat([].slice.call(arguments,1))},combineRelations:function(l){for(var n=0,k=l.data.length;n<k;n++){if(l.data[n]){if(l.isa(i.mrow)){while(n+1<k&&l.data[n+1]&&l.data[n].isa(i.mo)&&l.data[n+1].isa(i.mo)&&l.data[n].Get("texClass")===i.TEXCLASS.REL&&l.data[n+1].Get("texClass")===i.TEXCLASS.REL){l.data[n].Append.apply(l.data[n],l.data[n+1].data);l.data.splice(n+1,1);k--}}if(!l.data[n].isToken){this.combineRelations(l.data[n])}}}}});d.loadComplete("jax.js")})(MathJax.InputJax.TeX);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/autoload/annotation-xml.js b/static/MathJax/jax/output/HTML-CSS/autoload/annotation-xml.js
new file mode 100644
index 0000000..048d293
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/autoload/annotation-xml.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/autoload/annotation-xml.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function(){var c="1.1";var a=MathJax.ElementJax.mml,b=MathJax.OutputJax["HTML-CSS"];a["annotation-xml"].Augment({toHTML:function(f){f=this.HTMLhandleSize(this.HTMLcreateSpan(f));var g=this.Get("encoding");for(var e=0,d=this.data.length;e<d;e++){this.data[e].toHTML(f,g)}this.HTMLhandleSpace(f);this.HTMLhandleColor(f);return f},HTMLgetScale:function(){return this.SUPER(arguments).HTMLgetScale.call(this)*(100/b.scale)}});a.xml.Augment({toHTML:function(f,g){for(var e=0,d=this.data.length;e<d;e++){f.appendChild(this.data[e].cloneNode(true))}f.bbox.w=b.getW(f);f.bbox.rw=f.bbox.w;var h=b.getHD(f);f.bbox.h=h.h;f.bbox.d=h.d}});MathJax.Hub.Startup.signal.Post("HTML-CSS annotation-xml Ready");MathJax.Ajax.loadComplete(b.autoloadDir+"/annotation-xml.js")});
+
diff --git a/static/MathJax/jax/output/HTML-CSS/autoload/maction.js b/static/MathJax/jax/output/HTML-CSS/autoload/maction.js
new file mode 100644
index 0000000..91ca123
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/autoload/maction.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/autoload/maction.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function(){var g="1.1.2";var c=MathJax.ElementJax.mml,e=MathJax.OutputJax["HTML-CSS"];var d,f,b;var a=e.config.tooltip=MathJax.Hub.Insert({delayPost:600,delayClear:600,offsetX:10,offsetY:5},e.config.tooltip||{});c.maction.Augment({HTMLtooltip:e.addElement(document.body,"div",{id:"MathJax_Tooltip"}),toHTML:function(k,h,m){k=this.HTMLhandleSize(this.HTMLcreateSpan(k));k.bbox=null;var i=this.getValues("actiontype","selection"),n;var j=this.data[i.selection-1];if(j){e.Measured(j.toHTML(k),k);if(m!=null){e.Remeasured(j.HTMLstretchV(k,h,m),k)}else{if(h!=null){e.Remeasured(j.HTMLstretchH(k,h),k)}}if(e.msieHitBoxBug){var l=e.addElement(k,"span");n=e.createFrame(l,k.bbox.h,k.bbox.d,k.bbox.w,0,"none");k.insertBefore(l,k.firstChild);l.style.marginRight=e.Em(-k.bbox.w);if(e.msieInlineBlockAlignBug){n.style.verticalAlign=e.Em(e.getHD(k).d-k.bbox.d)}}else{n=e.createFrame(k,k.bbox.h,k.bbox.d,k.bbox.w,0,"none");k.insertBefore(n,k.firstChild);n.style.marginRight=e.Em(-k.bbox.w)}n.className="MathJax_HitBox";n.id="MathJax-HitBox-"+this.spanID;if(this.HTMLaction[i.actiontype]){this.HTMLaction[i.actiontype].call(this,k,n,i.selection)}}this.HTMLhandleSpace(k);this.HTMLhandleColor(k);return k},HTMLstretchH:c.mbase.HTMLstretchH,HTMLstretchV:c.mbase.HTMLstretchV,HTMLaction:{toggle:function(i,j,h){this.selection=h;j.onclick=i.childNodes[1].onclick=MathJax.Callback(["HTMLclick",this]);j.style.cursor=i.childNodes[1].style.cursor="pointer"},statusline:function(i,j,h){j.onmouseover=i.childNodes[1].onmouseover=MathJax.Callback(["HTMLsetStatus",this]);j.onmouseout=i.childNodes[1].onmouseout=MathJax.Callback(["HTMLclearStatus",this]);j.onmouseover.autoReset=j.onmouseout.autoReset=true},tooltip:function(i,j,h){if(this.data[1]&&this.data[1].isToken){j.title=j.alt=i.childNodes[1].title=i.childNodes[1].alt=this.data[1].data.join("")}else{j.onmouseover=i.childNodes[1].onmouseover=MathJax.Callback(["HTMLtooltipOver",this]);j.onmouseout=i.childNodes[1].onmouseout=MathJax.Callback(["HTMLtooltipOut",this]);j.onmouseover.autoReset=j.onmouseout.autoReset=true}}},HTMLclick:function(i){this.selection++;if(this.selection>this.data.length){this.selection=1}var h=this;while(h.type!=="math"){h=h.inherit}MathJax.Hub.getJaxFor(h.inputID).Update();if(!i){i=window.event}if(i.preventDefault){i.preventDefault()}if(i.stopPropagation){i.stopPropagation()}i.cancelBubble=true;i.returnValue=false;return false},HTMLsetStatus:function(h){window.status=((this.data[1]&&this.data[1].isToken)?this.data[1].data.join(""):this.data[1].toString())},HTMLclearStatus:function(h){window.status=""},HTMLtooltipOver:function(i){if(!i){i=window.event}if(b){clearTimeout(b);b=null}if(f){clearTimeout(f)}var h=i.pageX;var k=i.pageY;if(h==null){h=i.clientX+document.body.scrollLeft+document.documentElement.scrollLeft;k=i.clientY+document.body.scrollTop+document.documentElement.scrollTop}var j=MathJax.Callback(["HTMLtooltipPost",this,h+a.offsetX,k+a.offsetY]);f=setTimeout(j,a.delayPost)},HTMLtooltipOut:function(h){if(f){clearTimeout(f);f=null}if(b){clearTimeout(b)}var i=MathJax.Callback(["HTMLtooltipClear",this,80]);b=setTimeout(i,a.delayClear)},HTMLtooltipPost:function(i,m){f=null;if(b){clearTimeout(b);b=null}var l=this.HTMLtooltip;l.style.display="block";l.style.opacity="";l.style.filter=e.config.styles["#MathJax_Tooltip"].filter;if(this===d){return}l.style.left=i+"px";l.style.top=m+"px";l.innerHTML='<span class="MathJax"><nobr></nobr></span>';e.getScales(l.firstChild,l.firstChild);var h=e.createStack(l.firstChild.firstChild);var k=e.createBox(h);try{e.Measured(this.data[1].toHTML(k),k)}catch(j){if(!j.restart){throw j}l.style.display="none";MathJax.Callback.After(["HTMLtooltipPost",this,i,m],j.restart)}e.placeBox(k,0,0);e.createRule(l.firstChild.firstChild,k.bbox.h,k.bbox.d,0);d=this},HTMLtooltipClear:function(i){var h=this.HTMLtooltip;if(i<=0){h.style.display="none";h.style.opacity=h.style.filter="";b=null}else{h.style.opacity=i/100;h.style.filter="alpha(opacity="+i+")";b=setTimeout(MathJax.Callback(["HTMLtooltipClear",this,i-20]),50)}}});MathJax.Hub.Browser.Select({MSIE:function(h){e.msieHitBoxBug=true}});MathJax.Hub.Startup.signal.Post("HTML-CSS maction Ready");MathJax.Ajax.loadComplete(e.autoloadDir+"/maction.js")});
+
diff --git a/static/MathJax/jax/output/HTML-CSS/autoload/menclose.js b/static/MathJax/jax/output/HTML-CSS/autoload/menclose.js
new file mode 100644
index 0000000..735e485
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/autoload/menclose.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/autoload/menclose.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function(){var d="1.1.1";var a=MathJax.ElementJax.mml,b=MathJax.OutputJax["HTML-CSS"];var c="http://www.w3.org/2000/svg";var f="urn:schemas-microsoft-com:vml";var e="mjxvml";a.menclose.Augment({toHTML:function(Q){var j=this.getValues("notation","thickness","padding","mathcolor","color");if(j.color&&!this.mathcolor){j.mathcolor=j.color}if(j.thickness==null){j.thickness=".075em"}if(j.padding==null){j.padding=".2em"}var M=b.length2em(j.padding);var E=b.length2em(j.thickness);var x=b.Em(E)+" solid";Q=this.HTMLcreateSpan(Q);var u=b.createStack(Q);var q=b.createBox(u);this.HTMLmeasureChild(0,q);var A=q.bbox.h+M+E,G=q.bbox.d+M+E,k=q.bbox.w+2*(M+E);var F=b.createFrame(u,A+G,0,k,E,"none");F.id="MathJax-frame-"+this.spanID;b.addBox(u,F);u.insertBefore(F,q);var l=j.notation.split(/ /);var n=0,K=0,o=0,v=0,C=0,z=0;var J,g;if(!j.mathcolor){j.mathcolor="black"}else{Q.style.color=j.mathcolor}for(var P=0,O=l.length;P<O;P++){switch(l[P]){case a.NOTATION.BOX:F.style.border=x;if(!b.msieBorderWidthBug){n=K=v=o=E}break;case a.NOTATION.ROUNDEDBOX:if(b.useVML){if(!g){g=this.HTMLvml(u,A,G,k,E,j.mathcolor)}var I=Math.floor(1000*Math.min(k,A+G)-2*E);var y=Math.floor(4000*(k-2*E)),S=Math.floor(4000*(A+G-2*E));this.HTMLvmlElement(g,"shape",{style:{width:this.HTMLpx(k-2*E),height:this.HTMLpx(A+G-2*E),left:this.HTMLpx(E,0.5),top:this.HTMLpx(E,0.5)},path:"m "+I+",0 qx 0,"+I+" l 0,"+(S-I)+" qy "+I+","+S+" l "+(y-I)+","+S+" qx "+y+","+(S-I)+" l "+y+","+I+" qy "+(y-I)+",0 x e",coordsize:y+","+S})}else{if(!J){J=this.HTMLsvg(u,A,G,k,E,j.mathcolor)}this.HTMLsvgElement(J.firstChild,"rect",{x:1,y:1,width:this.HTMLpx(k-E)-1,height:this.HTMLpx(A+G-E)-1,rx:this.HTMLpx(Math.min(A+G,k)/4)})}break;case a.NOTATION.CIRCLE:if(b.useVML){if(!g){g=this.HTMLvml(u,A,G,k,E,j.mathcolor)}this.HTMLvmlElement(g,"oval",{style:{width:this.HTMLpx(k-2*E),height:this.HTMLpx(A+G-2*E),left:this.HTMLpx(E,0.5),top:this.HTMLpx(E,0.5)}})}else{if(!J){J=this.HTMLsvg(u,A,G,k,E,j.mathcolor)}this.HTMLsvgElement(J.firstChild,"ellipse",{rx:this.HTMLpx(k/2-E),ry:this.HTMLpx((A+G)/2-E),cx:this.HTMLpx(k/2),cy:this.HTMLpx((A+G)/2)})}break;case a.NOTATION.LEFT:F.style.borderLeft=x;if(!b.msieBorderWidthBug){v=E}break;case a.NOTATION.ACTUARIAL:F.style.borderTop=x;if(!b.msieBorderWidthBug){n=E;F.bbox.w+=M-E}case a.NOTATION.RIGHT:F.style.borderRight=x;if(!b.msieBorderWidthBug){o=E}break;case a.NOTATION.VERTICALSTRIKE:var s=b.createRule(u,A+G-E/2,0,E);b.addBox(u,s);b.placeBox(s,M+E+q.bbox.w/2,-G,true);break;case a.NOTATION.TOP:F.style.borderTop=x;if(!b.msieBorderWidthBug){n=E}break;case a.NOTATION.BOTTOM:F.style.borderBottom=x;if(!b.msieBorderWidthBug){K=E}break;case a.NOTATION.HORIZONTALSTRIKE:var N=b.createRule(u,E,0,k-E/2);b.addBox(u,N);b.placeBox(N,0,(A+G)/2-G,true);break;case a.NOTATION.UPDIAGONALSTRIKE:if(b.useVML){if(!g){g=this.HTMLvml(u,A,G,k,E,j.mathcolor)}this.HTMLvmlElement(g,"line",{from:"0,"+this.HTMLpx(A+G-E),to:this.HTMLpx(k)+",0"})}else{if(!J){J=this.HTMLsvg(u,A,G,k,E,j.mathcolor)}this.HTMLsvgElement(J.firstChild,"line",{x1:1,y1:this.HTMLpx(A+G-E),x2:this.HTMLpx(k-E),y2:this.HTMLpx(E)})}break;case a.NOTATION.DOWNDIAGONALSTRIKE:if(b.useVML){if(!g){g=this.HTMLvml(u,A,G,k,E,j.mathcolor)}this.HTMLvmlElement(g,"line",{from:"0,0",to:this.HTMLpx(k)+","+this.HTMLpx(A+G-E)})}else{if(!J){J=this.HTMLsvg(u,A,G,k,E,j.mathcolor)}this.HTMLsvgElement(J.firstChild,"line",{x1:1,y1:this.HTMLpx(E),x2:this.HTMLpx(k-E),y2:this.HTMLpx(A+G-E)})}break;case a.NOTATION.MADRUWB:F.style.borderBottom=x;F.style.borderRight=x;if(!b.msieBorderWidthBug){K=o=E}break;case a.NOTATION.RADICAL:if(b.useVML){if(!g){g=this.HTMLvml(u,A,G,k,E,j.mathcolor)}this.HTMLvmlElement(g,"shape",{style:{width:this.HTMLpx(k),height:this.HTMLpx(A+G)},path:"m "+this.HTMLpt(E/2,0.6*(A+G))+" l "+this.HTMLpt(M,A+G-E)+" "+this.HTMLpt(2*M,E/2)+" "+this.HTMLpt(k,E/2)+" e",coordsize:this.HTMLpt(k,A+G)});C=M}else{if(!J){J=this.HTMLsvg(u,A,G,k,E,j.mathcolor)}this.HTMLsvgElement(J.firstChild,"path",{d:"M 1,"+this.HTMLpx(0.6*(A+G))+" L "+this.HTMLpx(M)+","+this.HTMLpx(A+G)+" L "+this.HTMLpx(2*M)+",1 L "+this.HTMLpx(k)+",1"});b.placeBox(J.parentNode,0,M/2-G,true);C=M;z=E}break;case a.NOTATION.LONGDIV:if(b.useVML){if(!g){g=this.HTMLvml(u,A,G,k,E,j.mathcolor)}this.HTMLvmlElement(g,"line",{from:"0,"+this.HTMLpx(E/2),to:this.HTMLpx(k-E)+","+this.HTMLpx(E/2)});this.HTMLvmlElement(g,"arc",{style:{width:this.HTMLpx(2*M),height:this.HTMLpx(A+G-2*E),left:this.HTMLpx(-M),top:this.HTMLpx(E)},startangle:"10",endangle:"170"});C=M}else{if(!J){J=this.HTMLsvg(u,A,G,k,E,j.mathcolor)}this.HTMLsvgElement(J.firstChild,"path",{d:"M "+this.HTMLpx(k)+",1 L 1,1 a"+this.HTMLpx(M)+","+this.HTMLpx((A+G)/2-E)+" 0 0,1 1,"+this.HTMLpx(A+G-2*E)});b.placeBox(J.parentNode,0,E-G,true);C=M;z=E}break}}F.style.width=b.Em(k-v-o);F.style.height=b.Em(A+G-n-K);b.placeBox(F,0,z-G,true);b.placeBox(q,C+M+E,0);this.HTMLhandleSpace(Q);this.HTMLhandleColor(Q);return Q},HTMLpx:function(g){return(g*b.em)},HTMLpt:function(g,h){return Math.floor(1000*g)+","+Math.floor(1000*h)},HTMLhandleColor:function(h){var i=document.getElementById("MathJax-frame-"+this.spanID);if(i){var g=this.getValues("mathbackground","background");if(this.style&&h.style.backgroundColor){g.mathbackground=h.style.backgroundColor}if(g.background&&!this.mathbackground){g.mathbackground=g.background}if(g.mathbackground&&g.mathbackground!==a.COLOR.TRANSPARENT){i.style.backgroundColor=g.mathbackground}}else{this.SUPER(arguments).HTMLhandleColor.call(this,h)}},HTMLsvg:function(h,l,m,g,k,j){var i=document.createElementNS(c,"svg");if(i.style){i.style.width=b.Em(g);i.style.height=b.Em(l+m)}var n=b.createBox(h);n.appendChild(i);b.placeBox(n,0,-m,true);this.HTMLsvgElement(i,"g",{fill:"none",stroke:j,"stroke-width":k*b.em});return i},HTMLsvgElement:function(g,h,i){var j=document.createElementNS(c,h);if(i){for(var k in i){if(i.hasOwnProperty(k)){j.setAttributeNS(null,k,i[k].toString())}}}g.appendChild(j);return j},HTMLvml:function(i,l,m,h,k,j){var g=b.createFrame(i,l+m,0,h,0,"none");b.addBox(i,g);b.placeBox(g,0,-m,true);this.constructor.VMLcolor=j;this.constructor.VMLthickness=this.HTMLpx(k);return g},HTMLvmlElement:function(g,h,i){var j=b.addElement(g,e+":"+h);j.style.position="absolute";j.style.left=j.style.top=0;MathJax.Hub.Insert(j,i);if(!i.fillcolor){j.fillcolor="none"}if(!i.strokecolor){j.strokecolor=this.constructor.VMLcolor}if(!i.strokeweight){j.strokeweight=this.constructor.VMLthickness}}});MathJax.Hub.Browser.Select({MSIE:function(g){a.menclose.Augment({HTMLpx:function(i,h){return(i*b.em+(h||0))+"px"}});b.useVML=true;if(!document.namespaces[e]){if(document.documentMode&&document.documentMode>=8){document.namespaces.add(e,f,"#default#VML")}else{document.namespaces.add(e,f);document.createStyleSheet().addRule(e+"\\: *","{behavior: url(#default#VML)}")}}}});MathJax.Hub.Startup.signal.Post("HTML-CSS menclose Ready");MathJax.Ajax.loadComplete(b.autoloadDir+"/menclose.js")});
+
diff --git a/static/MathJax/jax/output/HTML-CSS/autoload/mglyph.js b/static/MathJax/jax/output/HTML-CSS/autoload/mglyph.js
new file mode 100644
index 0000000..a454ade
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/autoload/mglyph.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/autoload/mglyph.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function(){var c="1.1";var a=MathJax.ElementJax.mml,b=MathJax.OutputJax["HTML-CSS"];a.mglyph.Augment({toHTML:function(i,h){var k=i,f=this.getValues("src","width","height","valign","alt"),j;i=this.HTMLcreateSpan(i);if(f.src===""){var g=this.Get("index");if(g){h=this.HTMLgetVariant();var e=h.defaultFont;if(e){e.noStyleChar=true;e.testString=String.fromCharCode(g)+"ABCabc";if(b.Font.testFont(e)){this.HTMLhandleVariant(i,h,String.fromCharCode(g))}else{if(f.alt===""){f.alt="Bad font: "+e.family}j=a.merror(f.alt).With({mathsize:"75%"});this.Append(j);j.toHTML(i);this.data.pop();i.bbox=j.HTMLspanElement().bbox}}}}else{if(!this.img){this.img=a.mglyph.GLYPH[f.src]}if(!this.img){this.img=a.mglyph.GLYPH[f.src]={img:new Image(),status:"pending"};var d=this.img.img;d.onload=MathJax.Callback(["HTMLimgLoaded",this]);d.onerror=MathJax.Callback(["HTMLimgError",this]);d.src=f.src;MathJax.Hub.RestartAfter(d.onload)}if(this.img.status!=="OK"){j=a.merror("Bad mglyph: "+f.src).With({mathsize:"75%"});this.Append(j);j.toHTML(i);this.data.pop();i.bbox=j.HTMLspanElement().bbox}else{d=b.addElement(i,"img",{src:f.src,alt:f.alt,title:f.alt});if(f.width){if(String(f.width).match(/^\s*-?\d+\s*$/)){f.width+="px"}d.style.width=b.Em(b.length2em(f.width,this.img.img.width/b.em))}if(f.height){if(String(f.height).match(/^\s*-?\d+\s*$/)){f.height+="px"}d.style.height=b.Em(b.length2em(f.height,this.img.img.height/b.em))}i.bbox.w=i.bbox.rw=d.offsetWidth/b.em;i.bbox.h=d.offsetHeight/b.em;if(f.valign){if(String(f.valign).match(/^\s*-?\d+\s*$/)){f.valign+="px"}i.bbox.d=-b.length2em(f.valign,this.img.img.height/b.em);d.style.verticalAlign=b.Em(-i.bbox.d);i.bbox.h-=i.bbox.d}}}if(!k.bbox){k.bbox={w:i.bbox.w,h:i.bbox.h,d:i.bbox.d,rw:i.bbox.rw,lw:i.bbox.lw}}else{if(i.bbox){k.bbox.w+=i.bbox.w;if(k.bbox.w>k.bbox.rw){k.bbox.rw=k.bbox.w}if(i.bbox.h>k.bbox.h){k.bbox.h=i.bbox.h}if(i.bbox.d>k.bbox.d){k.bbox.d=i.bbox.d}}}this.HTMLhandleSpace(i);this.HTMLhandleColor(i);return i},HTMLimgLoaded:function(e,d){if(typeof(e)==="string"){d=e}this.img.status=(d||"OK")},HTMLimgError:function(){this.img.img.onload("error")}},{GLYPH:{}});MathJax.Hub.Startup.signal.Post("HTML-CSS mglyph Ready");MathJax.Ajax.loadComplete(b.autoloadDir+"/mglyph.js")});
+
diff --git a/static/MathJax/jax/output/HTML-CSS/autoload/mmultiscripts.js b/static/MathJax/jax/output/HTML-CSS/autoload/mmultiscripts.js
new file mode 100644
index 0000000..04fbd83
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/autoload/mmultiscripts.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/autoload/mmultiscripts.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function(){var c="1.1";var a=MathJax.ElementJax.mml,b=MathJax.OutputJax["HTML-CSS"];a.mmultiscripts.Augment({toHTML:function(H,F,A){H=this.HTMLcreateSpan(H);var M=this.HTMLgetScale();var k=b.createStack(H),f;var j=b.createBox(k);this.HTMLmeasureChild(this.base,j);if(this.data[this.base]){if(A!=null){b.Remeasured(this.data[this.base].HTMLstretchV(j,F,A),j)}else{if(F!=null){b.Remeasured(this.data[this.base].HTMLstretchH(j,F),j)}}}var K=b.TeX.x_height*M,z=b.TeX.scriptspace*M*0.75;var y=this.HTMLgetScripts(k,z);var l=y[0],e=y[1],o=y[2],i=y[3];var g=(this.data[1]||this).HTMLgetScale();var C=b.TeX.sup_drop*g,B=b.TeX.sub_drop*g;var w=j.bbox.h-C,n=j.bbox.d+B,L=0,E;if(j.bbox.ic){L=j.bbox.ic}if(this.data[this.base]&&(this.data[this.base].type==="mi"||this.data[this.base].type==="mo")){if(this.data[this.base].data.join("").length===1&&j.bbox.scale===1&&!this.data[this.base].Get("largeop")){w=n=0}}var G=this.getValues("subscriptshift","superscriptshift");G.subscriptshift=(G.subscriptshift===""?0:b.length2em(G.subscriptshift));G.superscriptshift=(G.superscriptshift===""?0:b.length2em(G.superscriptshift));var m=0;if(o){m=o.bbox.w+L}else{if(i){m=i.bbox.w-L}}if(m<0){m=0}b.placeBox(j,m,0);if(!e&&!i){n=Math.max(n,b.TeX.sub1*M,G.subscriptshift);if(l){n=Math.max(n,l.bbox.h-(4/5)*K)}if(o){n=Math.max(n,o.bbox.h-(4/5)*K)}if(l){b.placeBox(l,m+j.bbox.w+z-L,-n)}if(o){b.placeBox(o,0,-n)}}else{if(!l&&!o){f=this.getValues("displaystyle","texprimestyle");E=b.TeX[(f.displaystyle?"sup1":(f.texprimestyle?"sup3":"sup2"))];w=Math.max(w,E*M,G.superscriptshift);if(e){w=Math.max(w,e.bbox.d+(1/4)*K)}if(i){w=Math.max(w,i.bbox.d+(1/4)*K)}if(e){b.placeBox(e,m+j.bbox.w+z,w)}if(i){b.placeBox(i,0,w)}}else{n=Math.max(n,b.TeX.sub2*M);var x=b.TeX.rule_thickness*M;var I=(l||o).bbox.h,J=(e||i).bbox.d;if(o){I=Math.max(I,o.bbox.h)}if(i){J=Math.max(J,i.bbox.d)}if((w-J)-(I-n)<3*x){n=3*x-w+J+I;C=(4/5)*K-(w-J);if(C>0){w+=C;n-=C}}w=Math.max(w,G.superscriptshift);n=Math.max(n,G.subscriptshift);if(e){b.placeBox(e,m+j.bbox.w+z,w)}if(i){b.placeBox(i,m+L-i.bbox.w,w)}if(l){b.placeBox(l,m+j.bbox.w+z-L,-n)}if(o){b.placeBox(o,m-o.bbox.w,-n)}}}this.HTMLhandleSpace(H);this.HTMLhandleColor(H);return H},HTMLgetScripts:function(p,q){var o,d,e=[];var n=1,g=this.data.length,f=0;for(var h=0;h<4;h+=2){while(n<g&&this.data[n].type!=="mprescripts"){for(var l=h;l<h+2;l++){if(this.data[n]&&this.data[n].type!=="none"){if(!e[l]){e[l]=b.createBox(p);e[l].bbox=this.HTMLemptyBBox({});if(f){b.createBlank(e[l],f);e[l].bbox.w=e[l].bbox.rw=f}}this.data[n].toHTML(e[l]);this.HTMLcombineBBoxes(this.data[n],e[l].bbox)}n++}d=e[h];o=e[h+1];if(d&&o){if(d.bbox.w<o.bbox.w){b.createBlank(d,o.bbox.w-d.bbox.w);d.bbox.w=o.bbox.w;d.bbox.rw=Math.max(d.bbox.w,d.bbox.rw)}else{if(d.bbox.w>o.bbox.w){b.createBlank(o,d.bbox.w-o.bbox.w);o.bbox.w=d.bbox.w;o.bbox.rw=Math.max(o.bbox.w,o.bbox.rw)}}}if(d){f=d.bbox.w}else{if(o){f=o.bbox.w}}}n++;f=0}for(l=0;l<4;l++){if(e[l]){e[l].bbox.w+=q;e[l].bbox.rw=Math.max(e[l].bbox.w,e[l].bbox.rw);this.HTMLcleanBBox(e[l].bbox)}}return e},HTMLstretchH:a.mbase.HTMLstretchH,HTMLstretchV:a.mbase.HTMLstretchV});MathJax.Hub.Startup.signal.Post("HTML-CSS mmultiscripts Ready");MathJax.Ajax.loadComplete(b.autoloadDir+"/mmultiscripts.js")});
+
diff --git a/static/MathJax/jax/output/HTML-CSS/autoload/ms.js b/static/MathJax/jax/output/HTML-CSS/autoload/ms.js
new file mode 100644
index 0000000..f9b40e8
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/autoload/ms.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/autoload/ms.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function(){var c="1.1";var a=MathJax.ElementJax.mml,b=MathJax.OutputJax["HTML-CSS"];a.ms.Augment({toHTML:function(e){e=this.HTMLhandleSize(this.HTMLcreateSpan(e));var d=this.getValues("lquote","rquote");var g=this.data.join("");var f=[];if(d.lquote.length===1){f.push(this.HTMLquoteRegExp(d.lquote))}if(d.rquote.length===1){f.push(this.HTMLquoteRegExp(d.rquote))}if(f.length){g=g.replace(RegExp("("+f.join("|")+")","g"),"\\$1")}this.HTMLhandleVariant(e,this.HTMLgetVariant(),d.lquote+g+d.rquote);this.HTMLhandleSpace(e);this.HTMLhandleColor(e);return e},HTMLquoteRegExp:function(d){return d.replace(/([.*+?|{}()\[\]\\])/g,"\\$1")}});a.ms.prototype.defaults.fontfamily="monospace";MathJax.Hub.Startup.signal.Post("HTML-CSS ms Ready");MathJax.Ajax.loadComplete(b.autoloadDir+"/ms.js")});
+
diff --git a/static/MathJax/jax/output/HTML-CSS/autoload/mtable.js b/static/MathJax/jax/output/HTML-CSS/autoload/mtable.js
new file mode 100644
index 0000000..1514934
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/autoload/mtable.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/autoload/mtable.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function(){var c="1.1";var a=MathJax.ElementJax.mml,b=MathJax.OutputJax["HTML-CSS"];a.mtable.Augment({toHTML:function(X){X=this.HTMLcreateSpan(X);if(this.data.length===0){return X}var aJ=this.getValues("columnalign","rowalign","columnspacing","rowspacing","columnwidth","equalcolumns","equalrows","columnlines","rowlines","frame","framespacing","align","useHeight","width","side","minlabelspacing");var r=aJ.width.match(/%$/);var ag=b.createStack(X);var am=this.HTMLgetScale();var aH=-1;var w=[],I=[],l=[],O=[],K=[],aF,aE,v=-1,aC,t,ay,R;var aL=b.FONTDATA.baselineskip*am*aJ.useHeight,Z=b.FONTDATA.lineH*am,af=b.FONTDATA.lineD*am;for(aF=0,aC=this.data.length;aF<aC;aF++){R=this.data[aF];ay=(R.type==="mlabeledtr"?aH:0);O[aF]=[];w[aF]=I[aF]=0;for(aE=ay,t=R.data.length+ay;aE<t;aE++){if(l[aE]==null){if(aE>v){v=aE}K[aE]=b.createStack(b.createBox(ag));l[aE]=-b.BIGDIMEN}O[aF][aE]=b.createBox(K[aE]);b.Measured(R.data[aE-ay].toHTML(O[aF][aE]),O[aF][aE]);if(R.data[aE-ay].isMultiline){O[aF][aE].style.width="100%"}if(O[aF][aE].bbox.h>w[aF]){w[aF]=O[aF][aE].bbox.h}if(O[aF][aE].bbox.d>I[aF]){I[aF]=O[aF][aE].bbox.d}if(O[aF][aE].bbox.w>l[aE]){l[aE]=O[aF][aE].bbox.w}}}if(w[0]+I[0]){w[0]=Math.max(w[0],Z)}if(w[O.length-1]+I[O.length-1]){I[O.length-1]=Math.max(I[O.length-1],af)}var al=aJ.columnspacing.split(/ /),S=aJ.rowspacing.split(/ /),ah=aJ.columnalign.split(/ /),L=aJ.rowalign.split(/ /),N=aJ.columnlines.split(/ /),k=aJ.rowlines.split(/ /),ap=aJ.columnwidth.split(/ /),au=[];for(aF=0,aC=al.length;aF<aC;aF++){al[aF]=b.length2em(al[aF])}for(aF=0,aC=S.length;aF<aC;aF++){S[aF]=b.length2em(S[aF])}while(al.length<v){al.push(al[al.length-1])}while(ah.length<=v){ah.push(ah[ah.length-1])}while(N.length<v){N.push(N[N.length-1])}while(ap.length<=v){ap.push(ap[ap.length-1])}while(S.length<O.length){S.push(S[S.length-1])}while(L.length<=O.length){L.push(L[L.length-1])}while(k.length<O.length){k.push(k[k.length-1])}if(K[aH]){ah[aH]=(aJ.side.substr(0,1)==="l"?"left":"right");al[aH]=-l[aH]}for(aF=0,aC=O.length;aF<aC;aF++){R=this.data[aF];au[aF]=[];if(R.rowalign){L[aF]=R.rowalign}if(R.columnalign){au[aF]=R.columnalign.split(/ /);while(au[aF].length<=v){au[aF].push(au[aF][au[aF].length-1])}}}var az=w[0]+I[O.length-1];for(aF=0,aC=O.length-1;aF<aC;aF++){az+=Math.max((w[aF]+I[aF]?aL:0),I[aF]+w[aF+1]+S[aF])}var ac=0,aa=0,aA,aI=az;if(aJ.frame!=="none"||(aJ.columnlines+aJ.rowlines).match(/solid|dashed/)){ac=b.length2em(aJ.framespacing.split(/[, ]+/)[0]);aa=b.length2em(aJ.framespacing.split(/[, ]+/)[1]);aI=az+2*aa}var h,ax;if(String(aJ.align).match(/^\d+$/)){h=az/2+b.TeX.axis_height*am-w[0];ax=-(az/2+aa)}else{h=({top:-(w[0]+aa),bottom:az+aa-w[0],center:az/2-w[0],baseline:az/2-w[0],axis:az/2+b.TeX.axis_height*am-w[0]})[aJ.align];ax=({top:-(az+2*aa),bottom:0,center:-(az/2+aa),baseline:-(az/2+aa),axis:b.TeX.axis_height*am-az/2-aa})[aJ.align]}var aq,aw=0,U=0,V=0,aB=0,aG=0,o=[],B=[],ai=1;if(aJ.equalcolumns&&aJ.width!=="auto"){if(r){aq=(100/(v+1)).toFixed(2).replace(/\.?0+$/,"")+"%";for(aF=0,aC=Math.min(v+1,ap.length);aF<aC;aF++){ap[aF]=aq}aq=0;aw=1;aG=v+1;for(aF=0,aC=Math.min(v+1,al.length);aF<aC;aF++){aq+=al[aF]}}else{aq=b.length2em(aJ.width);for(aF=0,aC=Math.min(v+1,al.length);aF<aC;aF++){aq-=al[aF]}aq/=v+1;for(aF=0,aC=Math.min(v+1,ap.length);aF<aC;aF++){l[aF]=aq}}}else{for(aF=0,aC=Math.min(v+1,ap.length);aF<aC;aF++){if(ap[aF]==="auto"){U+=l[aF]}else{if(ap[aF]==="fit"){B[aG]=aF;aG++;U+=l[aF]}else{if(ap[aF].match(/%$/)){o[aB]=aF;aB++;V+=l[aF];aw+=b.length2em(ap[aF],1)}else{l[aF]=b.length2em(ap[aF]);U+=l[aF]}}}}if(r){aq=0;for(aF=0,aC=Math.min(v,al.length);aF<aC;aF++){aq+=al[aF]}if(aw>0.98){ai=0.98/aw;aw=0.98}}else{if(aJ.width==="auto"){if(aw>0.98){ai=V/(U+V);aq=U+V}else{aq=U/(1-aw)}}else{aq=b.length2em(aJ.width);for(aF=0,aC=Math.min(v+1,al.length);aF<aC;aF++){aq-=al[aF]}}for(aF=0,aC=o.length;aF<aC;aF++){l[o[aF]]=b.length2em(ap[o[aF]],aq*ai);U+=l[o[aF]]}if(Math.abs(aq-U)>0.01){if(aG&&aq>U){aq=(aq-U)/aG;for(aF=0,aC=B.length;aF<aC;aF++){l[B[aF]]+=aq}}else{aq=aq/U;for(aE=0;aE<=v;aE++){l[aE]*=aq}}}if(aJ.equalcolumns){var ad=Math.max.apply(Math,l);for(aE=0;aE<=v;aE++){l[aE]=ad}}}}if(aJ.equalrows){var T=Math.max.apply(Math,w),ao=Math.max.apply(Math,I);for(aF=0,aC=O.length;aF<aC;aF++){ay=((T+ao)-(w[aF]+I[aF]))/2;w[aF]+=ay;I[aF]+=ay}}var ar=h,n,u,aD;ay=(K[aH]?aH:0);for(aE=ay;aE<=v;aE++){for(aF=0,aC=O.length;aF<aC;aF++){if(O[aF][aE]){ay=(this.data[aF].type==="mlabeledtr"?aH:0);var ak=this.data[aF].data[aE-ay];if(ak.HTMLcanStretch("Horizontal")){O[aF][aE].bbox=ak.HTMLstretchH(K[aE],l[aE]).bbox}else{if(ak.HTMLcanStretch("Vertical")){var z=ak.CoreMO();var ab=z.symmetric;z.symmetric=false;O[aF][aE].bbox=ak.HTMLstretchV(K[aE],w[aF],I[aF]).bbox;z.symmetric=ab}}aD=ak.rowalign||this.data[aF].rowalign||L[aF];n=({top:w[aF]-O[aF][aE].bbox.h,bottom:O[aF][aE].bbox.d-I[aF],center:((w[aF]-I[aF])-(O[aF][aE].bbox.h-O[aF][aE].bbox.d))/2,baseline:0,axis:0})[aD];aD=(ak.columnalign||au[aF][aE]||ah[aE]);b.alignBox(O[aF][aE],aD,ar+n)}if(aF<O.length-1){ar-=Math.max((w[aF]+I[aF]?aL:0),I[aF]+w[aF+1]+S[aF])}}ar=h}if(r){var q=b.createBox(ag);q.style.left=q.style.top=0;q.style.right=b.Em(aq+2*ac);q.style.display="inline-block";q.style.height="0px";if(b.msieRelativeWidthBug){q=b.createBox(q);q.style.position="relative";q.style.height="1em";q.style.width="100%";q.bbox=ag.bbox}var an=0,av=ac,aK,g;if(aG){aK=100*(1-aw)/aG,g=U/aG}else{aK=100*(1-aw)/(v+1);g=U/(v+1)}for(aE=0;aE<=v;aE++){b.placeBox(K[aE].parentNode,0,0);K[aE].style.position="relative";K[aE].style.left=b.Em(av);K[aE].style.width="100%";K[aE].parentNode.parentNode.removeChild(K[aE].parentNode);var e=b.createBox(q);b.addBox(e,K[aE]);K[aE]=e;var ae=e.style;ae.display="inline-block";ae.left=an+"%";if(ap[aE].match(/%$/)){var G=parseFloat(ap[aE])*ai;if(aG===0){ae.width=(aK+G)+"%";an+=aK+G;e=b.createBox(e);b.addBox(e,K[aE].firstChild);e.style.left=0;e.style.right=b.Em(g);av-=g}else{ae.width=G+"%";an+=G}}else{if(ap[aE]==="fit"||aG===0){ae.width=aK+"%";e=b.createBox(e);b.addBox(e,K[aE].firstChild);e.style.left=0;e.style.right=b.Em(g-l[aE]);av+=l[aE]-g;an+=aK}else{ae.width=b.Em(l[aE]);av+=l[aE]}}if(b.msieRelativeWidthBug){b.addText(e.firstChild,b.NBSP);e.firstChild.style.position="relative"}av+=al[aE];if(N[aE]!=="none"&&aE<v&&aE!==aH){u=b.createBox(q);u.style.left=an+"%";u=b.createRule(u,aI,0,1.25/b.em);u.style.position="absolute";u.bbox={h:aI,d:0,w:0,rw:1.25/b.em,lw:0};u.parentNode.bbox=ag.bbox;b.placeBox(u,av-al[aE]/2,ax,true);u.style.borderStyle=N[aE]}}}else{var at=ac;for(aE=0;aE<=v;aE++){if(!K[aE].bbox.width){b.setStackWidth(K[aE],l[aE])}if(ap[aE]!=="auto"&&ap[aE]!=="fit"){K[aE].bbox.width=l[aE];K[aE].bbox.isFixed=true}b.placeBox(K[aE].parentNode,at,0);at+=l[aE]+al[aE];if(N[aE]!=="none"&&aE<v&&aE!==aH){u=b.createRule(ag,aI,0,1.25/b.em);b.addBox(ag,u);u.bbox={h:aI,d:0,w:0,rw:1.25/b.em,lw:0};b.placeBox(u,at-al[aE]/2,ax,true);u.style.borderStyle=N[aE]}}}aA=ag.bbox.w+ac;var d;if(aJ.frame!=="none"){d=b.createFrame(ag,aI,0,aA,1.25/b.em,aJ.frame);b.addBox(ag,d);b.placeBox(d,0,ax,true);if(r){d.style.width="100%"}}ar=h;for(aF=0,aC=O.length-1;aF<aC;aF++){n=Math.max(aL,I[aF]+w[aF+1]+S[aF]);if(k[aF]!=="none"){u=b.createRule(ag,1.25/b.em,0,aA);b.addBox(ag,u);u.bbox={h:1.25/b.em,d:0,w:aA,rw:aA,lw:0};b.placeBox(u,0,ar-I[aF]-(n-I[aF]-w[aF+1])/2,true);if(k[aF]==="dashed"||r){u.style.borderTop=u.style.height+" "+k[aF];u.style.height=0;u.style.width=u.style.borderLeftWidth;u.style.borderLeft="";if(r){u.style.width="100%"}}}ar-=n}if(r){X.bbox.width=aJ.width;ag.style.width="100%"}if(K[aH]){var Q=this.getValues("indentalignfirst","indentshiftfirst","indentalign","indentshift");if(Q.indentalignfirst!==a.INDENTALIGN.INDENTALIGN){Q.indentalign=Q.indentalignfirst}if(Q.indentalign===a.INDENTALIGN.AUTO){Q.indentalign=this.displayAlign}if(Q.indentshiftfirst!==a.INDENTSHIFT.INDENTSHIFT){Q.indentshift=Q.indentshiftfirst}if(Q.indentshift==="auto"){Q.indentshift=this.displayIndent}var E=b.createStack(X,false,"100%");b.addBox(E,ag);b.alignBox(ag,Q.indentalign,0);if(Q.indentshift&&Q.indentalign!==a.INDENTALIGN.CENTER){ag.style[{left:"Left",right:"Right"}[Q.indentalign]]=b.Em(b.length2em(Q.indentshift))}K[aH].parentNode.parentNode.removeChild(K[aH].parentNode);b.addBox(E,K[aH]);b.alignBox(K[aH],ah[aH],0);if(b.msieRelativeWidthBug){ag.style.top=K[aH].style.top=""}if(r){ag.style.width=aJ.width;X.bbox.width="100%"}K[aH].style.marginRight=K[aH].style.marginLeft=b.Em(b.length2em(aJ.minlabelspacing))}if(!r){this.HTMLhandleSpace(X)}var aj=this.HTMLhandleColor(X);if(aj&&r){if(!d){d=b.createFrame(ag,aI,0,aA,0,"none");b.addBox(ag,d);b.placeBox(d,0,ax,true);d.style.width="100%"}d.style.backgroundColor=aj.style.backgroundColor;d.parentNode.insertBefore(d,d.parentNode.firstChild);aj.parentNode.removeChild(aj)}return X},HTMLhandleSpace:function(d){d.style.paddingLeft=d.style.paddingRight=".1667em"}});a.mtd.Augment({toHTML:function(e,d,g){e=this.HTMLcreateSpan(e);if(this.data[0]){var f=b.Measured(this.data[0].toHTML(e),e);if(g!=null){b.Remeasured(this.data[0].HTMLstretchV(e,d,g),e)}else{if(d!=null){b.Remeasured(this.data[0].HTMLstretchH(e,d),e)}}e.bbox=f.bbox}this.HTMLhandleSpace(e);this.HTMLhandleColor(e);return e},HTMLstretchH:a.mbase.HTMLstretchH,HTMLstretchV:a.mbase.HTMLstretchV});MathJax.Hub.Startup.signal.Post("HTML-CSS mtable Ready");MathJax.Ajax.loadComplete(b.autoloadDir+"/mtable.js")});
+
diff --git a/static/MathJax/jax/output/HTML-CSS/autoload/multiline.js b/static/MathJax/jax/output/HTML-CSS/autoload/multiline.js
new file mode 100644
index 0000000..7ffcfd9
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/autoload/multiline.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/autoload/multiline.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function(){var c="1.1";var a=MathJax.ElementJax.mml,b=MathJax.OutputJax["HTML-CSS"];a.mbase.Augment({toHTMLmultiline:function(u,r){u=this.HTMLcreateSpan(u);if(!this.type!=="mrow"){u=this.HTMLhandleSize(u)}var g=b.createStack(u);var o=[],f=[],p=-b.BIGDIMEN,q=-b.BIGDIMEN,v,t,s,k;for(t=0,k=r.length-1;t<k;t++){o[t]=b.createBox(g);for(v=r[t][0],s=r[t+1][0];v<s;v++){if(this.data[v]){this.data[v].toHTML(o[t])}}if(this.data[r[t][0]]){this.data[r[t][0]].HTMLspanElement().style.paddingLeft=""}if(this.data[r[t][s-1]]){this.data[r[t][s-1]].HTMLspanElement().style.paddingRight=""}f[t]=this.HTMLcomputeBBox(o[t],null,r[t][0],r[t+1][0]);if(o[t].bbox.h>p){p=o[t].bbox.h}if(o[t].bbox.d>q){q=o[t].bbox.d}}var n=0,x=this.HTMLgetScale(),e=b.FONTDATA.baselineskip*x;var l=this,h;while(l.inferred||(l.parent&&l.parent.type==="mrow"&&l.parent.data.length===1)){l=l.parent}var w=(l.type==="math"||l.type==="mtd");l.isMultiline=true;for(t=0,k=r.length-1;t<k;t++){for(v=0,s=f[t].length;v<s;v++){f[t][v].HTMLstretchV(o[t],p,q)}if(f[t].length){this.HTMLcomputeBBox(o[t],true,r[t][0],r[t+1][0])}var d=r[t][1].getValues("indentalign","indentshift");d.lineleading=b.length2em(r[t+1][1].Get("lineleading"),0.5);if(t===0){h=r[t+1][1].getValues("indentalignfirst","indentshiftfirst");d.ALIGN=h.indentalignfirst;d.SHIFT=h.indentshiftfirst}else{if(t===k-1){h=r[t][1].getValues("indentalignlast","indentshiftlast");d.ALIGN=h.indentalignlast;d.SHIFT=h.indentshiftlast}}if(d.ALIGN&&d.ALIGN!==a.INDENTALIGN.INDENTALIGN){d.indentalign=d.ALIGN}if(d.SHIFT&&d.SHIFT!==a.INDENTSHIFT.INDENTSHIFT){d.indentshift=d.SHIFT}if(d.indentalign==a.INDENTALIGN.AUTO){d.indentalign=(w?this.displayAlign:a.INDENTALIGN.LEFT)}if(d.indentshift==="auto"||d.indentshift===""){d.indentshift=(w?this.displayIndent:"0")}d.indentshift=b.length2em(d.indentshift,0);if(d.indentshift&&d.indentalign!==a.INDENTALIGN.CENTER){b.createBlank(o[t],d.indentshift,(d.indentalign!==a.INDENTALIGN.RIGHT));o[t].bbox.w+=d.indentshift;o[t].bbox.rw+=d.indentshift}b.alignBox(o[t],d.indentalign,n);if(t<k-1){n-=Math.max(e,o[t].bbox.d+o[t+1].bbox.h+d.lineleading)}}if(w){g.style.width="100%";if(l.type==="math"){u.bbox.width="100%"}}this.HTMLhandleSpace(u);this.HTMLhandleColor(u);u.bbox.isMultiline=true;return u}});MathJax.Hub.Startup.signal.Post("HTML-CSS multiline Ready");MathJax.Ajax.loadComplete(b.autoloadDir+"/multiline.js")});
+
diff --git a/static/MathJax/jax/output/HTML-CSS/config.js b/static/MathJax/jax/output/HTML-CSS/config.js
new file mode 100644
index 0000000..d4fd7d7
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/config.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/config.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"]=MathJax.OutputJax({id:"HTML-CSS",version:"1.1.5",directory:MathJax.OutputJax.directory+"/HTML-CSS",extensionDir:MathJax.OutputJax.extensionDir+"/HTML-CSS",autoloadDir:MathJax.OutputJax.directory+"/HTML-CSS/autoload",fontDir:MathJax.OutputJax.directory+"/HTML-CSS/fonts",webfontDir:MathJax.OutputJax.fontDir+"/HTML-CSS",config:{scale:100,minScaleAdjust:50,availableFonts:["STIX","TeX"],preferredFont:"TeX",webFont:"TeX",imageFont:"TeX",undefinedFamily:"STIXGeneral,'Arial Unicode MS',serif",showMathMenu:true,styles:{".MathJax_Display":{"text-align":"center",margin:"1em 0em"},".MathJax .merror":{"background-color":"#FFFF88",color:"#CC0000",border:"1px solid #CC0000",padding:"1px 3px","font-family":"serif","font-style":"normal","font-size":"90%"},".MathJax_Preview":{color:"#888888"},"#MathJax_Tooltip":{"background-color":"InfoBackground",color:"InfoText",border:"1px solid black","box-shadow":"2px 2px 5px #AAAAAA","-webkit-box-shadow":"2px 2px 5px #AAAAAA","-moz-box-shadow":"2px 2px 5px #AAAAAA","-khtml-box-shadow":"2px 2px 5px #AAAAAA",filter:"progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color='gray', Positive='true')",padding:"3px 4px"}}}});if(MathJax.Hub.Browser.isMSIE&&document.documentMode>=9){delete MathJax.OutputJax["HTML-CSS"].config.styles["#MathJax_Tooltip"].filter}if(!MathJax.Hub.config.delayJaxRegistration){MathJax.OutputJax["HTML-CSS"].Register("jax/mml")}MathJax.Hub.Register.StartupHook("End Config",[function(b,c){var a=b.Insert({minBrowserVersion:{Firefox:3,Opera:9.52,MSIE:6,Chrome:0.3,Safari:2,Konqueror:4},inlineMathDelimiters:["$","$"],displayMathDelimiters:["$$","$$"],multilineDisplay:true,minBrowserTranslate:function(f){var e=b.getJaxFor(f),k=["[Math]"],j;var h=document.createElement("span",{className:"MathJax_Preview"});if(e.inputJax.id==="TeX"){if(e.root.Get("displaystyle")){j=a.displayMathDelimiters;k=[j[0]+e.originalText+j[1]];if(a.multilineDisplay){k=k[0].split(/\n/)}}else{j=a.inlineMathDelimiters;k=[j[0]+e.originalText.replace(/^\s+/,"").replace(/\s+$/,"")+j[1]]}}for(var g=0,d=k.length;g<d;g++){h.appendChild(document.createTextNode(k[g]));if(g<d-1){h.appendChild(document.createElement("br"))}}f.parentNode.insertBefore(h,f)}},(b.config["HTML-CSS"]||{}));if(b.Browser.version!=="0.0"&&!b.Browser.versionAtLeast(a.minBrowserVersion[b.Browser]||0)){c.Translate=a.minBrowserTranslate;b.Config({showProcessingMessages:false});MathJax.Message.Set("Your browser does not support MathJax",null,4000);b.Startup.signal.Post("MathJax not supported")}},MathJax.Hub,MathJax.OutputJax["HTML-CSS"]]);MathJax.OutputJax["HTML-CSS"].loadComplete("config.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/AlphaPresentForms.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/AlphaPresentForms.js
new file mode 100644
index 0000000..f320f83
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/AlphaPresentForms.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/AlphaPresentForms.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{64256:[691,0,610,15,666],64257:[691,0,556,14,536],64258:[691,0,556,15,535],64259:[691,0,833,15,813],64260:[691,0,833,15,812]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/AlphaPresentForms.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Arrows.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Arrows.js
new file mode 100644
index 0000000..b1a3a33
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Arrows.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Arrows.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{8592:[451,-55,977,68,909],8593:[676,170,584,94,490],8594:[451,-55,977,68,909],8595:[676,170,584,94,490],8596:[451,-55,977,30,948],8597:[736,230,584,94,490],8598:[676,170,977,68,911],8599:[676,170,977,68,911],8600:[676,170,977,68,911],8601:[676,170,977,68,911],8602:[451,-55,977,68,909],8603:[451,-55,977,68,909],8604:[462,-72,956,66,890],8605:[462,-72,956,66,890],8606:[451,-55,977,68,909],8607:[676,165,568,86,482],8608:[451,-55,977,68,909],8609:[676,165,568,86,482],8610:[451,-55,977,68,909],8611:[451,-55,977,68,909],8612:[451,-55,977,68,909],8613:[676,165,584,94,490],8614:[451,-55,977,68,909],8615:[676,165,584,94,490],8616:[732,196,584,94,490],8617:[539,-55,966,66,900],8618:[539,-55,966,66,900],8619:[540,6,966,66,900],8620:[540,6,966,66,900],8621:[451,-55,1297,55,1242],8622:[451,-55,977,30,948],8623:[683,154,562,68,494],8624:[686,170,584,45,503],8625:[686,170,584,81,539],8626:[686,170,584,45,503],8627:[686,170,584,81,539],8628:[686,162,960,66,894],8629:[686,171,960,56,904],8630:[524,0,971,66,905],8631:[524,0,971,66,905],8632:[768,170,977,68,911],8633:[618,114,977,68,909],8634:[693,127,974,105,869],8635:[693,127,974,105,869],8636:[501,-209,977,66,910],8637:[297,-5,977,65,909],8638:[694,162,552,239,481],8639:[694,162,352,71,313],8640:[501,-209,977,66,910],8641:[297,-5,977,66,910],8642:[694,162,552,239,481],8643:[694,162,552,71,313],8644:[618,114,977,68,909],8645:[676,165,864,66,798],8646:[618,114,977,68,909],8647:[618,114,977,68,909],8648:[676,165,864,66,798],8649:[618,114,977,68,909],8650:[676,165,864,66,798],8651:[571,21,977,66,910],8652:[571,21,977,66,910],8653:[570,64,977,68,909],8654:[570,64,1240,50,1190],8655:[570,64,977,68,909],8656:[570,64,977,68,909],8657:[676,170,714,40,674],8658:[570,64,977,68,909],8659:[676,170,714,40,674],8660:[570,64,1240,50,1190],8661:[736,230,714,40,674],8662:[662,156,926,54,872],8663:[662,156,926,54,872],8664:[662,156,926,54,872],8665:[662,156,926,54,872],8668:[451,-55,977,62,914],8669:[451,-55,977,62,914],8678:[551,45,926,60,866],8679:[662,156,685,45,641],8680:[551,45,926,60,866],8681:[662,156,685,45,641],8682:[705,201,685,45,641],8693:[676,165,864,66,798]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/Arrows.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/BoldFraktur.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/BoldFraktur.js
new file mode 100644
index 0000000..65c406d
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/BoldFraktur.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/BoldFraktur.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{120172:[701,25,856,50,805],120173:[701,19,849,50,794],120174:[701,19,773,54,731],120175:[701,19,891,54,836],120176:[701,19,788,54,731],120177:[701,205,803,54,748],120178:[701,19,833,54,781],120179:[701,205,843,42,795],120180:[701,25,790,54,735],120181:[701,205,803,54,748],120182:[701,25,864,42,814],120183:[701,25,699,51,645],120184:[701,25,1133,50,1081],120185:[701,25,862,50,810],120186:[701,19,909,54,854],120187:[701,205,850,50,795],120188:[701,59,930,54,902],120189:[701,25,884,50,841],120190:[701,19,852,54,802],120191:[701,25,793,54,740],120192:[701,25,860,54,809],120193:[701,19,855,50,800],120194:[701,19,1121,50,1066],120195:[701,25,819,50,775],120196:[701,205,837,50,782],120197:[701,195,755,44,703],120198:[475,24,600,55,545],120199:[695,24,559,45,504],120200:[475,24,464,55,412],120201:[694,25,557,48,502],120202:[475,24,476,55,427],120203:[700,214,370,33,352],120204:[475,219,566,55,506],120205:[695,219,576,45,516],120206:[697,24,429,35,379],120207:[697,219,389,40,337],120208:[695,24,456,48,402],120209:[695,24,433,45,379],120210:[475,24,984,40,932],120211:[475,24,696,40,644],120212:[475,24,554,45,499],120213:[593,219,640,36,585],120214:[475,219,574,55,522],120215:[475,24,525,40,493],120216:[643,31,557,52,505],120217:[656,23,438,45,378],120218:[475,24,681,35,629],120219:[593,24,573,55,526],120220:[593,24,850,55,795],120221:[475,209,521,50,489],120222:[593,219,596,55,536],120223:[475,219,484,36,437]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/BoldFraktur.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/BoxDrawing.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/BoxDrawing.js
new file mode 100644
index 0000000..1862e77
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/BoxDrawing.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/BoxDrawing.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{9472:[340,-267,708,-11,719],9474:[910,303,696,312,385],9484:[340,303,708,318,720],9488:[340,303,708,-11,390],9492:[910,-267,708,318,720],9496:[910,-267,708,-11,390],9500:[910,303,708,318,720],9508:[910,303,708,-11,390],9516:[340,303,708,-11,719],9524:[910,-267,708,-11,719],9532:[910,303,708,-11,719],9552:[433,-174,708,-11,719],9553:[910,303,708,225,484],9554:[433,303,708,318,720],9555:[340,303,708,225,720],9556:[433,303,708,225,719],9557:[433,303,708,-11,390],9558:[340,303,708,-11,483],9559:[433,303,708,-11,483],9560:[910,-174,708,318,720],9561:[910,-267,708,225,720],9562:[910,-174,708,225,719],9563:[910,-174,708,-11,390],9564:[910,-267,708,-11,483],9565:[910,-174,708,-11,483],9566:[910,303,708,318,720],9567:[910,303,708,225,720],9568:[910,303,708,225,720],9569:[910,303,708,-11,390],9570:[910,303,708,-11,483],9571:[910,303,708,-11,483],9572:[433,303,708,-11,719],9573:[340,303,708,-11,719],9574:[433,303,708,-11,719],9575:[910,-174,708,-11,719],9576:[910,-267,708,-11,719],9577:[910,-174,708,-11,719],9578:[910,303,708,-11,719],9579:[910,303,708,-11,719],9580:[910,303,708,-11,719]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/BoxDrawing.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/CombDiacritMarks.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/CombDiacritMarks.js
new file mode 100644
index 0000000..aa760d6
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/CombDiacritMarks.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/CombDiacritMarks.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{768:[713,-528,0,-369,-131],769:[713,-528,0,-369,-131],770:[704,-528,0,-418,-81],771:[674,-547,0,-432,-67],772:[637,-565,0,-415,-85],773:[838,-788,0,-500,0],774:[691,-528,0,-401,-98],775:[666,-537,0,-314,-185],776:[666,-537,0,-419,-80],777:[751,-491,0,-336,-131],778:[750,-537,0,-356,-143],779:[713,-528,0,-469,-31],780:[704,-528,0,-418,-81],781:[730,-530,0,-277,-211],782:[730,-530,0,-358,-142],783:[713,-528,0,-469,-31],784:[828,-528,0,-401,-98],785:[691,-528,0,-401,-98],786:[867,-532,0,-342,-158],787:[867,-532,0,-342,-158],788:[867,-532,0,-342,-158],789:[867,-532,0,-116,68],790:[-70,255,0,-369,-131],791:[-70,255,0,-369,-131],792:[-58,288,0,-425,-223],793:[-58,288,0,-288,-86],794:[752,-531,0,-410,-93],795:[505,-352,0,-62,66],796:[-33,313,0,-375,-190],797:[-70,272,0,-365,-135],798:[-70,272,0,-365,-135],799:[-70,287,0,-356,-144],800:[-140,206,0,-356,-144],801:[75,287,0,-241,-22],802:[75,287,0,-94,125],803:[-109,238,0,-314,-185],804:[-109,238,0,-419,-80],805:[-66,279,0,-356,-143],806:[-88,423,0,-342,-158],807:[0,218,0,-363,-137],808:[44,173,0,-364,-135],809:[-107,239,0,-277,-222],810:[-86,260,0,-425,-93],811:[-104,242,0,-420,-95],812:[-83,259,0,-418,-81],813:[-85,261,0,-418,-81],814:[-78,241,0,-401,-98],815:[-78,241,0,-401,-98],816:[-108,235,0,-432,-67],817:[-137,209,0,-415,-85],818:[-137,187,0,-500,0],819:[-137,287,0,-500,0],820:[316,-189,0,-432,-67],821:[282,-224,0,-414,-108],822:[282,-224,0,-510,-10],823:[580,74,0,-410,-43],824:[662,156,0,-410,31],825:[-33,313,0,-375,-190],826:[-71,245,0,-425,-93],827:[-70,264,0,-353,-167],828:[-89,234,0,-410,-109],829:[719,-520,0,-350,-150],830:[881,-516,0,-314,-187],831:[938,-788,0,-500,0],838:[717,-544,0,-410,-107],844:[837,-547,0,-446,-81],857:[-66,368,0,-359,-89],860:[-79,242,0,-401,300],864:[674,-529,0,-432,398],865:[691,-534,0,-403,265],866:[-54,293,0,-432,377]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/CombDiacritMarks.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/CombDiactForSymbols.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/CombDiactForSymbols.js
new file mode 100644
index 0000000..ea3684d
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/CombDiactForSymbols.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/CombDiactForSymbols.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{8400:[846,-637,0,-470,14],8401:[846,-637,0,-470,14],8402:[662,156,0,-298,-223],8406:[846,-508,0,-500,-16],8407:[846,-508,0,-470,14],8411:[666,-537,0,-512,37],8412:[666,-537,0,-627,132],8413:[760,254,0,-753,256],8417:[846,-508,0,-515,79],8420:[1055,169,0,-998,519],8421:[662,155,0,-470,12],8422:[662,156,0,-390,-111],8423:[760,172,0,-643,200],8424:[-109,238,0,-512,37],8425:[717,-544,0,-510,54],8426:[441,-65,0,-688,148],8427:[775,235,0,-505,208],8428:[-166,375,0,-470,14],8429:[-166,375,0,-470,14],8430:[-35,373,0,-490,-6],8431:[-35,373,0,-470,14],8432:[845,-543,0,-385,-115]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/CombDiactForSymbols.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/ControlPictures.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/ControlPictures.js
new file mode 100644
index 0000000..02953b9
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/ControlPictures.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/ControlPictures.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{9251:[31,120,500,40,460]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/ControlPictures.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/CurrencySymbols.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/CurrencySymbols.js
new file mode 100644
index 0000000..49e3601
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/CurrencySymbols.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/CurrencySymbols.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{8355:[676,0,611,11,583],8356:[684,16,500,21,477],8359:[676,14,1369,16,1341],8364:[672,12,500,29,478]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/CurrencySymbols.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Cyrillic.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Cyrillic.js
new file mode 100644
index 0000000..3cafff3
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Cyrillic.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Cyrillic.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{1025:[916,0,667,16,641],1026:[676,97,856,40,809],1027:[963,0,632,20,600],1028:[691,19,685,37,638],1029:[692,19,556,35,513],1030:[676,0,389,20,370],1031:[916,0,389,20,370],1032:[676,96,500,3,478],1033:[676,18,1005,10,958],1034:[676,0,1054,21,1007],1035:[676,0,883,40,868],1036:[923,0,759,21,741],1038:[926,22,722,15,699],1039:[676,176,770,21,753],1040:[690,0,722,9,689],1041:[676,0,667,16,619],1042:[676,0,667,16,619],1043:[676,0,632,20,600],1044:[676,176,715,24,691],1045:[676,0,667,16,641],1046:[684,0,1130,32,1091],1047:[691,19,570,22,531],1048:[676,0,778,21,759],1049:[926,0,778,21,759],1050:[684,0,759,21,741],1051:[676,18,738,10,719],1052:[676,0,944,14,921],1053:[676,0,778,21,759],1054:[691,19,778,35,743],1055:[676,0,762,13,751],1056:[676,0,611,16,600],1057:[691,19,709,36,674],1058:[676,0,667,31,636],1059:[676,22,722,15,699],1060:[676,0,850,25,825],1061:[676,0,722,16,699],1062:[676,176,770,21,753],1063:[676,0,732,7,710],1064:[676,0,1020,21,1001],1065:[676,176,1020,21,1001],1066:[676,0,805,41,757],1067:[676,0,1004,16,985],1068:[676,0,672,19,624],1069:[691,19,685,37,648],1070:[691,19,955,21,920],1071:[676,0,736,12,687],1072:[473,14,517,42,505],1073:[691,14,500,25,476],1074:[461,0,492,21,475],1075:[461,0,451,21,434],1076:[461,143,541,19,524],1077:[473,14,444,25,427],1078:[467,0,762,14,748],1079:[473,17,446,25,420],1080:[461,0,556,21,543],1081:[691,0,556,21,543],1082:[467,0,556,22,543],1083:[461,11,546,11,529],1084:[461,0,657,20,640],1085:[461,0,560,21,543],1086:[473,14,500,25,476],1087:[461,0,556,21,543],1088:[473,205,556,19,524],1089:[473,14,444,25,430],1090:[461,0,509,18,493],1091:[461,205,520,16,502],1092:[676,205,726,31,693],1093:[461,0,500,12,484],1094:[461,143,556,21,543],1095:[461,0,559,20,542],1096:[461,0,841,21,824],1097:[461,143,841,21,824],1098:[461,0,607,15,592],1099:[461,0,759,22,741],1100:[461,0,498,21,483],1101:[473,14,453,24,429],1102:[473,14,785,21,761],1103:[461,0,526,11,509],1105:[666,14,444,25,427],1106:[676,205,556,15,485],1107:[713,0,451,21,434],1108:[473,14,453,24,429],1109:[473,14,389,25,361],1110:[691,0,278,15,256],1111:[666,0,278,-30,309],1112:[691,203,333,-57,263],1113:[461,11,760,11,745],1114:[461,0,775,21,760],1115:[676,0,556,15,534],1116:[713,0,556,22,543],1118:[691,205,500,16,502],1119:[461,143,556,21,543],1122:[676,0,793,31,745],1123:[676,0,602,15,587],1130:[676,0,1123,30,1088],1131:[461,0,762,14,748],1138:[691,19,778,35,743],1139:[473,14,500,25,476],1140:[691,18,793,16,778],1141:[470,14,559,21,550],1168:[833,0,626,14,594],1169:[602,0,451,21,434]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/Cyrillic.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/EnclosedAlphanum.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/EnclosedAlphanum.js
new file mode 100644
index 0000000..d7aaa35
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/EnclosedAlphanum.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/EnclosedAlphanum.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{9312:[690,19,695,0,695],9313:[690,19,695,0,695],9314:[690,19,695,0,695],9315:[690,19,695,0,695],9316:[690,19,695,0,695],9317:[690,19,695,0,695],9318:[690,19,695,0,695],9319:[690,19,695,0,695],9320:[690,19,695,0,695],9398:[690,19,695,0,695],9399:[690,19,695,0,695],9400:[690,19,695,0,695],9401:[690,19,695,0,695],9402:[690,19,695,0,695],9403:[690,19,695,0,695],9404:[690,19,695,0,695],9405:[690,19,695,0,695],9406:[690,19,695,0,695],9407:[690,19,695,0,695],9408:[690,19,695,0,695],9409:[690,19,695,0,695],9410:[690,19,695,0,695],9411:[690,19,695,0,695],9412:[690,19,695,0,695],9413:[690,19,695,0,695],9414:[690,19,695,0,695],9415:[690,19,695,0,695],9416:[690,19,695,0,695],9417:[690,19,695,0,695],9418:[690,19,695,0,695],9419:[690,19,695,0,695],9420:[690,19,695,0,695],9421:[690,19,695,0,695],9422:[690,19,695,0,695],9423:[690,19,695,0,695],9424:[690,19,695,0,695],9425:[690,19,695,0,695],9426:[690,19,695,0,695],9427:[690,19,695,0,695],9428:[690,19,695,0,695],9429:[690,19,695,0,695],9430:[690,19,695,0,695],9431:[690,19,695,0,695],9432:[690,19,695,0,695],9433:[690,19,695,0,695],9434:[690,19,695,0,695],9435:[690,19,695,0,695],9436:[690,19,695,0,695],9437:[690,19,695,0,695],9438:[690,19,695,0,695],9439:[690,19,695,0,695],9440:[690,19,695,0,695],9441:[690,19,695,0,695],9442:[690,19,695,0,695],9443:[690,19,695,0,695],9444:[690,19,695,0,695],9445:[690,19,695,0,695],9446:[690,19,695,0,695],9447:[690,19,695,0,695],9448:[690,19,695,0,695],9449:[690,19,695,0,695],9450:[690,19,695,0,695]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/EnclosedAlphanum.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GeneralPunctuation.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GeneralPunctuation.js
new file mode 100644
index 0000000..1747ad3
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GeneralPunctuation.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GeneralPunctuation.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{8208:[287,-171,333,44,287],8209:[287,-171,333,44,287],8210:[287,-171,500,0,500],8211:[271,-181,500,0,500],8212:[271,-181,1000,0,1000],8213:[271,-181,2000,0,2000],8215:[-137,287,520,10,510],8216:[691,-356,333,70,254],8217:[691,-356,333,79,263],8218:[155,180,333,79,263],8219:[691,-356,333,79,263],8220:[691,-356,500,32,486],8221:[691,-356,500,14,468],8222:[155,180,500,14,468],8223:[691,-356,500,14,468],8224:[691,134,500,47,453],8225:[691,132,500,45,456],8226:[462,-42,560,70,490],8229:[156,13,666,82,584],8230:[156,13,1000,82,917],8240:[706,29,1110,61,1049],8241:[706,29,1472,61,1411],8242:[713,-438,310,75,235],8243:[713,-438,467,75,392],8244:[713,-438,625,75,550],8245:[713,-438,310,75,235],8246:[713,-438,467,75,392],8247:[713,-438,625,75,550],8248:[117,170,584,91,497],8249:[415,-36,333,51,305],8250:[415,-36,333,28,282],8252:[691,13,625,81,544],8254:[838,-766,500,0,500],8256:[725,-508,798,79,733],8260:[688,12,183,-168,345],8263:[689,13,947,57,892],8270:[236,200,500,56,448],8271:[472,180,333,67,251],8273:[706,200,500,56,448],8279:[713,-438,783,75,708]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/GeneralPunctuation.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GeometricShapes.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GeometricShapes.js
new file mode 100644
index 0000000..49f53fd
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GeometricShapes.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GeometricShapes.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{9651:[811,127,1145,35,1110],9655:[791,284,1043,70,1008],9661:[811,127,1145,35,1110],9665:[791,284,1043,35,973],9674:[795,289,790,45,745],9708:[811,127,1145,35,1110]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/GeometricShapes.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GreekAndCoptic.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GreekAndCoptic.js
new file mode 100644
index 0000000..1ae497f
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GreekAndCoptic.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GreekAndCoptic.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{894:[472,180,333,82,266],900:[692,-528,300,118,263],901:[692,-528,390,-2,392],902:[700,0,722,9,689],903:[472,-303,333,82,251],904:[700,0,800,10,791],905:[700,0,920,10,904],906:[700,0,530,10,516],908:[700,19,778,10,743],910:[700,0,860,10,846],911:[700,0,780,10,761],912:[692,14,390,-2,392],913:[690,0,722,9,689],914:[676,0,667,16,619],917:[676,0,667,16,641],918:[676,0,667,28,634],919:[676,0,778,21,759],921:[676,0,389,20,370],922:[676,0,778,30,769],924:[676,0,944,14,921],925:[676,18,722,16,701],927:[691,19,778,35,743],929:[676,0,611,16,600],932:[676,0,667,31,636],935:[676,0,722,16,699],938:[915,0,389,20,370],939:[915,0,703,7,693],940:[692,14,644,25,618],941:[692,14,444,28,429],942:[692,205,585,12,545],943:[692,14,326,15,304],944:[692,14,576,12,551],945:[473,14,644,25,618],946:[692,205,556,45,524],947:[473,205,518,12,501],948:[692,14,502,26,477],949:[473,14,444,28,429],950:[692,205,459,23,437],951:[473,205,585,12,545],952:[692,14,501,25,476],953:[461,14,326,15,304],954:[473,0,581,21,559],955:[692,18,547,19,527],956:[461,205,610,45,588],957:[473,14,518,15,495],958:[692,205,468,23,439],959:[473,14,500,25,476],960:[461,18,631,20,609],961:[473,205,547,45,515],962:[473,203,464,23,444],963:[461,14,568,25,529],964:[461,14,492,18,457],965:[473,14,576,12,551],966:[473,205,653,24,629],967:[473,205,612,21,586],968:[473,205,763,12,751],969:[473,14,733,26,708],970:[666,14,335,-2,337],971:[666,14,576,12,551],972:[692,14,500,25,476],973:[692,14,576,12,551],974:[692,14,733,26,708],976:[697,10,500,54,462],977:[692,14,647,12,620],978:[692,0,743,7,733],981:[676,205,653,24,629],982:[461,14,864,9,851],984:[691,205,778,35,743],985:[473,205,500,25,476],986:[691,211,680,45,645],987:[503,203,504,23,483],988:[676,0,620,16,593],989:[461,205,491,45,458],990:[797,14,757,35,715],991:[692,0,485,29,453],992:[692,205,839,33,801],993:[639,205,611,29,583],1008:[473,19,563,12,546],1009:[473,205,511,25,486],1012:[691,19,778,35,743],1013:[473,14,444,25,430],1014:[473,14,444,14,419]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/GreekAndCoptic.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GreekBold.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GreekBold.js
new file mode 100644
index 0000000..d681707
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GreekBold.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GreekBold.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{120488:[690,0,735,9,689],120489:[676,0,667,16,619],120490:[676,0,620,16,593],120491:[690,0,691,16,656],120492:[676,0,679,16,641],120493:[676,0,693,28,634],120494:[676,0,810,21,759],120495:[692,18,778,35,743],120496:[676,0,421,20,370],120497:[676,0,820,30,769],120498:[690,0,707,9,674],120499:[676,0,972,14,921],120500:[676,18,722,16,701],120501:[676,0,623,28,595],120502:[691,19,778,35,743],120503:[676,0,780,21,759],120504:[676,0,611,16,600],120505:[692,18,778,35,743],120506:[676,0,665,14,627],120507:[676,0,667,31,636],120508:[692,0,722,3,699],120509:[676,0,836,18,818],120510:[676,0,747,16,699],120511:[692,0,800,3,785],120512:[692,0,778,35,723],120513:[676,14,691,16,656],120514:[473,14,644,25,618],120515:[692,205,556,45,524],120516:[473,205,518,12,501],120517:[692,14,502,26,477],120518:[473,14,444,28,429],120519:[692,205,459,23,437],120520:[473,205,580,12,545],120521:[692,14,501,25,476],120522:[461,14,326,15,304],120523:[473,0,581,21,559],120524:[692,18,546,19,527],120525:[461,205,610,45,588],120526:[473,14,518,15,495],120527:[692,205,465,23,439],120528:[473,14,500,25,476],120529:[461,18,631,20,609],120530:[473,205,547,45,515],120531:[473,203,464,23,444],120532:[461,14,568,25,529],120533:[461,14,492,18,457],120534:[473,14,576,12,551],120535:[473,205,653,24,629],120536:[473,205,612,21,586],120537:[473,205,763,12,751],120538:[473,14,734,26,708],120539:[707,14,515,25,491],120540:[473,14,444,25,430],120541:[692,14,647,12,620],120542:[473,19,563,12,546],120543:[676,205,653,24,629],120544:[473,205,511,25,486],120545:[461,14,864,9,851]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/GreekBold.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GreekSSBold.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GreekSSBold.js
new file mode 100644
index 0000000..b9d08cf
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GreekSSBold.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GreekSSBold.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{120662:[690,0,690,25,665],120663:[676,0,636,80,594],120664:[676,0,591,80,569],120665:[690,0,720,40,680],120666:[676,0,635,80,597],120667:[676,0,653,25,623],120668:[676,0,715,80,635],120669:[691,19,778,35,743],120670:[676,0,440,65,375],120671:[676,0,712,80,707],120672:[690,0,706,40,666],120673:[676,0,913,80,833],120674:[676,18,724,80,644],120675:[676,0,640,35,605],120676:[692,18,778,35,743],120677:[676,0,715,80,635],120678:[676,0,581,80,569],120679:[691,19,778,35,743],120680:[676,0,674,28,632],120681:[676,0,641,14,627],120682:[691,0,748,20,728],120683:[676,0,800,25,775],120684:[676,0,740,40,700],120685:[691,0,806,15,791],120686:[691,0,752,32,720],120687:[664,30,735,45,685],120688:[473,14,662,40,629],120689:[692,205,512,39,487],120690:[473,205,502,10,477],120691:[692,14,502,25,477],120692:[473,14,451,25,434],120693:[692,205,500,28,488],120694:[473,205,510,35,474],120695:[692,14,500,23,477],120696:[461,14,319,53,296],120697:[473,0,527,55,512],120698:[692,14,554,18,520],120699:[461,205,550,39,517],120700:[473,14,492,55,472],120701:[692,205,501,28,489],120702:[473,14,501,25,476],120703:[461,14,594,10,572],120704:[473,205,511,38,486],120705:[473,205,498,26,486],120706:[461,14,520,25,552],120707:[461,14,479,6,472],120708:[473,14,514,35,489],120709:[473,205,634,25,609],120710:[473,205,573,9,553],120711:[473,205,680,25,699],120712:[461,14,740,42,689],120713:[691,14,501,25,476],120714:[473,14,462,25,440],120715:[692,14,536,35,522],120716:[473,14,570,14,554],120717:[692,205,634,25,609],120718:[473,205,494,25,469],120719:[461,14,848,6,839]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/GreekSSBold.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/IPAExtensions.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/IPAExtensions.js
new file mode 100644
index 0000000..77f751c
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/IPAExtensions.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/IPAExtensions.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{592:[473,14,512,13,476],593:[473,14,608,32,594],594:[473,14,608,32,594],595:[691,14,560,74,523],596:[473,14,472,15,420],597:[473,161,477,30,445],598:[676,233,602,32,660],599:[683,14,650,32,660],600:[473,14,457,25,427],601:[473,14,457,19,421],602:[473,14,688,41,677],603:[475,14,493,25,439],604:[475,14,493,25,439],605:[475,14,683,25,658],606:[475,14,523,25,469],607:[461,203,338,-54,314],608:[683,245,627,37,662],609:[473,245,571,37,484],610:[461,11,590,35,555],611:[461,233,532,24,507],612:[450,10,514,17,497],613:[450,226,550,17,536],614:[683,0,550,14,532],615:[683,205,556,16,485],616:[691,0,292,21,262],617:[456,8,366,22,339],618:[461,0,297,26,264],619:[676,0,395,15,380],620:[676,0,446,17,428],621:[676,233,326,15,384],622:[676,236,619,24,603],623:[473,0,828,16,815],624:[473,233,859,16,836],625:[473,233,847,21,770],626:[473,233,625,-57,586],627:[473,233,610,21,668],628:[461,12,604,34,558],629:[473,14,520,34,485],630:[461,5,741,28,713],631:[477,2,696,42,653],632:[685,231,713,45,667],633:[463,10,456,35,441],634:[676,10,456,35,441],635:[463,233,506,35,564],636:[473,233,426,10,416],637:[473,233,454,12,418],638:[484,0,359,15,386],639:[484,0,404,10,381],640:[464,0,516,21,495],641:[464,0,516,21,495],642:[473,218,389,25,361],643:[683,233,458,-36,406],644:[683,233,373,-57,430],645:[470,233,396,8,452],646:[683,243,399,-16,449],647:[513,129,333,19,332],648:[630,233,339,19,389],649:[461,14,556,9,538],650:[452,8,500,13,487],651:[465,10,534,23,511],652:[475,0,500,21,485],653:[475,0,722,23,707],654:[666,0,500,16,482],655:[464,0,633,46,587],656:[461,218,531,21,577],657:[461,150,538,21,517],658:[450,236,440,8,430],659:[450,307,440,8,430],660:[683,0,417,55,426],661:[683,0,417,55,426],662:[669,14,417,55,426],663:[473,232,479,72,447],664:[680,17,723,13,708],665:[464,0,456,15,441],666:[475,14,465,11,455],667:[537,11,600,29,595],668:[464,0,582,21,561],669:[691,233,394,-60,414],670:[461,215,556,22,543],671:[464,0,470,17,440],672:[582,205,636,34,659],673:[683,0,500,55,426],674:[683,0,500,55,426],675:[676,14,868,25,843],676:[676,236,810,25,794],677:[676,164,960,25,933],678:[630,12,626,19,598],679:[683,233,540,19,626],680:[630,12,700,19,690]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/IPAExtensions.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Latin1Supplement.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Latin1Supplement.js
new file mode 100644
index 0000000..a8b8fb6
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Latin1Supplement.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Latin1Supplement.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{160:[0,0,250,0,0],161:[501,203,333,82,252],162:[588,140,500,53,458],163:[684,16,500,21,477],164:[542,10,500,-26,526],165:[676,0,500,-64,547],166:[691,19,220,66,154],167:[691,132,500,57,443],168:[666,-537,333,-2,337],169:[691,19,747,26,721],170:[688,-397,300,-1,301],171:[415,-36,500,23,473],172:[399,-108,750,65,685],173:[287,-171,333,44,287],174:[691,19,747,26,721],175:[637,-565,333,1,331],176:[688,-402,400,57,343],177:[518,151,770,65,685],178:[688,-275,300,0,300],179:[688,-268,300,3,297],180:[713,-528,333,86,324],181:[461,206,556,33,536],182:[676,186,639,60,579],183:[417,-248,250,41,210],184:[0,218,333,68,294],185:[688,-275,300,28,273],186:[688,-397,330,18,312],187:[415,-36,500,27,477],188:[688,12,750,28,743],189:[688,12,750,-7,775],190:[688,12,750,23,733],191:[501,201,500,55,443],192:[963,0,722,9,689],193:[963,0,722,9,689],194:[954,0,722,9,689],195:[924,0,722,9,689],196:[916,0,722,9,689],197:[1000,0,722,9,689],198:[676,0,1000,4,951],199:[691,218,722,49,687],200:[963,0,667,16,641],201:[963,0,667,16,641],202:[954,0,667,16,641],203:[916,0,667,16,641],204:[963,0,389,20,370],205:[963,0,389,20,370],206:[954,0,389,20,370],207:[916,0,389,20,370],208:[676,0,722,6,690],209:[924,18,722,16,701],210:[963,19,778,35,743],211:[963,19,778,35,743],212:[954,19,778,35,743],213:[924,19,778,35,743],214:[916,19,778,35,743],215:[538,33,702,66,636],216:[737,74,778,35,743],217:[963,19,722,16,701],218:[963,19,722,16,701],219:[954,19,722,16,701],220:[916,19,722,16,701],221:[963,0,722,15,699],222:[676,0,611,16,600],223:[691,12,556,19,517],224:[713,14,500,25,488],225:[713,14,500,25,488],226:[704,14,500,25,488],227:[674,14,500,25,488],228:[666,14,500,25,488],229:[752,14,500,25,488],230:[473,14,722,33,694],231:[473,218,444,25,430],232:[713,14,444,25,427],233:[713,14,444,25,427],234:[704,14,444,25,427],235:[666,14,444,25,427],236:[713,0,278,14,257],237:[713,0,278,15,258],238:[704,0,278,-29,308],239:[666,0,278,-29,310],240:[691,14,500,25,476],241:[674,0,556,21,539],242:[713,14,500,25,476],243:[713,14,500,25,476],244:[704,14,500,25,476],245:[674,14,500,25,476],246:[666,14,500,25,476],247:[537,31,570,33,537],248:[549,92,500,25,476],249:[713,14,556,16,538],250:[713,14,556,16,538],251:[704,14,556,16,538],252:[666,14,556,16,538],253:[713,205,500,16,482],254:[676,205,556,19,524],255:[666,205,500,16,482]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/Latin1Supplement.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LatinExtendedA.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LatinExtendedA.js
new file mode 100644
index 0000000..3e982b7
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LatinExtendedA.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LatinExtendedA.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{256:[810,0,722,9,689],257:[600,14,500,25,488],258:[901,0,722,9,689],259:[691,14,500,25,488],260:[690,205,722,9,721],261:[473,205,500,25,569],262:[923,19,722,49,687],263:[713,14,444,25,430],264:[914,19,722,49,687],265:[704,14,444,25,430],266:[876,19,722,49,687],267:[666,14,444,25,430],268:[914,19,722,49,687],269:[704,14,444,25,430],270:[914,0,722,14,690],271:[709,14,680,25,710],272:[676,0,722,6,690],273:[676,14,556,25,534],274:[810,0,667,16,641],275:[600,14,444,25,427],276:[901,0,667,16,641],277:[691,14,444,25,427],278:[876,0,667,16,641],279:[666,14,444,25,427],280:[676,205,667,16,641],281:[473,205,444,25,435],282:[914,0,667,16,641],283:[704,14,444,25,427],284:[914,19,778,37,755],285:[704,206,500,28,483],286:[901,19,778,37,755],287:[691,206,500,28,483],288:[876,19,778,37,755],289:[666,206,500,28,483],290:[691,378,778,37,755],291:[863,206,500,28,483],292:[914,0,778,21,759],293:[914,0,556,15,534],294:[676,0,778,21,759],295:[676,0,556,15,534],296:[884,0,389,14,379],297:[674,0,278,-47,318],298:[810,0,389,20,370],299:[600,0,278,-25,305],300:[900,0,389,20,370],301:[691,0,278,-11,292],302:[676,205,389,20,389],303:[691,205,278,15,321],304:[876,0,389,20,370],305:[461,0,278,15,256],306:[676,96,838,20,917],307:[691,203,552,15,531],308:[914,96,500,3,479],309:[704,203,333,-57,335],310:[676,378,778,30,769],311:[676,378,556,22,543],312:[470,0,600,19,627],313:[923,0,667,19,638],314:[923,0,278,15,260],315:[676,378,667,19,638],316:[676,378,278,15,256],317:[691,0,667,19,638],318:[709,0,457,15,442],319:[676,0,667,19,638],320:[676,0,414,15,441],321:[676,0,667,18,638],322:[676,0,278,-22,303],323:[923,18,722,16,701],324:[713,0,556,21,539],325:[676,378,722,16,701],326:[473,378,556,21,539],327:[914,18,722,16,701],328:[704,0,556,21,539],329:[709,0,705,13,693],330:[676,96,732,14,712],331:[473,205,556,21,490],332:[810,19,778,35,743],333:[600,14,500,25,476],334:[901,19,778,35,743],335:[691,14,500,25,476],336:[923,19,778,35,743],337:[713,14,500,25,476],338:[684,5,1000,22,981],339:[473,14,722,22,696],340:[923,0,722,26,716],341:[713,0,444,28,434],342:[676,378,722,26,716],343:[473,378,444,28,434],344:[914,0,722,26,716],345:[704,0,444,28,434],346:[923,19,556,35,513],347:[713,14,389,25,364],348:[914,19,556,35,513],349:[704,14,389,22,361],350:[692,218,556,35,513],351:[473,218,389,25,361],352:[914,19,556,35,513],353:[704,14,389,22,361],354:[676,218,667,31,636],355:[630,218,333,19,332],356:[914,0,667,31,636],357:[709,12,415,19,445],358:[676,0,667,31,636],359:[630,12,333,17,332],360:[886,19,722,16,701],361:[674,14,556,16,538],362:[810,19,722,16,701],363:[600,14,556,16,538],364:[901,19,722,16,701],365:[691,14,556,16,538],366:[935,19,722,16,701],367:[740,14,556,16,538],368:[923,19,722,16,701],369:[713,14,556,16,538],370:[676,205,722,16,701],371:[461,205,556,16,547],372:[914,15,1000,19,981],373:[704,14,722,23,707],374:[914,0,722,15,699],375:[704,205,500,16,482],376:[876,0,722,15,699],377:[923,0,667,28,634],378:[713,0,444,21,420],379:[876,0,667,28,634],380:[666,0,444,21,420],381:[914,0,667,28,634],382:[704,0,444,21,420],383:[691,0,333,14,389]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/LatinExtendedA.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LatinExtendedAdditional.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LatinExtendedAdditional.js
new file mode 100644
index 0000000..85de3ae
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LatinExtendedAdditional.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LatinExtendedAdditional.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{7808:[923,15,1000,19,981],7809:[713,14,722,23,707],7810:[923,15,1000,19,981],7811:[713,14,722,23,707],7812:[876,15,1000,19,981],7813:[666,14,722,23,707],7922:[923,0,722,15,699],7923:[713,205,500,16,482]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/LatinExtendedAdditional.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LatinExtendedB.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LatinExtendedB.js
new file mode 100644
index 0000000..5ed1d7b
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LatinExtendedB.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LatinExtendedB.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{384:[676,14,553,-28,516],392:[576,14,568,30,574],400:[686,4,610,38,587],402:[706,155,500,0,498],405:[676,10,797,14,767],409:[691,0,533,12,533],410:[676,0,291,24,265],411:[666,0,536,60,526],414:[473,205,559,21,539],416:[732,19,778,35,788],417:[505,14,554,25,576],421:[673,205,550,10,515],426:[689,228,446,25,421],427:[630,218,347,18,331],429:[691,12,371,19,389],431:[810,19,796,16,836],432:[596,14,600,16,626],442:[450,237,441,9,415],443:[688,0,515,27,492],446:[541,10,527,78,449],448:[740,0,186,60,126],449:[740,0,313,60,253],450:[740,0,445,39,405],451:[691,13,333,81,251],496:[704,203,333,-57,335],506:[972,0,722,9,689],507:[923,14,500,25,488],508:[923,0,1000,4,951],509:[713,14,722,33,694],510:[923,74,778,35,743],511:[713,92,500,25,476],567:[461,203,333,-57,260]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/LatinExtendedB.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LetterlikeSymbols.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LetterlikeSymbols.js
new file mode 100644
index 0000000..b332fc5
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LetterlikeSymbols.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LetterlikeSymbols.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{8450:[691,19,727,45,672],8453:[688,12,873,38,835],8455:[691,19,699,65,662],8460:[701,205,843,42,795],8461:[676,0,768,75,693],8462:[685,10,576,50,543],8463:[685,10,576,50,543],8465:[701,25,790,54,735],8467:[699,14,500,43,632],8469:[676,0,738,75,663],8470:[691,18,1093,10,1042],8471:[691,19,747,26,721],8472:[541,219,850,55,822],8473:[676,0,700,75,670],8474:[691,64,797,45,747],8476:[701,25,884,50,841],8477:[676,0,783,75,758],8478:[676,101,722,26,726],8482:[676,-271,1000,24,977],8484:[691,0,777,52,727],8485:[676,205,448,21,424],8486:[692,0,758,35,723],8487:[674,18,758,35,723],8488:[701,195,755,44,703],8489:[475,0,312,9,244],8491:[920,0,722,9,689],8493:[701,19,773,54,731],8498:[676,0,616,48,546],8501:[694,34,766,76,690],8502:[694,34,703,60,659],8503:[694,34,562,71,493],8504:[694,34,599,40,559],8508:[461,11,804,55,759],8509:[486,203,646,23,624],8510:[676,0,497,75,643],8511:[676,0,768,75,693],8512:[773,269,976,36,952],8517:[676,0,748,75,703],8518:[676,14,643,50,583],8519:[473,14,573,50,523],8520:[691,0,330,65,265],8521:[691,205,371,-20,311],8523:[690,17,833,61,788]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/LetterlikeSymbols.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Main.js
new file mode 100644
index 0000000..56d5e4d
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"]={directory:"General/Bold",family:"STIXGeneral",weight:"bold",Ranges:[[160,255,"Latin1Supplement"],[256,383,"LatinExtendedA"],[384,591,"LatinExtendedB"],[592,687,"IPAExtensions"],[688,767,"SpacingModLetters"],[768,879,"CombDiacritMarks"],[880,1023,"GreekAndCoptic"],[1024,1279,"Cyrillic"],[7424,7615,"PhoneticExtensions"],[7680,7935,"LatinExtendedAdditional"],[8192,8303,"GeneralPunctuation"],[8304,8351,"SuperAndSubscripts"],[8352,8399,"CurrencySymbols"],[8400,8447,"CombDiactForSymbols"],[8448,8527,"LetterlikeSymbols"],[8528,8591,"NumberForms"],[8592,8703,"Arrows"],[8704,8959,"MathOperators"],[8960,9215,"MiscTechnical"],[9216,9279,"ControlPictures"],[9312,9471,"EnclosedAlphanum"],[9472,9599,"BoxDrawing"],[9632,9727,"GeometricShapes"],[9728,9983,"MiscSymbols"],[10176,10223,"MiscMathSymbolsA"],[10624,10751,"MiscMathSymbolsB"],[10752,11007,"SuppMathOperators"],[64256,64335,"AlphaPresentForms"],[119808,119859,"MathBold"],[120172,120223,"BoldFraktur"],[120276,120327,"MathSSBold"],[120488,120545,"GreekBold"],[120662,120719,"GreekSSBold"],[120782,120791,"MathBold"],[120812,120822,"MathSSBold"]],32:[0,0,250,0,0],33:[691,13,333,81,251],34:[691,-404,555,83,472],35:[700,0,500,5,495],36:[750,99,500,29,472],37:[706,29,749,61,688],38:[691,16,833,62,789],39:[691,-404,278,75,204],40:[694,168,333,46,306],41:[694,168,333,27,287],42:[691,-255,500,56,448],43:[563,57,750,65,685],44:[155,180,250,39,223],45:[287,-171,333,44,287],46:[156,13,250,41,210],47:[691,19,278,-24,302],48:[688,13,500,24,476],49:[688,0,500,65,441],50:[688,0,500,17,478],51:[688,14,500,16,468],52:[688,0,500,19,476],53:[676,8,500,22,470],54:[688,13,500,28,475],55:[676,0,500,17,477],56:[688,13,500,28,472],57:[688,13,500,26,473],58:[472,13,333,82,251],59:[472,180,333,82,266],60:[534,24,750,80,670],61:[399,-107,750,68,682],62:[534,24,750,80,670],63:[689,13,500,57,445],64:[691,19,930,108,822],65:[690,0,722,9,689],66:[676,0,667,16,619],67:[691,19,722,49,687],68:[676,0,722,14,690],69:[676,0,667,16,641],70:[676,0,611,16,583],71:[691,19,778,37,755],72:[676,0,778,21,759],73:[676,0,389,20,370],74:[676,96,500,3,478],75:[676,0,778,30,769],76:[677,0,667,19,638],77:[676,0,944,14,921],78:[676,18,722,16,701],79:[691,19,778,35,743],80:[676,0,611,16,600],81:[691,176,778,35,743],82:[676,0,722,26,716],83:[692,19,556,35,513],84:[676,0,667,31,636],85:[676,19,722,16,701],86:[676,18,722,16,701],87:[676,15,1000,19,981],88:[676,0,722,16,699],89:[676,0,722,15,699],90:[676,0,667,28,634],91:[678,149,333,67,301],92:[691,19,278,-25,303],93:[678,149,333,32,266],94:[676,-311,581,73,509],95:[-75,125,500,0,500],96:[713,-528,333,8,246],97:[473,14,500,25,488],98:[676,14,556,17,521],99:[473,14,444,25,430],100:[676,14,556,25,534],101:[473,14,444,25,427],102:[691,0,333,14,389],103:[473,206,500,28,483],104:[676,0,556,15,534],105:[691,0,278,15,256],106:[691,203,333,-57,263],107:[676,0,556,22,543],108:[676,0,278,15,256],109:[473,0,833,15,814],110:[473,0,556,21,539],111:[473,14,500,25,476],112:[473,205,556,19,524],113:[473,205,556,34,536],114:[473,0,444,28,434],115:[473,14,389,25,361],116:[630,12,333,19,332],117:[461,14,556,16,538],118:[461,14,500,21,485],119:[461,14,722,23,707],120:[461,0,500,12,484],121:[461,205,500,16,482],122:[461,0,444,21,420],123:[698,175,394,22,340],124:[691,19,220,66,154],125:[698,175,394,54,372],126:[333,-173,520,29,491],915:[676,0,620,16,593],916:[690,0,722,33,673],920:[692,18,778,35,743],923:[690,0,707,9,674],926:[676,0,647,40,607],928:[676,0,778,21,759],931:[676,0,671,28,641],933:[692,0,703,7,693],934:[676,0,836,18,818],936:[692,0,808,15,797],937:[692,0,768,28,740]};MathJax.OutputJax["HTML-CSS"].initFont("STIXGeneral-bold");MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/Main.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MathBold.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MathBold.js
new file mode 100644
index 0000000..c7ac026
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MathBold.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MathBold.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{119808:[690,0,722,9,689],119809:[676,0,667,16,619],119810:[691,19,722,49,687],119811:[676,0,722,14,690],119812:[676,0,667,16,641],119813:[676,0,611,16,583],119814:[691,19,778,37,755],119815:[676,0,778,21,759],119816:[676,0,389,20,370],119817:[676,96,500,3,478],119818:[676,0,778,30,769],119819:[676,0,667,19,638],119820:[676,0,944,14,921],119821:[676,18,722,16,701],119822:[691,19,778,35,743],119823:[676,0,611,16,600],119824:[691,176,778,35,743],119825:[676,0,722,26,716],119826:[692,19,556,35,513],119827:[676,0,667,31,636],119828:[676,19,722,16,701],119829:[676,18,722,16,701],119830:[676,15,1000,19,981],119831:[676,0,722,16,699],119832:[676,0,722,15,699],119833:[676,0,667,28,634],119834:[473,14,500,25,488],119835:[676,14,556,17,521],119836:[473,14,444,25,430],119837:[676,14,556,25,534],119838:[473,14,444,25,427],119839:[691,0,333,14,389],119840:[473,206,500,28,483],119841:[676,0,556,15,534],119842:[691,0,278,15,256],119843:[691,203,333,-57,263],119844:[676,0,556,22,543],119845:[676,0,278,15,256],119846:[473,0,833,15,814],119847:[473,0,556,21,539],119848:[473,14,500,25,476],119849:[473,205,556,19,524],119850:[473,205,556,34,536],119851:[473,0,444,28,434],119852:[473,14,389,25,361],119853:[630,12,333,19,332],119854:[461,14,556,16,538],119855:[461,14,500,21,485],119856:[461,14,722,23,707],119857:[461,0,500,12,484],119858:[461,205,500,16,482],119859:[461,0,444,21,420],120782:[688,13,500,24,476],120783:[688,0,500,65,441],120784:[688,0,500,17,478],120785:[688,14,500,16,468],120786:[688,0,500,19,476],120787:[676,8,500,22,470],120788:[688,13,500,28,475],120789:[676,0,500,17,477],120790:[688,13,500,28,472],120791:[688,13,500,26,473]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/MathBold.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MathOperators.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MathOperators.js
new file mode 100644
index 0000000..2166982
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MathOperators.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MathOperators.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{8704:[676,0,599,5,594],8705:[785,29,539,63,476],8706:[686,10,559,44,559],8707:[676,0,599,76,523],8708:[803,127,599,76,523],8709:[594,90,787,50,737],8710:[676,0,681,23,658],8711:[676,0,681,23,658],8712:[547,13,750,82,668],8713:[680,146,750,82,668],8714:[499,-35,500,60,440],8715:[547,13,750,82,668],8716:[680,146,750,82,668],8717:[499,-35,500,60,440],8719:[763,259,1000,37,963],8720:[763,259,982,28,954],8721:[763,259,914,40,873],8722:[297,-209,750,66,685],8723:[657,12,770,65,685],8724:[793,57,750,65,685],8725:[732,193,584,78,506],8726:[411,-93,452,25,427],8727:[502,-34,585,82,503],8728:[409,-95,394,40,354],8729:[473,-59,584,85,499],8730:[946,259,965,130,1016],8733:[450,0,772,80,692],8734:[450,0,964,80,884],8735:[584,0,685,50,634],8736:[569,0,792,50,708],8737:[569,74,792,50,708],8738:[534,26,695,27,667],8739:[690,189,288,100,188],8740:[690,189,411,23,388],8741:[690,189,487,100,387],8742:[690,189,617,23,594],8743:[536,28,640,52,588],8744:[536,28,640,52,588],8745:[541,33,650,66,584],8746:[541,33,650,66,584],8747:[824,320,553,32,733],8748:[824,320,863,32,1043],8749:[824,320,1174,32,1354],8750:[824,320,591,30,731],8751:[824,320,903,32,1043],8752:[824,320,1214,32,1354],8753:[824,320,593,32,733],8754:[824,320,593,32,733],8755:[824,320,593,32,733],8756:[575,41,750,66,685],8757:[575,41,750,66,685],8758:[575,41,554,190,364],8759:[575,41,750,68,683],8760:[543,-209,750,66,685],8761:[543,37,750,66,686],8762:[575,41,750,66,685],8763:[565,59,750,67,682],8764:[374,-132,750,67,682],8765:[374,-132,750,67,682],8766:[419,-85,750,68,683],8767:[484,-67,750,66,684],8768:[575,40,348,53,295],8769:[444,-62,750,67,682],8770:[463,-45,750,68,683],8771:[463,-45,750,68,683],8772:[530,54,750,68,683],8773:[568,60,750,68,683],8774:[568,150,750,68,683],8775:[642,152,750,68,683],8776:[508,-26,750,68,683],8777:[583,48,750,68,683],8778:[568,75,750,68,683],8779:[613,109,750,68,683],8780:[568,60,750,68,683],8781:[518,13,750,68,683],8782:[484,-22,750,68,683],8783:[484,-107,750,68,683],8784:[667,-107,750,68,682],8785:[667,161,750,68,682],8786:[667,161,750,68,682],8787:[667,161,750,68,682],8788:[483,-50,932,68,864],8789:[483,-50,932,68,864],8790:[471,-63,750,68,682],8791:[809,-107,750,68,682],8792:[761,-107,750,68,682],8793:[836,-107,750,68,682],8794:[836,-107,750,68,682],8795:[841,-107,750,68,682],8796:[844,-107,750,68,682],8797:[838,-107,750,55,735],8798:[721,-107,750,68,682],8799:[880,-107,750,68,682],8800:[662,156,750,68,682],8801:[507,-27,750,68,682],8802:[688,156,750,68,682],8803:[592,57,750,68,682],8804:[627,121,750,80,670],8805:[627,120,750,80,670],8806:[729,222,750,80,670],8807:[729,222,750,80,670],8808:[729,294,750,80,670],8809:[729,294,750,80,670],8810:[534,24,1000,38,961],8811:[534,24,1000,38,961],8812:[732,193,417,46,371],8813:[591,87,750,68,683],8814:[625,115,750,80,670],8815:[625,115,750,80,670],8816:[717,235,750,80,670],8817:[717,235,750,80,670],8818:[690,182,750,67,682],8819:[690,182,750,67,682],8820:[780,282,750,67,682],8821:[780,282,750,67,682],8822:[734,226,750,80,670],8823:[734,226,750,80,670],8824:[824,316,750,80,670],8825:[824,316,750,80,670],8826:[531,23,750,80,670],8827:[531,23,750,80,670],8828:[645,138,750,80,670],8829:[645,138,750,80,670],8830:[676,169,750,67,682],8831:[676,169,750,67,682],8832:[625,115,750,80,670],8833:[625,115,750,80,670],8834:[547,13,750,82,668],8835:[547,13,750,82,668],8836:[680,146,750,82,668],8837:[680,146,750,82,668],8838:[647,101,750,82,668],8839:[647,101,750,82,668],8840:[747,201,750,82,668],8841:[747,201,750,82,668],8842:[734,200,750,82,668],8843:[734,200,750,82,668],8844:[541,33,650,66,584],8845:[541,33,650,66,584],8846:[541,33,650,66,584],8847:[532,27,750,87,663],8848:[532,27,750,87,663],8849:[644,93,750,87,663],8850:[644,93,750,87,663],8851:[541,33,650,66,584],8852:[541,33,650,66,584],8853:[634,130,864,50,814],8854:[634,130,864,50,814],8855:[634,130,864,50,814],8856:[634,130,864,50,814],8857:[594,90,784,50,734],8858:[634,130,842,39,803],8859:[634,130,864,50,814],8860:[634,130,864,50,814],8861:[634,130,864,50,814],8862:[661,158,910,45,865],8863:[661,158,910,45,865],8864:[661,158,910,45,865],8865:[661,158,910,45,865],8866:[676,0,750,91,659],8867:[676,0,750,91,659],8868:[676,0,750,91,659],8869:[676,0,750,91,659],8870:[676,0,555,91,464],8871:[676,0,555,91,464],8872:[676,0,750,91,659],8873:[676,0,972,91,882],8874:[676,0,944,91,856],8875:[676,0,944,91,856],8876:[676,0,913,21,822],8877:[676,0,912,21,822],8878:[676,0,1096,21,1024],8879:[676,0,1104,21,1016],8880:[543,38,750,98,652],8881:[543,38,750,98,652],8882:[534,24,750,81,669],8883:[534,24,750,81,669],8884:[621,113,750,81,669],8885:[621,113,750,81,669],8886:[436,-96,1216,50,1166],8887:[436,-96,1216,50,1166],8888:[436,-96,884,50,834],8889:[563,57,750,65,685],8890:[461,216,498,74,424],8891:[536,189,640,52,588],8892:[697,28,640,52,588],8893:[697,28,640,52,588],8894:[630,0,750,60,690],8895:[662,158,910,45,865],8900:[515,-17,584,43,541],8903:[595,63,750,66,685],8904:[604,72,870,67,803],8905:[604,72,870,57,817],8906:[604,72,870,53,813],8907:[604,72,870,97,773],8908:[604,72,870,97,773],8909:[463,-45,750,68,683],8910:[536,28,640,41,599],8911:[536,28,640,41,599],8912:[600,67,750,63,687],8913:[600,67,750,63,687],8914:[541,33,750,65,685],8915:[541,33,750,65,685],8916:[643,33,650,66,584],8917:[690,189,685,48,637],8918:[534,24,750,80,670],8919:[534,24,750,80,670],8920:[534,24,1336,40,1296],8921:[534,24,1336,40,1296],8922:[916,408,750,80,670],8923:[916,408,750,80,670],8924:[627,120,750,80,670],8925:[627,120,750,80,670],8926:[645,138,750,80,670],8927:[645,138,750,80,670],8928:[735,199,750,80,670],8929:[735,199,750,80,670],8930:[792,241,750,87,663],8931:[792,241,750,87,663],8934:[690,200,750,67,682],8935:[690,200,750,67,682],8936:[676,187,750,67,682],8937:[676,187,750,67,682],8938:[625,115,750,81,669],8939:[625,115,750,81,669],8940:[711,228,750,81,669],8941:[711,228,750,81,669],8942:[678,174,584,205,375],8943:[351,-181,977,62,914],8944:[579,75,977,162,815],8945:[579,75,977,162,815],8950:[735,13,750,82,668],8957:[735,13,750,82,668]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/MathOperators.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MathSSBold.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MathSSBold.js
new file mode 100644
index 0000000..ccfc165
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MathSSBold.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MathSSBold.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{120276:[690,0,690,25,665],120277:[676,0,636,80,594],120278:[691,19,723,49,688],120279:[676,0,709,80,674],120280:[676,0,635,80,597],120281:[676,0,582,80,570],120282:[691,19,746,37,671],120283:[676,0,715,80,635],120284:[676,0,440,65,375],120285:[676,96,481,15,406],120286:[676,0,712,80,707],120287:[676,0,603,80,587],120288:[676,0,913,80,833],120289:[676,18,724,80,644],120290:[692,18,778,35,743],120291:[676,0,581,80,569],120292:[691,176,779,35,754],120293:[676,0,670,80,657],120294:[691,19,554,35,511],120295:[676,0,641,14,627],120296:[676,19,699,75,624],120297:[676,18,690,25,665],120298:[676,15,997,30,967],120299:[676,0,740,40,700],120300:[676,0,694,20,674],120301:[676,0,653,25,623],120302:[473,14,489,23,428],120303:[676,13,512,55,487],120304:[473,14,462,25,442],120305:[676,14,518,25,463],120306:[473,13,452,25,433],120307:[691,0,340,14,374],120308:[473,206,504,28,490],120309:[676,0,510,55,455],120310:[688,0,245,50,195],120311:[688,203,324,-57,269],120312:[676,0,519,55,506],120313:[676,0,235,55,180],120314:[473,0,776,55,721],120315:[473,0,510,55,455],120316:[473,14,501,25,476],120317:[473,205,512,55,487],120318:[473,205,512,25,457],120319:[473,0,411,55,406],120320:[473,13,385,25,357],120321:[630,12,386,7,371],120322:[461,15,518,55,463],120323:[461,14,462,15,447],120324:[461,14,701,17,684],120325:[461,0,506,20,486],120326:[461,205,472,18,455],120327:[461,0,441,21,417],120812:[688,13,500,24,476],120813:[688,0,500,82,334],120814:[688,0,500,20,474],120815:[688,13,500,18,479],120816:[688,0,500,19,484],120817:[676,13,500,13,483],120818:[688,13,500,26,475],120819:[676,0,500,35,471],120820:[688,13,500,28,472],120821:[688,13,500,26,475]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/MathSSBold.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscMathSymbolsA.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscMathSymbolsA.js
new file mode 100644
index 0000000..f278f42
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscMathSymbolsA.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscMathSymbolsA.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{10184:[547,13,1025,62,943],10185:[547,13,1025,62,943],10216:[732,193,445,69,399],10217:[732,193,445,46,376]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/MiscMathSymbolsA.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscMathSymbolsB.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscMathSymbolsB.js
new file mode 100644
index 0000000..106f37f
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscMathSymbolsB.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscMathSymbolsB.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{10624:[705,200,675,105,570],10678:[634,130,864,50,814],10679:[634,130,864,50,814],10680:[634,130,864,50,814],10688:[634,130,864,50,814],10689:[634,130,864,50,814],10692:[661,158,910,45,865],10693:[661,158,910,45,865],10694:[661,158,910,45,865],10695:[661,158,910,45,865]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/MiscMathSymbolsB.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscSymbols.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscSymbols.js
new file mode 100644
index 0000000..6b3b86d
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscSymbols.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscSymbols.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{9837:[740,5,437,86,389],9838:[818,210,490,97,393],9839:[818,210,490,52,438]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/MiscSymbols.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscTechnical.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscTechnical.js
new file mode 100644
index 0000000..35ed7b4
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscTechnical.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscTechnical.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{8962:[774,0,926,55,871],8968:[731,193,469,164,459],8969:[731,193,469,10,305],8970:[732,193,469,164,459],8971:[732,193,469,10,305],8976:[399,-108,750,65,685],8985:[399,-108,750,65,685],8994:[378,-129,1026,37,990],8995:[378,-129,1026,37,990],9001:[732,193,445,69,399],9002:[732,193,445,46,376],9014:[751,156,926,85,841],9021:[694,190,924,80,844],9023:[732,200,728,55,673],9135:[297,-209,315,0,315]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/MiscTechnical.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/NumberForms.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/NumberForms.js
new file mode 100644
index 0000000..0c1d514
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/NumberForms.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/NumberForms.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{8531:[688,12,750,-7,763],8532:[688,12,750,28,763],8533:[688,12,750,-7,775],8534:[688,12,750,28,775],8535:[688,12,750,23,775],8536:[688,12,750,22,775],8537:[688,12,750,-7,758],8538:[688,12,750,49,758],8539:[688,12,750,-7,775],8540:[688,12,750,23,775],8541:[688,12,750,49,775],8542:[688,12,750,30,775]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/NumberForms.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/PhoneticExtensions.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/PhoneticExtensions.js
new file mode 100644
index 0000000..170663e
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/PhoneticExtensions.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/PhoneticExtensions.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{7424:[475,0,515,9,503],7431:[461,0,531,20,511],7452:[461,19,600,16,584]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/PhoneticExtensions.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/SpacingModLetters.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/SpacingModLetters.js
new file mode 100644
index 0000000..ddd67b7
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/SpacingModLetters.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/SpacingModLetters.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{688:[842,-335,378,6,365],689:[848,-336,378,7,365],690:[868,-179,300,25,273],691:[699,-335,270,12,266],692:[690,-326,292,10,264],693:[690,-163,319,10,342],694:[684,-345,404,20,397],695:[681,-331,550,23,528],696:[690,-179,380,16,374],697:[684,-421,208,30,216],698:[684,-421,356,19,364],699:[685,-350,333,39,223],700:[686,-351,333,39,223],701:[686,-351,250,39,223],702:[662,-382,334,65,250],703:[662,-382,334,65,250],704:[690,-240,353,30,333],705:[690,-240,353,30,333],706:[760,-414,317,30,297],707:[760,-414,317,30,297],708:[720,-453,317,-14,332],709:[720,-453,317,-14,332],710:[704,-528,333,-2,335],711:[704,-528,333,-2,335],712:[720,-455,279,112,167],713:[637,-565,370,20,350],714:[713,-528,266,20,258],715:[713,-528,266,20,258],716:[70,195,278,112,167],717:[-88,160,370,20,350],718:[-7,192,333,15,253],719:[-7,192,333,80,318],720:[474,-4,333,79,254],721:[474,-294,333,79,254],722:[378,-62,333,65,268],723:[378,-62,333,65,268],724:[206,-4,333,51,281],725:[206,-4,333,51,281],726:[227,-9,334,61,273],727:[150,-84,334,61,273],728:[691,-528,333,15,318],729:[666,-537,333,102,231],730:[750,-537,333,60,273],731:[44,173,333,90,319],732:[674,-547,333,-16,349],733:[713,-528,333,-13,425],734:[481,-186,292,0,302],735:[744,-506,260,10,250],736:[684,-190,420,10,410],737:[842,-335,190,5,186],738:[695,-320,300,19,278],739:[690,-335,380,12,376],740:[855,-335,328,20,323],741:[676,0,405,40,368],742:[676,0,405,40,368],743:[676,0,405,40,368],744:[676,0,405,40,368],745:[676,0,405,40,368],748:[70,167,314,5,309],749:[720,-528,395,5,390]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/SpacingModLetters.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/SuperAndSubscripts.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/SuperAndSubscripts.js
new file mode 100644
index 0000000..bcc5a60
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/SuperAndSubscripts.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/SuperAndSubscripts.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{8319:[700,-275,491,15,478]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/SuperAndSubscripts.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/SuppMathOperators.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/SuppMathOperators.js
new file mode 100644
index 0000000..45de095
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/SuppMathOperators.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/SuppMathOperators.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold"],{10764:[824,320,1484,32,1664],10765:[824,320,593,32,733],10766:[824,320,593,32,733],10767:[824,320,593,32,733],10768:[824,320,593,32,733],10769:[824,320,593,32,733],10770:[824,320,613,32,733],10771:[824,320,593,32,733],10772:[824,320,675,32,735],10773:[824,320,593,32,733],10774:[824,320,623,32,733],10775:[824,320,791,32,871],10776:[824,320,633,32,733],10777:[824,320,653,32,733],10778:[824,320,653,32,733],10779:[959,320,557,32,737],10780:[824,455,557,32,737],10786:[894,57,750,65,685],10787:[736,57,750,65,685],10788:[746,57,750,65,685],10789:[563,287,750,65,685],10790:[563,240,750,65,685],10791:[563,247,780,65,778],10794:[297,37,750,66,685],10795:[543,37,750,66,685],10800:[745,33,702,66,636],10801:[538,191,702,66,636],10802:[538,59,702,66,636],10815:[676,0,734,27,707],10846:[887,28,640,52,588],10851:[536,379,640,52,588],10854:[399,161,750,68,682],10855:[775,-27,750,68,682],10858:[565,-132,750,67,682],10861:[759,60,750,68,683],10862:[884,-107,750,68,682],10863:[752,-26,750,68,683],10864:[680,176,750,68,683],10865:[665,159,750,65,685],10866:[665,159,750,65,685],10867:[568,60,750,67,682],10877:[648,140,750,80,670],10878:[648,140,750,80,670],10887:[646,213,750,80,670],10888:[646,213,750,80,670],10889:[792,305,750,67,682],10890:[792,305,750,67,682],10901:[648,140,750,80,670],10902:[648,140,750,80,670],10909:[689,183,750,67,682],10910:[689,183,750,67,682],10927:[619,111,750,80,670],10928:[619,111,750,80,670],10941:[547,13,750,82,668],10942:[547,13,750,82,668],10949:[730,222,750,80,670],10950:[730,222,750,80,670]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Bold/SuppMathOperators.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/AlphaPresentForms.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/AlphaPresentForms.js
new file mode 100644
index 0000000..5d13315
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/AlphaPresentForms.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/AlphaPresentForms.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold-italic"],{64256:[698,205,613,-169,726],64257:[703,205,556,-188,514],64258:[704,205,556,-186,553],64259:[703,205,856,-169,814],64260:[704,205,854,-169,851]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/BoldItalic/AlphaPresentForms.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/BasicLatin.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/BasicLatin.js
new file mode 100644
index 0000000..392375f
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/BasicLatin.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/BasicLatin.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold-italic"],{32:[0,0,250,0,0],33:[684,13,389,67,370],34:[685,-398,555,136,536],35:[700,0,500,-32,532],36:[733,100,500,-20,497],37:[706,29,757,80,707],38:[682,19,849,76,771],39:[685,-398,278,128,268],40:[685,179,333,28,344],41:[685,179,333,-44,271],42:[685,-252,500,101,492],43:[506,0,570,33,537],44:[134,182,250,-60,144],45:[282,-166,333,2,271],46:[135,13,250,-9,139],47:[685,18,278,-64,342],48:[683,14,500,17,477],49:[683,0,500,5,419],50:[683,0,500,-27,446],51:[683,13,500,-14,450],52:[683,0,500,-15,503],53:[669,13,500,-11,486],54:[679,15,500,23,509],55:[669,0,500,52,525],56:[683,13,500,3,476],57:[683,10,500,-12,475],58:[459,13,333,23,264],59:[459,183,333,-25,264],60:[518,12,570,31,539],61:[399,-107,570,33,537],62:[518,12,570,31,539],63:[684,13,500,79,470],64:[685,18,939,118,825],65:[683,0,667,-68,593],66:[669,0,667,-25,624],67:[685,18,667,32,677],68:[669,0,722,-46,685],69:[669,0,667,-27,653],70:[669,0,667,-13,660],71:[685,18,722,21,705],72:[669,0,778,-24,799],73:[669,0,389,-32,406],74:[669,99,500,-46,524],75:[669,0,667,-21,702],76:[669,0,611,-22,590],77:[669,12,889,-29,917],78:[669,15,722,-27,748],79:[685,18,722,27,691],80:[669,0,611,-28,613],81:[685,208,722,27,691],82:[669,0,667,-28,623],83:[685,18,556,2,526],84:[669,0,611,49,650],85:[669,18,722,67,744],86:[669,18,667,66,715],87:[669,18,889,64,940],88:[669,0,667,-24,694],89:[669,0,611,71,659],90:[669,0,611,-12,589],91:[674,159,333,-37,362],92:[685,18,278,-1,279],93:[674,157,333,-56,343],94:[669,-304,570,67,503],95:[-75,125,500,0,500],96:[697,-516,333,85,297],97:[462,14,500,-21,456],98:[699,13,500,-14,444],99:[462,13,444,-5,392],100:[699,13,500,-21,517],101:[462,13,444,5,398],102:[698,205,333,-169,446],103:[462,203,500,-52,477],104:[699,9,556,-13,498],105:[684,9,278,2,262],106:[685,207,278,-189,279],107:[699,8,500,-23,483],108:[699,9,278,2,290],109:[462,9,778,-14,723],110:[462,9,556,-6,494],111:[462,13,500,-3,441],112:[462,205,500,-120,446],113:[462,205,500,1,471],114:[462,0,389,-21,389],115:[462,13,389,-19,333],116:[594,9,278,-11,281],117:[462,9,556,15,493],118:[462,13,444,15,401],119:[462,13,667,15,614],120:[462,13,500,-45,469],121:[462,205,444,-94,392],122:[449,78,389,-43,368],123:[686,187,348,4,436],124:[685,18,220,66,154],125:[686,187,348,-129,303],126:[331,-175,570,54,516]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/BoldItalic/BasicLatin.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/BoxDrawing.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/BoxDrawing.js
new file mode 100644
index 0000000..1443a62
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/BoxDrawing.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/BoxDrawing.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold-italic"],{9472:[340,-267,708,-11,719],9474:[910,303,696,312,385],9484:[340,303,708,318,720],9488:[340,303,708,-11,390],9492:[910,-267,708,318,720],9496:[910,-267,708,-11,390],9500:[910,303,708,318,720],9508:[910,303,708,-11,390],9516:[340,303,708,-11,719],9524:[910,-267,708,-11,719],9532:[910,303,708,-11,719],9552:[433,-174,708,-11,719],9553:[910,303,708,225,484],9554:[433,303,708,318,720],9555:[340,303,708,225,720],9556:[433,303,708,225,719],9557:[433,303,708,-11,390],9558:[340,303,708,-11,483],9559:[433,303,708,-11,483],9560:[910,-174,708,318,720],9561:[910,-267,708,225,720],9562:[910,-174,708,225,719],9563:[910,-174,708,-11,390],9564:[910,-267,708,-11,483],9565:[910,-174,708,-11,483],9566:[910,303,708,318,720],9567:[910,303,708,225,720],9568:[910,303,708,225,720],9569:[910,303,708,-11,390],9570:[910,303,708,-11,483],9571:[910,303,708,-11,483],9572:[433,303,708,-11,719],9573:[340,303,708,-11,719],9574:[433,303,708,-11,719],9575:[910,-174,708,-11,719],9576:[910,-267,708,-11,719],9577:[910,-174,708,-11,719],9578:[910,303,708,-11,719],9579:[910,303,708,-11,719],9580:[910,303,708,-11,719]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/BoldItalic/BoxDrawing.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/CombDiactForSymbols.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/CombDiactForSymbols.js
new file mode 100644
index 0000000..caa69c8
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/CombDiactForSymbols.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/CombDiactForSymbols.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold-italic"],{8413:[760,254,0,-753,256]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/BoldItalic/CombDiactForSymbols.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/ControlPictures.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/ControlPictures.js
new file mode 100644
index 0000000..98f68bf
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/ControlPictures.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/ControlPictures.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold-italic"],{9251:[31,120,500,40,460]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/BoldItalic/ControlPictures.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/CurrencySymbols.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/CurrencySymbols.js
new file mode 100644
index 0000000..9c8da2c
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/CurrencySymbols.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/CurrencySymbols.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold-italic"],{8355:[669,0,668,-13,661],8356:[683,12,500,-32,510],8359:[669,13,1229,-28,1173],8364:[681,17,562,34,546]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/BoldItalic/CurrencySymbols.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/Cyrillic.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/Cyrillic.js
new file mode 100644
index 0000000..356fbee
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/Cyrillic.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/Cyrillic.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold-italic"],{1025:[905,0,667,-35,645],1026:[669,205,789,80,737],1027:[947,0,604,-32,658],1028:[685,18,657,44,689],1029:[685,18,556,-22,502],1030:[669,0,389,-32,406],1031:[905,0,389,-35,477],1032:[669,99,500,-8,562],1033:[669,18,954,-59,896],1034:[669,0,982,-32,924],1035:[669,0,830,71,757],1036:[947,0,678,-35,697],1038:[951,18,666,99,712],1039:[669,184,778,-33,791],1040:[683,0,667,-57,604],1041:[669,0,635,-18,629],1042:[669,0,654,-25,624],1043:[669,0,604,-32,658],1044:[669,184,696,-115,718],1045:[669,0,667,-35,645],1046:[678,0,927,-63,969],1047:[686,18,561,-10,549],1048:[669,0,768,-33,790],1049:[948,0,768,-33,790],1050:[678,0,678,-35,697],1051:[669,18,742,-59,764],1052:[669,12,890,-34,912],1053:[669,0,769,-32,791],1054:[685,18,722,53,717],1055:[669,0,767,-35,789],1056:[669,0,590,-30,611],1057:[685,18,667,65,710],1058:[669,0,611,80,681],1059:[669,18,666,99,712],1060:[669,0,833,72,816],1061:[669,0,607,-61,657],1062:[669,184,770,-32,792],1063:[669,0,758,120,780],1064:[669,0,960,-33,982],1065:[669,184,960,-33,982],1066:[669,0,780,107,722],1067:[669,0,985,-19,1007],1068:[669,0,636,-19,578],1069:[685,18,671,4,648],1070:[685,18,905,-38,871],1071:[669,0,710,-65,732],1072:[462,14,527,20,497],1073:[685,13,499,32,570],1074:[462,13,482,25,458],1075:[461,14,368,-8,371],1076:[695,13,496,22,466],1077:[462,13,431,22,415],1078:[462,13,898,-4,890],1079:[462,13,400,-11,378],1080:[462,9,542,34,512],1081:[697,9,542,34,514],1082:[461,8,522,12,527],1083:[462,11,507,-48,477],1084:[449,11,667,-48,637],1085:[462,9,543,13,513],1086:[462,13,500,24,468],1087:[462,9,543,13,513],1088:[462,205,497,-96,470],1089:[462,13,435,26,423],1090:[462,9,777,10,747],1091:[462,205,447,-94,422],1092:[699,205,750,28,717],1093:[462,13,456,-38,511],1094:[462,179,542,34,512],1095:[462,9,531,48,501],1096:[462,9,800,36,770],1097:[462,179,800,36,770],1098:[462,13,594,29,556],1099:[462,13,754,43,724],1100:[462,13,491,43,453],1101:[462,13,444,-12,405],1102:[462,13,740,12,710],1103:[449,11,538,2,508],1105:[655,13,434,22,487],1106:[699,205,523,12,490],1107:[697,14,368,-8,456],1108:[462,13,415,22,450],1109:[462,13,389,0,352],1110:[684,9,278,20,280],1111:[655,9,278,22,382],1112:[685,207,278,-161,307],1113:[462,13,694,-48,656],1114:[462,13,733,12,695],1115:[699,9,556,12,515],1116:[697,8,522,12,527],1118:[697,205,447,-94,436],1119:[462,179,538,30,508],1122:[669,0,761,62,707],1123:[699,13,569,20,531],1130:[669,0,978,-22,918],1131:[449,13,844,-4,825],1138:[685,18,722,53,717],1139:[462,13,500,24,468],1140:[678,18,667,66,750],1141:[462,13,487,15,534],1168:[834,0,539,-32,641],1169:[590,9,360,31,457]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/BoldItalic/Cyrillic.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/EnclosedAlphanum.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/EnclosedAlphanum.js
new file mode 100644
index 0000000..cb48609
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/EnclosedAlphanum.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/EnclosedAlphanum.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold-italic"],{9312:[690,19,695,0,695],9313:[690,19,695,0,695],9314:[690,19,695,0,695],9315:[690,19,695,0,695],9316:[690,19,695,0,695],9317:[690,19,695,0,695],9318:[690,19,695,0,695],9319:[690,19,695,0,695],9320:[690,19,695,0,695],9398:[690,19,695,0,695],9399:[690,19,695,0,695],9400:[690,19,695,0,695],9401:[690,19,695,0,695],9402:[690,19,695,0,695],9403:[690,19,695,0,695],9404:[690,19,695,0,695],9405:[690,19,695,0,695],9406:[690,19,695,0,695],9407:[690,19,695,0,695],9408:[690,19,695,0,695],9409:[690,19,695,0,695],9410:[690,19,695,0,695],9411:[690,19,695,0,695],9412:[690,19,695,0,695],9413:[690,19,695,0,695],9414:[690,19,695,0,695],9415:[690,19,695,0,695],9416:[690,19,695,0,695],9417:[690,19,695,0,695],9418:[690,19,695,0,695],9419:[690,19,695,0,695],9420:[690,19,695,0,695],9421:[690,19,695,0,695],9422:[690,19,695,0,695],9423:[690,19,695,0,695],9424:[690,19,695,0,695],9425:[690,19,695,0,695],9426:[690,19,695,0,695],9427:[690,19,695,0,695],9428:[690,19,695,0,695],9429:[690,19,695,0,695],9430:[690,19,695,0,695],9431:[690,19,695,0,695],9432:[690,19,695,0,695],9433:[690,19,695,0,695],9434:[690,19,695,0,695],9435:[690,19,695,0,695],9436:[690,19,695,0,695],9437:[690,19,695,0,695],9438:[690,19,695,0,695],9439:[690,19,695,0,695],9440:[690,19,695,0,695],9441:[690,19,695,0,695],9442:[690,19,695,0,695],9443:[690,19,695,0,695],9444:[690,19,695,0,695],9445:[690,19,695,0,695],9446:[690,19,695,0,695],9447:[690,19,695,0,695],9448:[690,19,695,0,695],9449:[690,19,695,0,695],9450:[690,19,695,0,695]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/BoldItalic/EnclosedAlphanum.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GeneralPunctuation.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GeneralPunctuation.js
new file mode 100644
index 0000000..a582f29
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GeneralPunctuation.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GeneralPunctuation.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold-italic"],{8208:[282,-166,333,-4,273],8209:[282,-166,333,-4,273],8210:[282,-166,500,-40,477],8211:[269,-178,500,-40,477],8212:[269,-178,1000,-40,977],8216:[685,-369,333,128,332],8217:[685,-369,333,98,302],8218:[134,182,333,-5,199],8219:[685,-369,333,128,302],8220:[685,-369,500,53,513],8221:[685,-369,500,53,513],8222:[134,182,500,-57,403],8223:[685,-369,500,92,513],8224:[685,145,500,91,494],8225:[685,139,500,10,493],8226:[462,-42,560,70,490],8230:[135,13,1000,40,852],8240:[706,29,1118,80,1068],8241:[706,29,1480,80,1430],8249:[415,-32,333,32,303],8250:[415,-32,333,10,281],8254:[637,-565,500,0,500],8260:[688,12,183,-168,345]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/BoldItalic/GeneralPunctuation.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GreekAndCoptic.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GreekAndCoptic.js
new file mode 100644
index 0000000..8143e81
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GreekAndCoptic.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GreekAndCoptic.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold-italic"],{900:[680,-516,300,140,319],901:[680,-516,380,27,440],902:[693,0,667,-68,593],903:[459,-311,333,116,264],904:[693,0,700,10,748],905:[693,0,850,9,889],906:[693,0,450,9,503],908:[693,18,722,11,691],910:[693,0,700,8,855],911:[693,0,808,25,774],912:[680,9,278,6,419],913:[683,0,667,-68,593],914:[669,0,667,-25,624],915:[669,0,585,-13,670],916:[683,0,667,-65,549],917:[669,0,667,-27,653],918:[669,0,611,-12,589],919:[669,0,778,-24,799],920:[685,18,718,27,691],921:[669,0,389,-32,406],922:[669,0,667,-21,702],923:[683,0,655,-68,581],924:[669,12,889,-29,917],925:[669,15,722,-27,748],926:[669,0,746,25,740],927:[685,18,722,27,691],928:[669,0,778,-24,799],929:[669,0,611,-28,613],931:[669,0,633,-11,619],932:[669,0,611,49,650],933:[685,0,611,21,697],934:[669,0,771,26,763],935:[669,0,667,-24,694],936:[685,0,661,17,780],937:[685,0,808,25,774],938:[905,0,389,-32,486],939:[905,0,611,21,697],940:[680,13,576,-3,574],941:[680,13,454,-5,408],942:[680,205,488,-7,474],943:[680,9,278,2,286],944:[680,13,536,-7,500],945:[462,13,576,-3,574],946:[698,205,500,-79,480],947:[462,204,438,3,461],948:[698,13,496,-3,456],949:[462,13,454,-5,408],950:[698,205,415,-5,473],951:[462,205,488,-7,474],952:[698,13,501,-3,488],953:[462,9,278,2,238],954:[462,12,500,-23,504],955:[698,18,484,-34,459],956:[449,205,523,-82,483],957:[462,13,469,-23,441],958:[698,205,415,-5,426],959:[462,13,500,-3,441],960:[449,15,558,-6,570],961:[462,205,495,-81,447],962:[462,205,415,-5,447],963:[449,13,499,-3,536],964:[449,9,415,4,455],965:[462,13,536,-7,477],966:[462,205,678,-3,619],967:[462,205,404,-136,515],968:[462,205,652,-5,715],969:[462,13,735,-3,676],970:[655,9,278,2,351],971:[655,13,536,-7,477],972:[680,13,500,-3,441],973:[680,13,536,-7,477],974:[680,13,735,-3,676],976:[696,12,500,42,479],977:[698,13,582,8,589],978:[685,0,611,21,696],981:[699,205,678,-3,619],982:[449,13,828,-2,844],984:[685,200,722,27,691],985:[462,205,500,-3,441],986:[685,205,669,32,665],987:[492,205,475,-5,509],988:[669,0,667,-13,670],989:[450,190,525,32,507],990:[793,18,757,-7,758],991:[698,0,485,16,466],992:[685,205,734,27,710],993:[639,205,530,47,467],1008:[462,15,569,-50,592],1009:[462,206,517,-12,458],1012:[685,18,722,27,691],1013:[463,13,466,-3,429],1014:[460,16,486,-5,427]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/BoldItalic/GreekAndCoptic.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GreekBoldItalic.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GreekBoldItalic.js
new file mode 100644
index 0000000..df9154f
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GreekBoldItalic.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GreekBoldItalic.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold-italic"],{120604:[685,0,759,39,724],120605:[669,0,726,42,715],120606:[669,0,634,42,749],120607:[685,0,632,32,589],120608:[669,0,732,42,754],120609:[669,0,797,66,830],120610:[669,0,891,42,946],120611:[685,16,783,55,755],120612:[669,0,502,42,557],120613:[669,0,795,42,839],120614:[685,0,759,39,724],120615:[669,0,1016,42,1071],120616:[669,0,869,42,924],120617:[669,0,718,57,757],120618:[685,16,777,55,755],120619:[669,0,887,39,942],120620:[669,0,612,42,733],120621:[685,16,783,55,755],120622:[669,0,759,64,787],120623:[669,0,568,28,700],120624:[685,0,589,31,721],120625:[669,0,827,28,799],120626:[669,0,808,28,830],120627:[685,0,694,30,781],120628:[685,0,826,57,815],120629:[669,16,632,43,600],120630:[461,12,624,44,630],120631:[685,205,555,28,583],120632:[462,203,490,44,503],120633:[685,8,538,44,538],120634:[462,10,495,28,451],120635:[685,203,472,44,522],120636:[462,205,517,33,511],120637:[686,11,566,44,555],120638:[462,9,318,55,274],120639:[462,0,560,55,577],120640:[685,16,570,55,537],120641:[449,205,636,33,603],120642:[459,10,523,55,534],120643:[685,203,476,28,487],120644:[462,10,561,44,539],120645:[449,13,579,39,590],120646:[462,205,595,33,562],120647:[462,203,480,39,508],120648:[449,10,592,44,603],120649:[449,7,469,33,502],120650:[462,10,552,33,535],120651:[462,205,706,55,667],120652:[462,204,621,33,676],120653:[462,205,701,33,756],120654:[462,10,687,22,665],120655:[686,10,559,44,559],120656:[461,10,481,44,481],120657:[698,13,607,33,584],120658:[462,15,607,-12,630],120659:[685,205,683,44,655],120660:[462,205,585,44,563],120661:[449,10,868,33,879]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/BoldItalic/GreekBoldItalic.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GreekSSBoldItalic.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GreekSSBoldItalic.js
new file mode 100644
index 0000000..9f3f2c5
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GreekSSBoldItalic.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GreekSSBoldItalic.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold-italic"],{120720:[690,0,690,25,665],120721:[676,0,706,60,671],120722:[676,0,602,60,705],120723:[690,0,720,40,680],120724:[676,0,683,60,708],120725:[676,0,707,25,769],120726:[676,0,748,60,783],120727:[691,19,847,90,822],120728:[676,0,435,50,505],120729:[676,0,712,60,796],120730:[690,0,686,20,646],120731:[676,0,933,60,981],120732:[676,18,744,60,792],120733:[676,0,690,47,737],120734:[692,18,849,90,824],120735:[676,0,745,60,783],120736:[676,0,581,60,675],120737:[691,19,847,90,822],120738:[676,0,696,21,748],120739:[676,0,641,87,715],120740:[691,0,671,91,799],120741:[676,0,835,72,835],120742:[676,0,740,20,833],120743:[691,0,791,125,901],120744:[691,0,816,47,816],120745:[664,30,780,120,760],120746:[473,14,678,47,703],120747:[692,205,552,-12,581],120748:[473,204,525,84,571],120749:[692,14,507,30,547],120750:[473,14,504,45,508],120751:[692,205,480,49,539],120752:[473,205,532,38,525],120753:[692,14,560,65,553],120754:[462,14,325,56,302],120755:[473,0,537,38,582],120756:[692,14,574,18,540],120757:[462,205,594,-12,569],120758:[473,14,525,41,565],120759:[692,205,481,43,525],120760:[473,14,543,45,515],120761:[462,14,632,45,656],120762:[473,205,560,-33,536],120763:[473,205,517,52,554],120764:[462,14,614,45,639],120765:[462,14,523,42,547],120766:[473,14,550,61,526],120767:[473,205,683,55,659],120768:[473,205,575,-80,626],120769:[473,205,703,75,751],120770:[461,14,756,64,732],120771:[691,14,548,45,539],120772:[473,14,468,45,470],120773:[692,14,579,54,579],120774:[473,10,646,-10,665],120775:[692,205,678,48,654],120776:[473,205,544,38,520],120777:[462,14,889,40,912]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/BoldItalic/GreekSSBoldItalic.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/IPAExtensions.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/IPAExtensions.js
new file mode 100644
index 0000000..9773768
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/IPAExtensions.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/IPAExtensions.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold-italic"],{592:[473,14,512,13,492],593:[473,14,612,25,592],594:[473,14,612,25,592],595:[691,13,500,-14,449],596:[462,13,444,-5,392],597:[462,157,444,-5,406],598:[699,233,500,-21,517],599:[683,13,570,-21,653],600:[462,13,444,5,421],601:[462,13,444,5,398],602:[462,13,626,5,626],603:[475,14,444,5,482],604:[475,14,480,5,469],605:[475,14,689,5,689],606:[475,14,486,7,475],607:[462,207,367,-100,364],608:[683,245,720,-52,751],609:[472,245,549,-52,520],610:[462,11,561,21,544],611:[462,234,444,20,400],612:[450,10,493,10,488],613:[459,249,556,-13,498],614:[683,9,556,-13,498],615:[683,205,533,-13,475],616:[684,9,278,-10,262],617:[456,8,253,2,237],618:[462,0,304,-32,321],619:[699,9,320,9,368],620:[699,9,445,17,417],621:[699,233,291,-47,290],622:[699,236,623,2,585],623:[462,9,778,-14,723],624:[462,233,778,-14,723],625:[462,233,759,-14,704],626:[462,233,694,-109,632],627:[462,233,505,-6,486],628:[462,12,588,-27,614],629:[462,13,500,-3,441],630:[462,5,749,23,751],631:[477,2,685,-3,626],632:[685,231,691,-3,632],633:[462,0,427,0,410],634:[699,0,493,0,476],635:[462,233,436,0,417],636:[462,233,389,-87,389],637:[462,233,389,-47,389],638:[484,0,360,-21,417],639:[484,0,338,10,292],640:[464,0,498,8,515],641:[464,0,498,8,597],642:[462,218,389,-32,333],643:[683,233,424,-104,584],644:[683,207,394,-90,576],645:[470,233,415,79,344],646:[683,243,521,-40,641],647:[513,90,310,7,299],648:[594,233,311,-60,281],649:[462,9,556,-16,514],650:[452,8,500,15,552],651:[462,10,534,18,492],652:[462,13,444,15,401],653:[462,13,667,15,614],654:[667,0,444,16,502],655:[464,0,633,65,606],656:[449,218,440,-24,405],657:[449,97,411,-24,376],658:[450,236,499,-10,558],659:[450,307,499,-10,528],660:[685,0,530,25,520],661:[685,0,530,65,509],662:[669,14,487,25,453],663:[462,237,479,20,544],664:[680,17,723,13,734],665:[464,0,493,-10,486],666:[475,14,465,16,504],667:[538,11,580,29,690],668:[464,0,582,21,676],669:[685,233,475,-50,463],670:[457,250,500,22,528],671:[464,0,485,10,468],672:[582,205,488,1,674],673:[685,0,530,25,520],674:[685,0,530,65,507],675:[699,13,750,-21,735],676:[699,236,820,-21,813],677:[699,97,817,-21,743],678:[594,13,560,-3,524],679:[683,233,453,-30,670],680:[594,18,600,-3,618]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/BoldItalic/IPAExtensions.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/Latin1Supplement.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/Latin1Supplement.js
new file mode 100644
index 0000000..f9e62c8
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/Latin1Supplement.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/Latin1Supplement.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold-italic"],{160:[0,0,250,0,0],161:[494,205,389,19,320],162:[576,143,500,42,439],163:[683,12,500,-32,510],164:[542,10,500,-26,526],165:[669,0,500,33,628],166:[685,18,220,66,154],167:[685,143,500,36,459],168:[655,-525,333,55,397],169:[685,18,747,30,718],170:[685,-399,266,16,330],171:[415,-32,500,12,468],172:[399,-108,606,51,555],173:[282,-166,333,2,271],174:[685,18,747,30,718],175:[623,-553,333,51,393],176:[688,-402,400,83,369],177:[568,0,570,33,537],178:[683,-274,300,2,313],179:[683,-265,300,17,321],180:[697,-516,333,139,379],181:[449,207,576,-60,516],182:[669,193,617,60,679],183:[405,-257,250,51,199],184:[5,218,333,-80,156],185:[683,-274,300,30,301],186:[685,-400,300,56,347],187:[415,-32,500,12,468],188:[683,14,750,7,721],189:[683,14,750,-9,723],190:[683,14,750,7,726],191:[492,205,500,30,421],192:[947,0,667,-68,593],193:[947,0,667,-68,593],194:[940,0,667,-68,593],195:[905,0,667,-68,612],196:[905,0,667,-68,599],197:[1004,0,667,-68,593],198:[669,0,944,-64,918],199:[685,218,667,32,677],200:[947,0,667,-27,653],201:[947,0,667,-27,653],202:[940,0,667,-27,653],203:[905,0,667,-27,653],204:[947,0,389,-32,406],205:[947,0,389,-32,440],206:[940,0,389,-32,469],207:[905,0,389,-32,480],208:[669,0,722,-31,700],209:[905,15,722,-27,748],210:[947,18,722,27,691],211:[947,18,722,27,691],212:[940,18,722,27,691],213:[905,18,722,27,691],214:[905,18,722,27,691],215:[490,-16,570,48,522],216:[764,125,722,27,691],217:[947,18,722,67,744],218:[947,18,722,67,744],219:[940,18,722,67,744],220:[905,18,722,67,744],221:[947,0,611,71,659],222:[669,0,611,-27,573],223:[705,200,500,-200,473],224:[697,14,500,-21,456],225:[697,14,500,-21,456],226:[690,14,500,-21,475],227:[655,14,500,-21,497],228:[655,14,500,-21,485],229:[756,14,500,-21,456],230:[462,13,722,-5,673],231:[462,218,444,-24,392],232:[697,13,444,5,398],233:[697,13,444,5,419],234:[690,13,444,5,462],235:[655,13,444,5,470],236:[697,9,278,2,294],237:[697,9,278,2,310],238:[690,9,278,2,353],239:[655,9,278,2,362],240:[699,13,500,-3,454],241:[655,9,556,-6,507],242:[697,13,500,-3,441],243:[697,13,500,-3,441],244:[690,13,500,-3,462],245:[655,13,500,-3,485],246:[655,13,500,-3,470],247:[535,29,570,33,537],248:[560,119,500,-3,441],249:[697,9,556,15,493],250:[697,9,556,15,493],251:[690,9,556,15,493],252:[655,9,556,15,493],253:[697,205,444,-94,401],254:[699,205,500,-120,446],255:[655,205,444,-94,460]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/BoldItalic/Latin1Supplement.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LatinExtendedA.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LatinExtendedA.js
new file mode 100644
index 0000000..1369982
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LatinExtendedA.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LatinExtendedA.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold-italic"],{256:[793,0,667,-68,593],257:[586,14,500,-21,486],258:[885,0,667,-68,593],259:[678,14,500,-21,483],260:[683,173,667,-68,640],261:[462,173,500,-21,507],262:[904,18,667,32,677],263:[697,13,444,-5,392],264:[897,18,667,32,677],265:[690,13,444,-5,415],266:[862,18,667,32,677],267:[655,13,444,-5,392],268:[897,18,667,32,677],269:[690,13,444,-5,437],270:[897,0,722,-46,685],271:[710,13,658,-21,726],272:[669,0,722,-31,700],273:[699,13,500,-21,541],274:[793,0,667,-27,653],275:[586,13,444,5,431],276:[885,0,667,-27,653],277:[678,13,444,5,478],278:[862,0,667,-27,653],279:[655,13,444,5,398],280:[669,182,667,-27,653],281:[462,182,444,5,398],282:[897,0,667,-27,653],283:[690,13,444,5,486],284:[897,18,722,21,705],285:[690,203,500,-52,477],286:[885,18,722,21,705],287:[678,203,500,-52,477],288:[862,18,722,21,705],289:[655,203,500,-52,477],290:[685,359,722,21,705],291:[832,203,500,-52,477],292:[897,0,778,-24,799],293:[897,9,556,-13,498],294:[669,0,778,-24,800],295:[699,9,556,-13,498],296:[862,0,389,-32,470],297:[655,9,278,-9,350],298:[793,0,389,-32,451],299:[586,9,278,-11,331],300:[885,0,389,-32,458],301:[678,9,278,2,328],302:[669,173,389,-32,406],303:[684,173,278,2,262],304:[862,0,389,-32,406],305:[462,9,278,2,238],306:[669,99,823,-32,913],307:[685,207,552,2,544],308:[897,99,500,-46,554],309:[690,207,278,-189,314],310:[669,359,667,-21,702],311:[699,359,500,-23,483],312:[470,0,600,6,689],313:[904,0,611,-22,590],314:[904,9,278,2,344],315:[669,359,611,-22,590],316:[699,359,278,-62,290],317:[685,0,611,-22,667],318:[710,9,451,2,499],319:[669,0,611,-22,590],320:[699,9,375,2,382],321:[669,0,611,-22,590],322:[699,9,278,-13,301],323:[904,15,722,-27,748],324:[697,9,556,-6,494],325:[669,359,722,-27,748],326:[462,359,556,-6,494],327:[897,15,722,-27,748],328:[690,9,556,-6,506],329:[710,9,700,42,657],330:[669,203,722,-46,685],331:[462,207,543,-6,474],332:[793,18,722,27,691],333:[586,13,500,-3,461],334:[885,18,722,27,691],335:[678,13,500,-3,488],336:[904,18,722,27,700],337:[697,13,500,-3,519],338:[677,8,944,23,946],339:[462,13,722,6,674],340:[904,0,667,-28,623],341:[697,0,389,-21,389],342:[669,359,667,-28,623],343:[462,359,389,-102,389],344:[897,0,667,-28,623],345:[690,0,389,-21,411],346:[904,18,556,2,526],347:[697,13,389,-19,379],348:[897,18,556,2,526],349:[690,13,389,-19,367],350:[685,218,556,2,526],351:[462,218,389,-19,333],352:[897,18,556,2,526],353:[690,13,389,-19,411],354:[669,218,611,49,650],355:[594,218,278,-75,289],356:[897,0,611,49,650],357:[710,9,411,-11,499],358:[669,0,611,49,650],359:[594,9,278,-30,281],360:[841,18,722,67,744],361:[655,9,556,15,493],362:[793,18,722,67,744],363:[586,9,556,15,493],364:[885,18,722,67,744],365:[678,9,556,15,493],366:[921,18,722,67,744],367:[729,9,556,15,493],368:[889,18,722,67,744],369:[697,9,556,15,527],370:[669,173,722,67,744],371:[462,173,556,15,531],372:[897,18,889,64,940],373:[690,13,667,15,614],374:[897,0,611,71,659],375:[690,205,444,-94,393],376:[862,0,611,71,659],377:[904,0,611,-12,589],378:[697,78,389,-43,379],379:[862,0,611,-12,589],380:[655,78,389,-43,368],381:[897,0,611,-12,589],382:[690,78,389,-43,411],383:[691,0,333,14,536]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/BoldItalic/LatinExtendedA.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LatinExtendedAdditional.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LatinExtendedAdditional.js
new file mode 100644
index 0000000..2e90d2c
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LatinExtendedAdditional.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LatinExtendedAdditional.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold-italic"],{7808:[904,18,889,64,940],7809:[697,13,667,15,614],7810:[904,18,889,64,940],7811:[697,13,667,15,614],7812:[862,18,889,64,940],7813:[655,13,667,15,614],7922:[904,0,611,71,659],7923:[697,205,444,-94,392]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/BoldItalic/LatinExtendedAdditional.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LatinExtendedB.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LatinExtendedB.js
new file mode 100644
index 0000000..881f277
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LatinExtendedB.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LatinExtendedB.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold-italic"],{384:[699,13,500,-14,444],392:[576,13,560,-5,627],400:[686,4,512,54,676],402:[707,156,500,-87,537],405:[699,10,735,-13,692],409:[691,8,500,-23,483],410:[699,9,278,2,290],411:[666,0,480,16,452],414:[462,205,536,-6,474],416:[716,18,722,27,806],417:[507,13,537,24,595],421:[673,205,520,-100,466],426:[684,233,400,46,380],427:[594,218,286,-49,289],429:[691,9,360,-3,450],431:[803,18,775,67,893],432:[583,9,556,15,656],442:[450,237,496,-52,458],443:[683,0,500,-27,469],446:[541,10,500,37,463],448:[740,0,208,14,278],449:[740,0,345,14,415],450:[740,0,368,14,438],451:[684,13,300,45,355],496:[690,207,350,-104,474],506:[972,0,667,-68,593],507:[909,14,500,-21,456],508:[904,0,944,-64,918],509:[697,13,722,-5,673],510:[904,125,722,27,691],511:[697,119,500,-3,441],567:[462,207,278,-189,239]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/BoldItalic/LatinExtendedB.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LetterlikeSymbols.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LetterlikeSymbols.js
new file mode 100644
index 0000000..82b9ae1
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LetterlikeSymbols.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LetterlikeSymbols.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold-italic"],{8450:[685,14,713,35,704],8453:[683,14,847,52,795],8458:[462,224,819,27,771],8459:[699,21,1171,65,1154],8461:[669,0,773,21,808],8464:[699,21,997,47,977],8466:[699,21,1036,40,1015],8467:[699,14,500,43,632],8469:[669,0,760,27,783],8470:[675,15,1055,24,1031],8473:[669,0,497,18,715],8474:[685,74,754,35,734],8475:[699,21,1048,55,973],8477:[669,0,727,18,718],8482:[676,-271,1000,24,977],8484:[669,0,807,23,837],8492:[699,21,1060,55,985],8495:[462,14,726,35,648],8496:[699,21,826,95,791],8497:[699,21,1042,65,1025],8499:[699,21,1300,60,1245],8500:[462,14,848,35,780],8508:[449,13,730,32,715],8511:[669,0,796,35,821],8517:[669,0,748,18,733],8518:[699,13,633,45,698],8519:[462,13,575,45,540],8520:[669,0,379,40,413],8521:[669,205,421,-93,455]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/BoldItalic/LetterlikeSymbols.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/Main.js
new file mode 100644
index 0000000..3dcee94
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold-italic"]={directory:"General/BoldItalic",family:"STIXGeneral",weight:"bold",style:"italic",Ranges:[[0,127,"BasicLatin"],[160,255,"Latin1Supplement"],[256,383,"LatinExtendedA"],[384,591,"LatinExtendedB"],[592,687,"IPAExtensions"],[688,767,"SpacingModLetters"],[880,1023,"GreekAndCoptic"],[1024,1279,"Cyrillic"],[7680,7935,"LatinExtendedAdditional"],[8192,8303,"GeneralPunctuation"],[8352,8399,"CurrencySymbols"],[8400,8447,"CombDiactForSymbols"],[8448,8527,"LetterlikeSymbols"],[8704,8959,"MathOperators"],[9216,9279,"ControlPictures"],[9312,9471,"EnclosedAlphanum"],[9472,9599,"BoxDrawing"],[64256,64335,"AlphaPresentForms"],[119912,119963,"MathBoldItalic"],[120016,120067,"MathBoldScript"],[120380,120431,"MathSSItalicBold"],[120604,120661,"GreekBoldItalic"],[120720,120777,"GreekSSBoldItalic"]]};MathJax.OutputJax["HTML-CSS"].initFont("STIXGeneral-bold-italic");MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/BoldItalic/Main.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathBoldItalic.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathBoldItalic.js
new file mode 100644
index 0000000..3b025f0
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathBoldItalic.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathBoldItalic.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold-italic"],{119912:[685,0,759,39,724],119913:[669,0,726,42,715],119914:[685,12,701,55,745],119915:[669,0,818,42,790],119916:[669,0,732,42,754],119917:[669,0,635,44,750],119918:[685,12,768,55,768],119919:[669,0,891,42,946],119920:[669,0,502,42,557],119921:[669,12,558,66,646],119922:[669,0,795,42,839],119923:[669,0,744,42,700],119924:[669,0,1016,42,1071],119925:[669,0,869,42,924],119926:[685,16,777,55,755],119927:[669,0,612,42,733],119928:[685,154,810,55,756],119929:[669,0,801,42,784],119930:[685,10,671,55,704],119931:[669,0,568,28,700],119932:[669,10,733,72,810],119933:[669,15,593,66,797],119934:[669,17,925,66,1129],119935:[669,0,808,28,830],119936:[669,0,549,39,725],119937:[669,0,797,66,830],119938:[462,10,581,44,548],119939:[685,8,509,50,487],119940:[462,10,477,44,460],119941:[685,14,595,44,589],119942:[462,10,498,44,459],119943:[685,207,572,44,632],119944:[462,203,527,22,527],119945:[685,10,576,50,543],119946:[620,9,357,55,300],119947:[620,207,431,-18,414],119948:[685,11,580,55,563],119949:[685,9,346,50,310],119950:[467,9,760,33,727],119951:[467,10,559,33,526],119952:[462,10,561,44,539],119953:[469,205,571,-33,554],119954:[462,205,526,44,532],119955:[467,0,441,33,424],119956:[462,11,474,55,419],119957:[592,10,351,44,318],119958:[463,10,535,33,502],119959:[473,14,554,52,539],119960:[473,14,814,52,799],119961:[462,8,587,33,543],119962:[462,205,519,35,522],119963:[462,19,531,35,499]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/BoldItalic/MathBoldItalic.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathBoldScript.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathBoldScript.js
new file mode 100644
index 0000000..56f3954
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathBoldScript.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathBoldScript.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold-italic"],{120016:[699,21,984,50,955],120017:[699,21,1060,55,985],120018:[699,21,912,60,877],120019:[699,21,991,60,906],120020:[699,21,826,95,791],120021:[699,21,1042,65,1025],120022:[699,21,834,82,799],120023:[699,21,1171,65,1154],120024:[699,21,997,47,977],120025:[699,224,906,19,886],120026:[699,21,1154,45,1130],120027:[699,21,1036,40,1015],120028:[699,21,1300,60,1245],120029:[699,21,1095,60,1078],120030:[699,21,809,72,749],120031:[699,21,1025,55,994],120032:[699,52,809,72,749],120033:[699,21,1048,55,973],120034:[699,21,816,81,781],120035:[699,21,1030,65,1025],120036:[699,21,964,60,904],120037:[699,21,1040,60,1024],120038:[699,21,1320,60,1306],120039:[699,21,1033,64,1010],120040:[699,224,989,60,963],120041:[699,21,996,50,976],120042:[462,14,942,35,865],120043:[699,14,646,60,624],120044:[462,14,764,35,683],120045:[699,14,949,28,912],120046:[462,14,726,35,648],120047:[699,205,768,25,749],120048:[462,224,819,27,771],120049:[699,14,838,55,758],120050:[698,14,558,40,534],120051:[698,224,840,41,823],120052:[699,14,810,55,730],120053:[699,14,650,43,632],120054:[462,14,1137,45,1057],120055:[462,14,851,45,771],120056:[462,14,848,35,780],120057:[462,205,885,25,770],120058:[462,205,913,35,833],120059:[462,0,677,40,648],120060:[557,14,562,51,449],120061:[669,14,618,47,612],120062:[449,14,842,31,762],120063:[458,14,732,40,670],120064:[458,14,1012,40,950],120065:[462,14,820,63,740],120066:[449,224,784,40,711],120067:[493,14,782,61,702]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/BoldItalic/MathBoldScript.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathOperators.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathOperators.js
new file mode 100644
index 0000000..aef8170
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathOperators.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathOperators.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold-italic"],{8706:[686,10,559,44,559],8722:[297,-209,606,51,555]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/BoldItalic/MathOperators.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathSSItalicBold.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathSSItalicBold.js
new file mode 100644
index 0000000..a1eb070
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathSSItalicBold.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathSSItalicBold.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold-italic"],{120380:[690,0,690,25,665],120381:[676,0,636,80,691],120382:[691,19,723,119,797],120383:[676,0,709,80,772],120384:[676,0,635,80,728],120385:[676,0,582,80,725],120386:[691,19,746,107,785],120387:[676,0,715,80,803],120388:[676,0,440,79,534],120389:[676,96,481,15,574],120390:[676,0,712,80,816],120391:[676,0,603,80,612],120392:[676,0,913,80,1001],120393:[676,18,724,80,812],120394:[692,18,778,106,840],120395:[676,0,581,80,695],120396:[691,176,779,105,839],120397:[676,0,670,80,698],120398:[691,19,554,66,637],120399:[676,0,641,157,785],120400:[676,19,699,123,792],120401:[676,18,690,193,833],120402:[676,15,997,198,1135],120403:[676,0,740,40,853],120404:[676,0,694,188,842],120405:[676,0,653,25,769],120406:[473,14,489,48,507],120407:[676,13,512,51,558],120408:[473,14,462,71,524],120409:[676,14,518,69,625],120410:[473,13,452,71,492],120411:[692,0,340,72,533],120412:[473,206,504,2,599],120413:[676,0,510,55,542],120414:[688,0,245,59,366],120415:[688,202,324,-90,440],120416:[676,0,519,55,599],120417:[676,0,235,55,348],120418:[473,0,776,55,809],120419:[473,0,510,55,542],120420:[473,14,501,72,542],120421:[473,205,512,3,559],120422:[473,205,512,69,574],120423:[473,0,411,55,519],120424:[473,13,385,37,442],120425:[631,12,386,98,447],120426:[462,15,518,81,569],120427:[462,14,462,129,561],120428:[462,14,701,131,798],120429:[462,0,506,20,582],120430:[462,204,472,-27,569],120431:[462,0,441,21,530]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/BoldItalic/MathSSItalicBold.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/SpacingModLetters.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/SpacingModLetters.js
new file mode 100644
index 0000000..0ffb559
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/SpacingModLetters.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/SpacingModLetters.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-bold-italic"],{688:[852,-328,380,7,365],689:[841,-329,380,7,365],690:[1017,-331,350,24,384],691:[690,-344,389,21,384],692:[690,-344,389,2,365],693:[690,-171,389,2,371],694:[684,-345,390,5,466],695:[690,-331,450,15,467],696:[690,-176,350,11,386],699:[685,-369,333,128,332],704:[690,-240,343,-3,323],705:[690,-240,326,20,364],710:[690,-516,333,40,367],711:[690,-516,333,79,411],728:[678,-516,333,71,387],729:[655,-525,333,163,293],730:[754,-541,333,127,340],731:[44,173,333,-40,189],732:[655,-536,333,48,407],733:[697,-516,333,69,498],736:[684,-190,379,14,423],737:[857,-329,222,2,217],738:[690,-331,280,8,274],739:[690,-335,389,3,387],740:[849,-329,328,9,364],748:[70,167,314,5,309],749:[720,-528,395,5,390]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/BoldItalic/SpacingModLetters.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/AlphaPresentForms.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/AlphaPresentForms.js
new file mode 100644
index 0000000..75da5cd
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/AlphaPresentForms.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/AlphaPresentForms.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-italic"],{64256:[678,207,527,-147,673],64257:[681,207,500,-141,481],64258:[682,204,500,-141,518],64259:[681,207,744,-147,725],64260:[682,207,745,-147,763]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Italic/AlphaPresentForms.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/BoxDrawing.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/BoxDrawing.js
new file mode 100644
index 0000000..7132760
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/BoxDrawing.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/BoxDrawing.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-italic"],{9472:[340,-267,708,-11,719],9474:[910,303,708,317,390],9484:[340,303,708,317,720],9488:[340,303,708,-11,390],9492:[910,-267,708,317,720],9496:[910,-267,708,-11,390],9500:[910,303,708,317,719],9508:[910,303,708,-11,390],9516:[340,303,708,-11,719],9524:[910,-267,708,-11,719],9532:[910,303,708,-11,719],9552:[433,-174,708,-11,719],9553:[910,303,708,225,483],9554:[433,303,708,317,720],9555:[340,303,708,225,720],9556:[433,303,708,225,719],9557:[433,303,708,-11,390],9558:[340,303,708,-11,483],9559:[433,303,708,-11,483],9560:[910,-174,708,317,720],9561:[910,-267,708,225,720],9562:[910,-174,708,225,719],9563:[910,-174,708,-11,390],9564:[910,-267,708,-11,483],9565:[910,-174,708,-11,483],9566:[910,303,708,317,720],9567:[910,303,708,225,720],9568:[910,303,708,225,720],9569:[910,303,708,-11,390],9570:[910,303,708,-11,483],9571:[910,303,708,-11,483],9572:[433,303,708,-11,719],9573:[340,303,708,-11,719],9574:[433,303,708,-11,719],9575:[910,-174,708,-11,719],9576:[910,-267,708,-11,719],9577:[910,-174,708,-11,719],9578:[910,303,708,-11,719],9579:[910,303,708,-11,719],9580:[910,303,708,-11,719]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Italic/BoxDrawing.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/CombDiactForSymbols.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/CombDiactForSymbols.js
new file mode 100644
index 0000000..20fb878
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/CombDiactForSymbols.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/CombDiactForSymbols.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-italic"],{8400:[760,-627,0,-453,-17],8401:[760,-627,0,-426,10],8402:[662,156,0,-300,-234],8406:[760,-548,0,-453,-17],8407:[760,-548,0,-453,-17],8411:[622,-523,0,-453,44],8412:[622,-523,0,-582,114],8413:[725,221,0,-723,223],8417:[760,-548,0,-453,25],8420:[1023,155,0,-970,490],8421:[662,156,0,-430,-24],8422:[662,156,0,-351,-86],8423:[725,178,0,-595,221],8424:[-119,218,0,-462,35],8425:[681,-538,0,-478,55],8426:[419,-87,0,-793,153],8428:[681,-548,0,-453,-17],8429:[681,-548,0,-453,-17],8430:[-40,252,0,-453,-17],8431:[-40,252,0,-453,-17]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Italic/CombDiactForSymbols.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/ControlPictures.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/ControlPictures.js
new file mode 100644
index 0000000..e53f665
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/ControlPictures.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/ControlPictures.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-italic"],{9251:[16,120,500,40,460]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Italic/ControlPictures.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/CurrencySymbols.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/CurrencySymbols.js
new file mode 100644
index 0000000..4c1d67c
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/CurrencySymbols.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/CurrencySymbols.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-italic"],{8355:[653,0,611,8,645],8356:[670,8,500,10,517],8359:[653,13,1149,0,1126],8364:[664,12,500,16,538]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Italic/CurrencySymbols.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/Cyrillic.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/Cyrillic.js
new file mode 100644
index 0000000..e95c7c5
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/Cyrillic.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/Cyrillic.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-italic"],{1025:[856,0,611,1,631],1026:[653,208,723,70,663],1027:[914,0,569,-36,603],1028:[666,18,657,67,680],1029:[667,18,500,7,498],1030:[653,0,333,-7,382],1031:[856,0,333,-31,433],1032:[653,18,444,-34,463],1033:[653,16,961,-35,901],1034:[653,0,966,-28,906],1035:[653,0,786,70,701],1036:[914,0,621,-28,657],1038:[887,14,656,110,716],1039:[653,179,722,-25,747],1040:[668,0,611,-49,566],1041:[653,0,590,-28,603],1042:[653,0,597,-23,571],1043:[653,0,569,-36,603],1044:[653,179,655,-103,696],1045:[653,0,611,1,631],1046:[661,0,956,-55,972],1047:[668,16,564,9,548],1048:[653,0,708,-25,749],1049:[887,0,708,-25,749],1050:[661,0,621,-28,657],1051:[653,16,699,-35,740],1052:[653,0,814,-33,855],1053:[653,0,708,-26,749],1054:[667,18,712,60,699],1055:[653,0,704,-29,745],1056:[653,0,568,-24,578],1057:[666,18,667,67,690],1058:[653,0,556,70,644],1059:[653,14,656,110,716],1060:[653,0,772,73,758],1061:[653,0,575,-67,617],1062:[653,179,706,-25,747],1063:[653,0,622,54,663],1064:[653,0,936,-14,977],1065:[653,179,936,-14,977],1066:[653,0,695,63,652],1067:[653,0,852,-28,893],1068:[653,0,597,-28,537],1069:[666,18,658,15,636],1070:[666,18,877,-32,850],1071:[653,0,635,-49,676],1072:[441,11,514,23,482],1073:[683,11,498,36,535],1074:[441,11,442,31,423],1075:[441,11,390,1,384],1076:[683,11,489,30,470],1077:[441,11,440,34,422],1078:[441,11,799,0,791],1079:[441,11,376,-18,357],1080:[441,11,527,29,495],1081:[667,11,527,29,495],1082:[441,11,491,18,485],1083:[441,12,474,-44,442],1084:[432,12,633,-45,601],1085:[441,9,504,20,472],1086:[441,11,489,29,470],1087:[441,9,511,19,479],1088:[441,205,483,-77,464],1089:[441,11,441,27,422],1090:[441,9,741,17,709],1091:[441,206,421,-61,389],1092:[683,205,702,29,677],1093:[441,11,444,-35,439],1094:[441,182,527,29,495],1095:[441,9,482,42,450],1096:[441,11,785,31,753],1097:[441,182,785,31,753],1098:[441,11,567,12,528],1099:[441,11,689,50,657],1100:[441,11,471,50,433],1101:[441,11,408,7,391],1102:[441,11,674,21,655],1103:[432,9,481,-25,449],1105:[606,11,440,34,475],1106:[683,208,479,20,448],1107:[664,11,390,1,455],1108:[441,11,428,26,441],1109:[442,13,389,-9,341],1110:[654,11,278,43,258],1111:[606,11,278,43,357],1112:[652,207,278,-172,231],1113:[441,12,679,-44,631],1114:[441,11,697,21,649],1115:[683,9,511,20,479],1116:[664,11,491,18,485],1118:[667,206,421,-61,417],1119:[441,182,527,29,495],1122:[653,0,681,19,621],1123:[683,11,542,13,504],1130:[653,0,953,-55,893],1131:[432,11,741,0,686],1138:[667,18,712,60,699],1139:[441,11,489,29,470],1140:[662,18,646,76,742],1141:[441,18,464,34,528],1168:[783,0,524,-30,622],1169:[507,11,337,42,404]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Italic/Cyrillic.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/EnclosedAlphanum.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/EnclosedAlphanum.js
new file mode 100644
index 0000000..62bf396
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/EnclosedAlphanum.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/EnclosedAlphanum.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-italic"],{9312:[676,14,684,0,684],9313:[676,14,684,0,684],9314:[676,14,684,0,684],9315:[676,14,684,0,684],9316:[676,14,684,0,684],9317:[676,14,684,0,684],9318:[676,14,684,0,684],9319:[676,14,684,0,684],9320:[676,14,684,0,684],9398:[676,14,684,0,684],9399:[676,14,684,0,684],9400:[676,14,684,0,684],9401:[676,14,684,0,684],9402:[676,14,684,0,684],9403:[676,14,684,0,684],9404:[676,14,684,0,684],9405:[676,14,684,0,684],9406:[676,14,684,0,684],9407:[676,14,684,0,684],9408:[676,14,684,0,684],9409:[676,14,684,0,684],9410:[676,14,684,0,684],9411:[676,14,684,0,684],9412:[676,14,684,0,684],9413:[676,14,684,0,684],9414:[676,14,684,0,684],9415:[676,14,684,0,684],9416:[676,14,684,0,684],9417:[676,14,684,0,684],9418:[676,14,684,0,684],9419:[676,14,684,0,684],9420:[676,14,684,0,684],9421:[676,14,684,0,684],9422:[676,14,684,0,684],9423:[676,14,684,0,684],9424:[676,14,684,0,684],9425:[676,14,684,0,684],9426:[676,14,684,0,684],9427:[676,14,684,0,684],9428:[676,14,684,0,684],9429:[676,14,684,0,684],9430:[676,14,684,0,684],9431:[676,14,684,0,684],9432:[676,14,684,0,684],9433:[676,14,684,0,684],9434:[676,14,684,0,684],9435:[676,14,684,0,684],9436:[676,14,684,0,684],9437:[676,14,684,0,684],9438:[676,14,684,0,684],9439:[676,14,684,0,684],9440:[676,14,684,0,684],9441:[676,14,684,0,684],9442:[676,14,684,0,684],9443:[676,14,684,0,684],9444:[676,14,684,0,684],9445:[676,14,684,0,684],9446:[676,14,684,0,684],9447:[676,14,684,0,684],9448:[676,14,684,0,684],9449:[676,14,684,0,684],9450:[676,14,684,0,684]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Italic/EnclosedAlphanum.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/GeneralPunctuation.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/GeneralPunctuation.js
new file mode 100644
index 0000000..4b8d538
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/GeneralPunctuation.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/GeneralPunctuation.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-italic"],{8208:[257,-191,333,49,282],8209:[257,-191,333,49,282],8210:[258,-192,500,-8,508],8211:[243,-197,500,-6,505],8212:[243,-197,889,-6,894],8216:[666,-436,333,171,310],8217:[666,-436,333,151,290],8218:[101,129,333,44,183],8219:[666,-436,333,169,290],8220:[666,-436,556,166,514],8221:[666,-436,556,151,499],8222:[101,129,556,57,405],8223:[666,-436,556,169,499],8224:[666,159,500,101,488],8225:[666,143,500,22,491],8226:[444,-59,523,70,455],8230:[100,11,889,57,762],8240:[706,19,1117,80,1067],8241:[706,19,1479,80,1429],8249:[403,-37,333,51,281],8250:[403,-37,333,52,282],8254:[582,-532,500,0,500],8260:[676,10,167,-169,337]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Italic/GeneralPunctuation.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/GreekAndCoptic.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/GreekAndCoptic.js
new file mode 100644
index 0000000..7c802d8
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/GreekAndCoptic.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/GreekAndCoptic.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-italic"],{900:[649,-494,289,160,322],901:[649,-494,333,70,387],902:[678,0,611,-51,564],903:[441,-330,333,150,261],904:[678,0,630,7,679],905:[678,0,740,4,821],906:[678,0,350,3,429],908:[678,18,722,58,699],910:[678,0,580,8,725],911:[678,0,762,-6,739],912:[649,11,278,49,387],913:[668,0,611,-51,564],914:[653,0,611,-8,588],917:[653,0,611,-1,634],918:[653,0,556,-6,606],919:[653,0,722,-8,769],921:[653,0,333,-8,384],922:[653,0,667,7,722],924:[653,0,833,-18,872],925:[653,15,667,-20,727],927:[667,18,722,60,699],929:[653,0,611,0,605],932:[653,0,556,59,633],935:[653,0,611,-29,655],938:[856,0,333,-8,460],939:[856,0,556,78,648],940:[649,11,552,27,549],941:[649,11,444,30,425],942:[649,205,474,14,442],943:[649,11,278,49,288],944:[649,10,478,19,446],970:[606,11,278,49,359],971:[606,10,478,19,446],972:[649,11,500,27,468],973:[649,10,478,19,446],974:[649,11,686,27,654],976:[694,10,456,45,436],978:[668,0,596,78,693],984:[667,205,722,60,699],985:[441,205,500,27,468],986:[666,207,673,55,665],987:[458,185,444,30,482],988:[653,0,557,8,645],989:[433,190,487,32,472],990:[773,18,645,19,675],991:[683,0,457,31,445],992:[666,207,708,7,668],993:[552,210,528,93,448],1008:[441,13,533,-16,559],1012:[667,18,722,60,699],1014:[441,11,444,24,414]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Italic/GreekAndCoptic.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/GreekItalic.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/GreekItalic.js
new file mode 100644
index 0000000..86d24bd
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/GreekItalic.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/GreekItalic.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-italic"],{120546:[667,0,717,35,685],120547:[653,0,696,38,686],120548:[653,0,616,38,721],120549:[667,0,596,30,556],120550:[653,0,714,38,734],120551:[653,0,772,60,802],120552:[653,0,873,38,923],120553:[669,11,737,50,712],120554:[653,0,480,38,530],120555:[653,0,762,38,802],120556:[667,0,718,35,686],120557:[653,0,1005,38,1055],120558:[653,0,851,38,901],120559:[653,0,706,52,741],120560:[669,11,732,50,712],120561:[653,0,873,38,923],120562:[653,0,594,38,704],120563:[669,11,737,50,712],120564:[653,0,735,58,760],120565:[653,0,550,25,670],120566:[668,0,567,28,687],120567:[653,0,772,25,747],120568:[653,0,790,25,810],120569:[667,0,670,28,743],120570:[666,0,800,32,777],120571:[653,15,627,42,600],120572:[441,10,524,40,529],120573:[668,183,493,25,518],120574:[441,187,428,35,458],120575:[668,11,463,40,451],120576:[441,11,484,25,444],120577:[668,183,435,40,480],120578:[441,183,460,30,455],120579:[668,11,484,40,474],120580:[441,11,267,50,227],120581:[441,0,534,50,549],120582:[668,16,541,50,511],120583:[428,183,579,30,549],120584:[446,9,452,50,462],120585:[668,183,433,25,443],120586:[441,11,458,40,438],120587:[428,13,558,35,568],120588:[441,183,502,30,472],120589:[490,183,439,35,464],120590:[428,11,537,40,547],120591:[428,5,442,30,472],120592:[439,11,460,30,445],120593:[441,183,666,50,631],120594:[441,202,595,30,645],120595:[441,183,661,30,711],120596:[441,11,681,20,661],120597:[668,11,471,40,471],120598:[441,11,430,40,430],120599:[678,10,554,20,507],120600:[441,13,561,12,587],120601:[668,183,645,40,620],120602:[441,187,509,40,489],120603:[428,11,856,30,866]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Italic/GreekItalic.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/IPAExtensions.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/IPAExtensions.js
new file mode 100644
index 0000000..1b9e738
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/IPAExtensions.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/IPAExtensions.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-italic"],{592:[460,10,444,19,421],593:[460,10,511,17,487],594:[460,10,511,17,487],595:[683,11,500,23,488],596:[441,11,444,30,425],597:[441,160,444,-3,425],598:[683,233,500,15,527],599:[683,13,500,15,748],600:[441,11,444,31,416],601:[441,11,444,31,412],602:[441,11,639,31,639],603:[475,14,444,31,467],604:[475,14,480,31,447],605:[475,14,666,31,666],606:[475,14,490,30,458],607:[441,207,357,-100,340],608:[683,212,714,8,799],609:[482,212,595,8,579],610:[441,11,562,52,562],611:[441,234,444,15,426],612:[450,10,480,4,475],613:[450,242,500,19,478],614:[683,9,500,19,494],615:[683,233,500,-6,494],616:[654,11,278,16,264],617:[454,10,333,51,266],618:[441,0,247,-8,298],619:[683,11,278,4,331],620:[683,11,375,12,366],621:[683,233,252,8,279],622:[683,233,575,41,537],623:[441,9,722,12,704],624:[441,233,722,12,704],625:[441,233,690,12,672],626:[441,233,606,-110,580],627:[441,233,498,14,487],628:[441,8,539,-20,599],629:[441,11,500,27,468],630:[441,6,718,49,738],631:[475,4,668,30,638],632:[683,233,660,30,630],633:[441,0,402,-45,322],634:[683,0,383,-45,384],635:[441,233,353,-45,342],636:[441,233,333,-20,412],637:[441,233,390,24,412],638:[470,0,401,45,424],639:[470,0,338,66,293],640:[464,0,475,25,501],641:[464,0,475,25,581],642:[442,218,389,9,376],643:[683,233,415,-110,577],644:[683,233,453,-110,595],645:[470,233,339,79,355],646:[683,243,439,-62,602],647:[460,97,330,38,296],648:[546,233,278,6,308],649:[441,11,500,9,479],650:[450,10,537,49,552],651:[441,10,500,52,475],652:[441,18,444,20,426],653:[441,18,667,15,648],654:[647,0,444,10,460],655:[464,0,633,62,603],656:[428,218,405,17,429],657:[428,47,393,17,380],658:[450,233,413,21,517],659:[450,305,457,7,544],660:[683,0,500,55,509],661:[683,0,500,55,495],662:[662,14,393,-25,413],663:[441,238,450,24,459],664:[679,17,723,22,704],665:[464,0,460,19,505],666:[475,14,479,20,470],667:[515,11,570,29,650],668:[464,0,572,25,671],669:[652,233,403,-80,394],670:[439,255,463,26,473],671:[464,0,470,25,473],672:[582,209,480,25,666],673:[683,0,500,55,509],674:[683,0,500,55,495],675:[683,13,743,15,741],676:[683,233,743,15,780],677:[683,47,754,15,741],678:[546,11,500,38,523],679:[683,233,517,-32,655],680:[546,16,632,38,612]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Italic/IPAExtensions.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/Latin1Supplement.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/Latin1Supplement.js
new file mode 100644
index 0000000..394e41a
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/Latin1Supplement.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/Latin1Supplement.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-italic"],{160:[0,0,250,0,0],161:[474,205,389,59,321],162:[560,143,500,77,472],163:[670,8,500,10,517],164:[534,10,500,-22,522],165:[653,0,500,28,605],166:[666,18,275,105,171],167:[666,162,500,53,461],168:[606,-508,333,107,405],169:[666,18,760,41,719],170:[676,-406,276,42,352],171:[403,-37,500,53,445],172:[386,-108,675,86,590],173:[255,-192,333,49,282],174:[666,18,760,41,719],175:[583,-532,333,99,411],176:[676,-390,400,101,387],177:[568,0,675,86,590],178:[676,-271,300,33,324],179:[676,-268,300,43,339],180:[664,-494,333,180,403],181:[428,209,500,-30,497],182:[653,123,559,60,621],183:[310,-199,250,70,181],184:[0,217,333,-30,182],185:[676,-271,300,43,284],186:[676,-406,310,67,362],187:[403,-37,500,55,447],188:[676,10,750,33,736],189:[676,10,750,34,749],190:[676,10,750,23,736],191:[473,205,500,28,367],192:[914,0,611,-51,564],193:[914,0,611,-51,564],194:[911,0,611,-51,564],195:[874,0,611,-51,572],196:[856,0,611,-51,564],197:[957,0,611,-51,564],198:[653,0,889,-27,911],199:[666,217,667,66,689],200:[914,0,611,-1,634],201:[914,0,611,-1,634],202:[911,0,611,-1,634],203:[856,0,611,-1,634],204:[914,0,333,-8,398],205:[914,0,333,-8,414],206:[911,0,333,-8,450],207:[856,0,333,-8,457],208:[653,0,722,-8,700],209:[874,15,667,-20,727],210:[914,18,722,60,699],211:[914,18,722,60,699],212:[911,18,722,60,699],213:[874,18,722,60,699],214:[856,18,722,60,699],215:[497,-8,675,93,582],216:[722,105,722,60,699],217:[914,18,722,102,765],218:[914,18,722,102,765],219:[911,18,722,102,765],220:[856,18,722,102,765],221:[914,0,556,78,633],222:[653,0,611,0,569],223:[679,207,500,-168,493],224:[664,11,501,17,476],225:[664,11,501,17,476],226:[661,11,501,17,497],227:[624,11,501,17,521],228:[606,11,501,17,503],229:[709,11,501,17,476],230:[441,11,667,23,640],231:[441,217,444,26,425],232:[664,11,444,31,414],233:[664,11,444,31,431],234:[661,11,444,31,466],235:[606,11,444,31,475],236:[664,11,278,47,302],237:[664,11,278,47,318],238:[661,11,278,47,351],239:[606,11,278,47,361],240:[683,11,500,27,482],241:[624,9,500,14,488],242:[664,11,500,27,468],243:[664,11,500,27,468],244:[661,11,500,27,468],245:[624,11,500,27,494],246:[606,11,500,27,474],247:[517,11,675,86,590],248:[554,135,500,28,469],249:[664,11,500,42,475],250:[664,11,500,42,475],251:[661,11,500,42,475],252:[606,11,500,42,475],253:[664,206,444,-24,426],254:[683,205,500,-75,469],255:[606,206,444,-24,442]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Italic/Latin1Supplement.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LatinExtendedA.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LatinExtendedA.js
new file mode 100644
index 0000000..2cc96e8
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LatinExtendedA.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LatinExtendedA.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-italic"],{256:[757,0,611,-51,564],257:[543,11,501,17,481],258:[862,0,611,-51,564],259:[650,11,501,17,481],260:[668,169,611,-51,626],261:[441,169,501,17,529],262:[876,18,667,66,689],263:[664,11,444,30,431],264:[875,18,667,66,689],265:[661,11,444,30,427],266:[818,18,667,66,689],267:[606,11,444,30,425],268:[875,18,667,66,689],269:[661,11,444,30,473],270:[875,0,722,-8,700],271:[691,13,609,15,697],272:[653,0,722,-8,700],273:[683,13,500,15,580],274:[757,0,611,-1,634],275:[542,11,444,31,466],276:[866,0,611,-1,634],277:[650,11,444,31,471],278:[818,0,611,-1,634],279:[606,11,444,31,412],280:[653,175,611,-1,634],281:[441,175,444,31,412],282:[875,0,611,-1,634],283:[661,11,444,31,502],284:[877,18,722,52,722],285:[661,206,500,8,471],286:[866,18,722,52,722],287:[650,206,500,8,476],288:[818,18,722,52,722],289:[606,206,500,8,471],290:[666,267,722,52,722],291:[724,206,500,8,471],292:[875,0,722,-8,769],293:[875,9,500,19,478],294:[653,0,722,-8,769],295:[683,9,500,19,478],296:[836,0,333,-8,444],297:[624,11,278,30,357],298:[757,0,333,-8,439],299:[543,11,278,29,341],300:[866,0,333,-8,448],301:[650,11,278,46,347],302:[653,169,333,-8,384],303:[654,169,278,49,303],304:[818,0,333,-8,384],306:[653,18,750,-8,783],307:[654,207,500,49,500],308:[877,18,444,-6,536],309:[661,207,278,-124,353],310:[653,267,667,7,722],311:[683,267,444,14,461],312:[459,0,542,5,601],313:[876,0,556,-8,559],314:[876,11,278,41,348],315:[653,267,556,-8,559],316:[683,267,278,7,279],317:[666,0,556,-8,595],318:[693,11,278,41,448],319:[653,0,556,-8,559],320:[683,11,323,41,386],321:[653,0,556,-8,559],322:[683,11,278,37,307],323:[876,15,667,-20,727],324:[664,9,500,14,474],325:[653,267,667,-20,727],326:[441,267,500,14,474],327:[875,15,667,-20,727],328:[661,9,500,14,475],329:[691,9,577,58,540],330:[666,18,722,-8,700],331:[441,208,500,14,442],332:[757,18,722,60,699],333:[543,11,500,27,511],334:[866,18,722,60,709],335:[650,11,500,27,533],336:[876,18,722,60,720],337:[664,11,500,27,541],338:[666,8,944,49,964],339:[441,12,667,20,646],340:[876,0,611,-13,588],341:[664,0,389,45,412],342:[653,267,611,-13,588],343:[441,267,389,-2,412],344:[875,0,611,-13,588],345:[663,0,389,45,426],346:[876,18,500,17,508],347:[664,13,389,16,403],348:[877,18,500,17,508],349:[661,13,389,16,385],350:[667,217,500,17,508],351:[442,217,389,16,366],352:[875,18,500,17,532],353:[663,13,389,16,426],354:[653,217,556,59,633],355:[546,217,278,-38,296],356:[875,0,556,59,633],357:[693,11,278,38,453],358:[653,0,556,59,633],359:[546,11,278,28,296],360:[836,18,722,102,765],361:[624,11,500,42,475],362:[757,18,722,102,765],363:[543,11,500,42,475],364:[866,18,722,102,765],365:[650,11,500,42,480],366:[907,18,722,102,765],367:[691,11,500,42,475],368:[876,18,722,102,765],369:[664,11,500,42,511],370:[653,169,722,102,765],371:[441,169,500,42,538],372:[877,18,833,71,906],373:[661,18,667,15,648],374:[877,0,556,78,633],375:[661,206,444,-24,426],376:[818,0,556,78,633],377:[876,0,556,-6,606],378:[664,81,389,-2,390],379:[818,0,556,-6,606],380:[606,81,389,-2,380],381:[875,0,556,-6,606],382:[663,81,389,-2,426],383:[683,0,383,13,513]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Italic/LatinExtendedA.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LatinExtendedAdditional.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LatinExtendedAdditional.js
new file mode 100644
index 0000000..5143ab3
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LatinExtendedAdditional.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LatinExtendedAdditional.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-italic"],{7808:[880,18,833,71,906],7809:[664,18,667,15,648],7810:[876,18,833,71,906],7811:[664,18,667,15,648],7812:[818,18,833,71,906],7813:[606,18,667,15,648],7922:[880,0,556,78,633],7923:[664,206,444,-24,426]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Italic/LatinExtendedAdditional.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LatinExtendedB.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LatinExtendedB.js
new file mode 100644
index 0000000..9f868cb
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LatinExtendedB.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LatinExtendedB.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-italic"],{384:[683,11,500,23,473],392:[548,11,500,30,577],400:[684,6,667,66,671],402:[706,159,472,-62,494],405:[683,10,672,19,654],409:[683,11,500,14,490],410:[683,11,278,41,279],411:[668,0,490,30,478],414:[441,233,500,14,442],416:[691,18,722,60,783],417:[467,11,534,27,583],421:[669,205,504,-75,472],426:[685,233,340,31,319],427:[546,218,278,-54,296],429:[683,11,310,38,452],431:[765,18,754,102,881],432:[543,11,573,42,607],442:[450,234,500,8,462],443:[676,0,500,12,500],446:[539,12,500,47,453],448:[736,0,170,15,258],449:[736,0,290,15,379],450:[736,0,340,15,429],451:[667,11,333,39,304],496:[661,207,278,-124,397],506:[950,0,611,-51,564],507:[860,11,501,17,476],508:[876,0,889,-27,911],509:[664,11,667,23,640],510:[876,105,722,60,699],511:[664,135,500,28,469]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Italic/LatinExtendedB.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LetterlikeSymbols.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LetterlikeSymbols.js
new file mode 100644
index 0000000..60b2e38
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LetterlikeSymbols.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LetterlikeSymbols.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-italic"],{8450:[666,18,702,35,702],8453:[676,14,855,47,808],8458:[441,219,738,30,678],8459:[687,15,997,53,991],8461:[653,0,732,17,767],8462:[668,11,513,45,483],8464:[675,15,897,26,888],8466:[687,15,946,33,931],8469:[653,0,727,25,755],8470:[668,15,1046,19,1031],8473:[653,0,687,17,686],8474:[666,71,723,35,713],8475:[687,15,944,34,876],8477:[653,0,687,17,686],8482:[653,-247,980,30,957],8484:[653,0,754,7,750],8492:[687,15,950,34,902],8495:[441,11,627,30,554],8496:[687,15,750,100,734],8497:[680,0,919,43,907],8499:[674,15,1072,38,1056],8500:[441,11,697,30,680],8508:[428,12,635,40,630],8511:[653,0,750,30,780],8517:[653,0,713,17,703],8518:[683,11,581,40,634],8519:[441,11,515,40,485],8520:[653,0,293,27,346],8521:[653,217,341,-104,394]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Italic/LetterlikeSymbols.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/Main.js
new file mode 100644
index 0000000..588819e
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-italic"]={directory:"General/Italic",family:"STIXGeneral",style:"italic",Ranges:[[160,255,"Latin1Supplement"],[256,383,"LatinExtendedA"],[384,591,"LatinExtendedB"],[592,687,"IPAExtensions"],[688,767,"SpacingModLetters"],[880,1023,"GreekAndCoptic"],[1024,1279,"Cyrillic"],[7680,7935,"LatinExtendedAdditional"],[8192,8303,"GeneralPunctuation"],[8352,8399,"CurrencySymbols"],[8400,8447,"CombDiactForSymbols"],[8448,8527,"LetterlikeSymbols"],[8704,8959,"MathOperators"],[9216,9279,"ControlPictures"],[9312,9471,"EnclosedAlphanum"],[9472,9599,"BoxDrawing"],[64256,64335,"AlphaPresentForms"],[119860,119911,"MathItalic"],[119964,120015,"MathScript"],[120328,120379,"MathSSItalic"],[120484,120485,"ij"],[120546,120603,"GreekItalic"]],32:[0,0,250,0,0],33:[667,11,333,39,304],34:[666,-421,420,144,432],35:[676,0,501,2,540],36:[731,89,500,32,497],37:[706,19,755,80,705],38:[666,18,778,76,723],39:[666,-421,214,132,241],40:[669,181,333,42,315],41:[669,180,333,16,289],42:[666,-255,500,128,492],43:[506,0,675,86,590],44:[101,129,250,-5,135],45:[255,-192,333,49,282],46:[100,11,250,27,138],47:[666,18,278,-65,386],48:[676,7,500,32,497],49:[676,0,500,50,409],50:[676,0,500,12,452],51:[676,7,500,16,465],52:[676,0,500,1,479],53:[666,7,500,15,491],54:[686,7,500,30,521],55:[666,8,500,75,537],56:[676,7,500,30,493],57:[676,17,500,23,492],58:[441,11,333,50,261],59:[441,129,333,26,261],60:[516,10,675,84,592],61:[386,-120,675,86,590],62:[516,10,675,84,592],63:[664,12,500,132,472],64:[666,18,920,118,806],65:[668,0,611,-51,564],66:[653,0,611,-8,588],67:[666,18,667,66,689],68:[653,0,722,-8,700],69:[653,0,611,-1,634],70:[653,0,611,8,645],71:[666,18,722,52,722],72:[653,0,722,-8,769],73:[653,0,333,-8,384],74:[653,18,444,-6,491],75:[653,0,667,7,722],76:[653,0,556,-8,559],77:[653,0,833,-18,872],78:[653,15,667,-20,727],79:[667,18,722,60,699],80:[653,0,611,0,605],81:[666,182,722,59,699],82:[653,0,611,-13,588],83:[667,18,500,17,508],84:[653,0,556,59,633],85:[653,18,722,102,765],86:[653,18,611,76,688],87:[653,18,833,71,906],88:[653,0,611,-29,655],89:[653,0,556,78,633],90:[653,0,556,-6,606],91:[663,153,389,21,391],92:[666,18,278,-41,319],93:[663,153,389,12,382],94:[666,-301,422,0,422],95:[-75,125,500,0,500],96:[664,-492,333,120,311],97:[441,11,501,17,476],98:[683,11,500,23,473],99:[441,11,444,30,425],100:[683,13,500,15,527],101:[441,11,444,31,412],102:[678,207,278,-147,424],103:[441,206,500,8,471],104:[683,9,500,19,478],105:[654,11,278,49,264],106:[652,207,278,-124,279],107:[683,11,444,14,461],108:[683,11,278,41,279],109:[441,9,722,12,704],110:[441,9,500,14,474],111:[441,11,500,27,468],112:[441,205,504,-75,472],113:[441,209,500,25,484],114:[441,0,389,45,412],115:[442,13,389,16,366],116:[546,11,278,38,296],117:[441,11,500,42,475],118:[441,18,444,20,426],119:[441,18,667,15,648],120:[441,11,444,-27,447],121:[441,206,444,-24,426],122:[428,81,389,-2,380],123:[687,177,400,51,407],124:[666,18,275,105,171],125:[687,177,400,-7,349],126:[323,-183,541,40,502],305:[441,11,278,47,235],567:[441,207,278,-124,246],915:[653,0,611,8,645],916:[668,0,611,-32,526],920:[667,18,722,60,699],923:[668,0,611,-51,564],926:[653,0,651,-6,680],928:[653,0,722,-8,769],931:[653,0,620,-6,659],933:[668,0,556,78,648],934:[653,0,741,50,731],936:[667,0,675,77,778],937:[666,0,762,-6,739],945:[441,11,552,27,549],946:[678,205,506,-40,514],947:[435,206,410,19,438],948:[668,11,460,24,460],949:[441,11,444,30,425],950:[683,185,454,30,475],951:[441,205,474,14,442],952:[678,11,480,27,494],953:[441,11,278,49,235],954:[441,13,444,14,465],955:[678,16,458,-12,431],956:[428,205,526,-33,483],957:[441,18,470,20,459],958:[683,185,454,30,446],959:[441,11,500,27,468],960:[428,18,504,19,536],961:[441,205,504,-40,471],962:[441,185,454,30,453],963:[428,11,498,27,531],964:[428,11,410,12,426],965:[441,10,478,19,446],966:[441,205,622,27,590],967:[441,207,457,-108,498],968:[441,205,584,15,668],969:[439,11,686,27,654],977:[678,10,556,19,526],981:[683,205,627,27,595],982:[428,11,792,17,832],1009:[441,205,516,27,484],1013:[441,11,444,30,420],8467:[687,11,579,48,571]};MathJax.OutputJax["HTML-CSS"].initFont("STIXGeneral-italic");MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Italic/Main.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathItalic.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathItalic.js
new file mode 100644
index 0000000..0141fdb
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathItalic.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathItalic.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-italic"],{119860:[667,0,717,35,685],119861:[653,0,696,38,686],119862:[659,12,671,50,711],119863:[653,0,790,38,765],119864:[653,0,714,38,734],119865:[653,0,618,38,723],119866:[668,12,734,50,734],119867:[653,0,873,38,923],119868:[653,0,480,38,530],119869:[653,12,540,60,620],119870:[653,0,762,38,802],119871:[653,0,708,38,668],119872:[653,0,1005,38,1055],119873:[653,0,851,38,901],119874:[669,11,732,50,712],119875:[653,0,594,38,704],119876:[667,152,781,50,731],119877:[653,0,740,38,725],119878:[668,10,650,50,680],119879:[653,0,550,25,670],119880:[653,13,705,65,775],119881:[653,16,575,60,760],119882:[653,16,916,60,1101],119883:[653,0,790,25,810],119884:[653,0,535,35,695],119885:[653,0,772,60,802],119886:[441,10,502,40,472],119887:[668,11,470,45,450],119888:[441,11,415,40,400],119889:[668,12,532,40,527],119890:[441,11,445,40,410],119891:[668,187,555,40,615],119892:[441,187,492,20,492],119894:[616,11,311,50,257],119895:[616,187,389,-16,372],119896:[668,11,542,45,527],119897:[668,10,318,45,278],119898:[441,8,710,30,680],119899:[441,8,497,30,467],119900:[441,11,458,40,438],119901:[441,183,489,-30,474],119902:[441,183,458,40,463],119903:[441,0,408,30,393],119904:[441,11,440,50,390],119905:[567,9,313,40,283],119906:[441,9,474,30,444],119907:[458,9,506,72,479],119908:[460,9,775,72,748],119909:[441,9,550,30,510],119910:[440,183,496,30,496],119911:[450,14,499,42,467]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Italic/MathItalic.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathOperators.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathOperators.js
new file mode 100644
index 0000000..4bbbafe
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathOperators.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathOperators.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-italic"],{8706:[668,11,471,40,471],8722:[286,-220,675,86,590]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Italic/MathOperators.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathSSItalic.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathSSItalic.js
new file mode 100644
index 0000000..0cae610
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathSSItalic.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathSSItalic.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-italic"],{120328:[674,0,666,31,635],120329:[662,0,604,74,641],120330:[676,14,671,96,755],120331:[662,0,692,74,751],120332:[662,0,583,74,678],120333:[662,0,535,74,679],120334:[676,14,695,97,755],120335:[662,0,658,74,749],120336:[662,0,401,59,512],120337:[662,14,398,22,470],120338:[662,0,634,74,729],120339:[662,0,559,74,564],120340:[662,0,843,75,933],120341:[662,14,675,74,766],120342:[676,14,714,99,779],120343:[662,0,525,74,638],120344:[676,175,716,99,779],120345:[662,0,589,74,639],120346:[676,14,541,62,597],120347:[662,0,608,161,748],120348:[662,14,661,117,757],120349:[662,11,654,196,788],120350:[662,11,921,194,1057],120351:[662,0,700,31,806],120352:[662,0,630,186,774],120353:[662,0,637,28,763],120354:[463,10,448,55,467],120355:[684,10,496,74,535],120356:[463,10,456,67,503],120357:[684,11,494,72,600],120358:[463,10,444,69,487],120359:[683,0,336,101,526],120360:[463,216,496,-7,575],120361:[684,0,487,63,510],120362:[679,0,220,69,325],120363:[679,216,254,-118,354],120364:[684,0,453,63,556],120365:[684,0,205,61,313],120366:[464,0,756,65,775],120367:[464,0,487,63,510],120368:[463,10,499,76,536],120369:[464,216,498,14,538],120370:[464,216,498,72,549],120371:[464,0,336,63,439],120372:[463,10,389,61,432],120373:[580,10,291,96,376],120374:[453,11,491,89,536],120375:[453,14,474,143,555],120376:[453,14,702,140,787],120377:[453,0,482,30,544],120378:[453,216,484,-19,565],120379:[453,0,447,25,517]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Italic/MathSSItalic.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathScript.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathScript.js
new file mode 100644
index 0000000..199f28a
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathScript.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathScript.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-italic"],{119964:[674,15,855,31,846],119966:[687,15,797,37,781],119967:[687,15,885,36,818],119970:[687,15,773,83,740],119973:[674,177,802,9,792],119974:[687,15,1009,40,1004],119977:[687,15,970,38,956],119978:[680,15,692,82,663],119979:[687,15,910,38,886],119980:[680,38,692,82,663],119982:[680,15,743,67,701],119983:[687,15,912,43,907],119984:[687,15,842,36,805],119985:[687,15,932,35,922],119986:[687,15,1078,35,1070],119987:[687,15,891,36,873],119988:[687,226,926,91,916],119989:[687,15,932,59,912],119990:[441,11,819,30,758],119991:[687,12,580,47,559],119992:[441,11,662,30,589],119993:[687,11,845,30,827],119995:[687,209,685,27,673],119997:[687,11,753,38,690],119998:[653,11,496,83,484],119999:[653,219,730,9,718],120000:[687,11,726,40,666],120001:[687,11,579,48,571],120002:[441,11,1038,49,978],120003:[441,11,761,49,701],120005:[441,209,773,23,694],120006:[441,209,780,30,743],120007:[444,0,580,48,572],120008:[531,11,515,62,412],120009:[658,11,551,30,532],120010:[424,11,753,30,693],120011:[441,11,618,30,582],120012:[441,11,888,30,852],120013:[441,11,752,65,675],120014:[424,219,658,30,617],120015:[478,11,691,52,617]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Italic/MathScript.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/SpacingModLetters.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/SpacingModLetters.js
new file mode 100644
index 0000000..0968797
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/SpacingModLetters.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/SpacingModLetters.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-italic"],{688:[838,-326,378,7,391],689:[838,-326,378,7,414],690:[851,-199,300,44,350],691:[690,-345,320,2,320],692:[690,-345,320,0,318],693:[690,-163,320,0,335],694:[684,-345,390,6,462],695:[690,-327,500,15,515],696:[693,-202,330,16,357],699:[686,-443,333,79,236],704:[690,-295,326,30,307],705:[690,-295,326,23,343],710:[661,-492,333,91,385],711:[661,-492,333,121,426],728:[650,-492,333,117,418],729:[606,-508,333,207,305],730:[707,-508,333,155,355],731:[40,169,333,-20,200],732:[624,-517,333,100,427],733:[664,-494,333,93,486],736:[684,-218,315,23,335],737:[837,-333,220,41,214],738:[691,-335,300,16,290],739:[691,-333,380,4,379],740:[847,-333,318,8,345],748:[70,147,320,15,305],749:[665,-507,405,10,395]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Italic/SpacingModLetters.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/ij.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/ij.js
new file mode 100644
index 0000000..e54c3c7
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/ij.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/ij.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXGeneral-italic"],{120484:[441,11,278,47,235],120485:[441,207,278,-124,246]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Italic/ij.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/AlphaPresentForms.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/AlphaPresentForms.js
new file mode 100644
index 0000000..c6ed273
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/AlphaPresentForms.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/AlphaPresentForms.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{64256:[683,0,605,20,655],64257:[683,0,558,32,523],64258:[683,0,556,31,522],64259:[683,0,832,20,797],64260:[683,0,830,20,796]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/AlphaPresentForms.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Arrows.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Arrows.js
new file mode 100644
index 0000000..1b4ffd5
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Arrows.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Arrows.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{8602:[450,-58,926,60,866],8603:[450,-58,926,60,866],8604:[411,-102,926,70,856],8605:[411,-102,926,70,856],8606:[449,-58,926,70,856],8607:[662,154,511,60,451],8608:[449,-58,926,70,856],8609:[662,154,511,60,451],8610:[449,-58,926,70,856],8611:[449,-58,926,70,856],8612:[450,-57,926,70,857],8613:[662,154,511,60,451],8615:[662,154,511,59,451],8616:[662,154,511,59,451],8619:[553,0,926,70,856],8620:[553,0,926,70,856],8621:[449,-58,1200,49,1151],8622:[450,-58,926,38,888],8623:[662,154,511,60,451],8624:[662,156,463,30,424],8625:[662,156,463,39,433],8626:[662,154,463,25,419],8627:[662,154,463,39,433],8628:[662,154,926,70,856],8629:[662,156,926,70,856],8630:[534,0,926,44,882],8631:[534,0,926,44,882],8632:[732,156,926,55,872],8633:[598,92,926,60,866],8634:[686,116,974,116,858],8635:[686,116,974,116,858],8638:[662,156,511,222,441],8639:[662,156,511,69,288],8642:[662,156,511,222,441],8643:[662,156,511,69,288],8644:[598,92,926,71,856],8645:[662,156,773,31,742],8646:[598,92,926,71,856],8647:[599,92,926,70,856],8648:[662,156,773,41,732],8649:[599,92,926,70,856],8650:[662,156,773,41,732],8651:[539,33,926,70,856],8653:[551,45,926,60,866],8654:[517,10,926,20,906],8655:[551,45,926,60,866],8662:[662,156,926,55,874],8663:[662,156,926,55,874],8664:[662,156,926,55,874],8665:[662,156,926,55,874],8666:[644,139,926,46,852],8667:[645,138,926,74,880],8668:[449,-58,926,60,866],8669:[449,-58,926,60,866],8670:[662,156,511,60,451],8671:[662,156,511,60,451],8672:[449,-58,926,60,866],8673:[662,156,511,60,451],8674:[449,-58,926,60,866],8675:[662,156,511,60,451],8676:[450,-58,926,60,866],8677:[450,-58,926,60,866],8678:[551,45,926,60,866],8679:[662,156,685,45,641],8680:[551,45,926,60,866],8681:[662,156,685,45,641],8682:[690,184,685,45,641],8692:[448,-57,926,70,856],8693:[662,156,773,31,742],8694:[739,232,926,60,866],8695:[450,-58,926,60,866],8696:[450,-58,926,55,861],8697:[450,-58,926,48,878],8698:[450,-58,926,60,866],8699:[450,-58,926,60,866],8700:[450,-58,926,38,888],8701:[449,-57,926,60,866],8702:[449,-57,926,60,866],8703:[449,-57,926,20,906]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/Arrows.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BBBold.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BBBold.js
new file mode 100644
index 0000000..3896e89
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BBBold.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BBBold.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{120120:[662,0,741,50,691],120121:[662,0,676,70,626],120123:[662,0,722,70,677],120124:[662,0,622,70,567],120125:[662,0,469,70,567],120126:[676,13,706,45,664],120128:[662,0,322,78,244],120129:[662,14,560,40,495],120130:[674,0,735,70,729],120131:[662,0,591,70,571],120132:[662,0,855,70,785],120134:[676,14,760,45,715],120138:[676,14,636,35,597],120139:[662,0,527,20,622],120140:[662,14,698,65,633],120141:[662,0,568,12,653],120142:[662,0,920,12,949],120143:[662,0,768,35,733],120144:[662,0,563,12,685],120146:[460,10,561,45,506],120147:[683,10,565,50,524],120148:[460,10,520,45,475],120149:[683,10,574,45,519],120150:[460,10,523,45,478],120151:[683,0,368,25,431],120152:[460,218,574,45,519],120153:[683,0,544,55,489],120154:[683,0,258,55,203],120155:[683,217,305,-15,250],120156:[683,0,551,50,539],120157:[683,0,258,55,203],120158:[460,0,830,55,775],120159:[460,0,544,55,489],120160:[458,12,553,45,508],120161:[460,218,574,55,529],120162:[460,218,574,45,519],120163:[463,0,301,55,407],120164:[460,10,519,36,483],120165:[633,10,329,20,297],120166:[450,10,544,55,489],120167:[450,0,443,20,479],120168:[450,0,676,20,695],120169:[450,0,560,30,530],120170:[450,218,468,20,510],120171:[450,0,519,43,476],120792:[676,14,540,28,512],120793:[693,0,540,91,355],120794:[676,0,547,48,514],120795:[676,14,540,49,478],120796:[676,0,540,20,524],120797:[662,14,540,35,489],120798:[676,14,540,28,512],120799:[662,0,540,24,511],120800:[676,14,540,28,512],120801:[676,12,540,28,512]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/BBBold.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BlockElements.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BlockElements.js
new file mode 100644
index 0000000..1be5413
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BlockElements.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BlockElements.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{9600:[910,-304,1213,0,1213],9604:[303,303,1213,0,1213],9608:[910,303,1213,0,1213],9612:[910,303,1212,0,606],9616:[910,303,1212,606,1212],9617:[860,258,1200,0,1200],9618:[874,273,1200,0,1200],9619:[874,273,1200,0,1200]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/BlockElements.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BoldFraktur.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BoldFraktur.js
new file mode 100644
index 0000000..03d32b0
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BoldFraktur.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BoldFraktur.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{120172:[701,25,856,50,805],120173:[701,19,849,50,794],120174:[701,19,773,54,731],120175:[701,19,891,54,836],120176:[701,19,788,54,731],120177:[701,205,803,54,748],120178:[701,19,833,54,781],120179:[701,205,843,42,795],120180:[701,25,790,54,735],120181:[701,205,803,54,748],120182:[701,25,864,42,814],120183:[701,25,699,51,645],120184:[701,25,1133,50,1081],120185:[701,25,862,50,810],120186:[701,19,909,54,854],120187:[701,205,850,50,795],120188:[701,59,930,54,902],120189:[701,25,884,50,841],120190:[701,19,852,54,802],120191:[701,25,793,54,740],120192:[701,25,860,54,809],120193:[701,19,855,50,800],120194:[701,19,1121,50,1066],120195:[701,25,819,50,775],120196:[701,205,837,50,782],120197:[701,195,755,44,703],120198:[475,24,600,55,545],120199:[695,24,559,45,504],120200:[475,24,464,55,412],120201:[694,25,557,48,502],120202:[475,24,476,55,427],120203:[700,214,370,33,352],120204:[475,219,566,55,506],120205:[695,219,576,45,516],120206:[697,24,429,35,379],120207:[697,219,389,40,337],120208:[695,24,456,48,402],120209:[695,24,433,45,379],120210:[475,24,984,40,932],120211:[475,24,696,40,644],120212:[475,24,554,45,499],120213:[593,219,640,36,585],120214:[475,219,574,55,522],120215:[475,24,525,40,493],120216:[643,31,557,52,505],120217:[656,23,438,45,378],120218:[475,24,681,35,629],120219:[593,24,573,55,526],120220:[593,24,850,55,795],120221:[475,209,521,50,489],120222:[593,219,596,55,536],120223:[475,219,484,36,437]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/BoldFraktur.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BoxDrawing.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BoxDrawing.js
new file mode 100644
index 0000000..2752b1a
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BoxDrawing.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BoxDrawing.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{9472:[340,-267,708,-11,719],9474:[910,303,708,317,390],9478:[910,303,708,317,390],9480:[340,-267,708,-11,719],9482:[910,303,708,317,390],9484:[340,303,708,317,720],9488:[340,303,708,-11,390],9492:[910,-267,708,317,720],9496:[910,-267,708,-11,390],9500:[910,303,708,317,719],9508:[910,303,708,-11,390],9516:[340,303,708,-11,719],9524:[910,-267,708,-11,719],9532:[910,303,708,-11,719],9552:[433,-174,708,-11,719],9553:[910,303,708,225,483],9554:[433,303,708,317,720],9555:[340,303,708,225,720],9556:[433,303,708,225,719],9557:[433,303,708,-11,390],9558:[340,303,708,-11,483],9559:[433,303,708,-11,483],9560:[910,-174,708,317,720],9561:[910,-267,708,225,720],9562:[910,-174,708,225,719],9563:[910,-174,708,-11,390],9564:[910,-267,708,-11,483],9565:[910,-174,708,-11,483],9566:[910,303,708,317,720],9567:[910,303,708,225,720],9568:[910,303,708,225,720],9569:[910,303,708,-11,390],9570:[910,303,708,-11,483],9571:[910,303,708,-11,483],9572:[433,303,708,-11,719],9573:[340,303,708,-11,719],9574:[433,303,708,-11,719],9575:[910,-174,708,-11,719],9576:[910,-267,708,-11,719],9577:[910,-174,708,-11,719],9578:[910,303,708,-11,719],9579:[910,303,708,-11,719],9580:[910,303,708,-11,719],9585:[910,303,708,-15,723],9586:[910,303,708,-15,723]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/BoxDrawing.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CJK.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CJK.js
new file mode 100644
index 0000000..e136f5b
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CJK.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CJK.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{12306:[662,0,685,10,672],12336:[417,-93,1412,45,1367]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/CJK.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CombDiacritMarks.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CombDiacritMarks.js
new file mode 100644
index 0000000..03d20ff
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CombDiacritMarks.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CombDiacritMarks.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{773:[820,-770,0,-480,20],777:[751,-492,0,-307,-118],781:[700,-500,0,-250,-195],782:[700,-500,0,-326,-133],783:[678,-507,0,-401,-22],784:[767,-507,0,-373,-92],785:[664,-507,0,-373,-92],786:[745,-502,0,-299,-160],787:[745,-502,0,-299,-160],788:[745,-502,0,-299,-160],789:[745,-502,0,-85,54],790:[-53,224,0,-351,-127],791:[-53,224,0,-371,-147],792:[-53,283,0,-397,-210],793:[-53,283,0,-267,-80],794:[735,-531,0,-380,-80],795:[474,-345,0,-44,51],796:[-71,266,0,-360,-232],797:[-53,240,0,-345,-115],798:[-53,240,0,-345,-115],799:[-53,250,0,-326,-134],800:[-124,168,0,-326,-134],801:[75,287,0,-235,1],802:[75,287,0,-54,182],803:[-118,217,0,-280,-181],804:[-119,218,0,-379,-81],805:[-69,268,0,-329,-130],806:[-110,353,0,-299,-160],807:[0,215,0,-334,-125],808:[0,165,0,-322,-137],809:[-102,234,0,-250,-210],810:[-98,235,0,-385,-73],811:[-110,227,0,-380,-75],812:[-73,240,0,-385,-74],813:[-73,240,0,-385,-74],814:[-68,225,0,-370,-89],815:[-59,216,0,-370,-89],816:[-113,219,0,-395,-65],817:[-141,195,0,-385,-74],818:[-141,191,0,-480,20],819:[-141,300,0,-480,20],820:[320,-214,0,-401,-71],821:[274,-230,0,-384,-78],822:[274,-230,0,-480,20],823:[580,74,0,-380,-41],825:[-71,266,0,-280,-152],826:[-53,190,0,-385,-73],827:[-53,227,0,-313,-147],828:[-65,189,0,-380,-79],829:[715,-525,0,-326,-135],830:[829,-499,0,-283,-177],831:[928,-770,0,-480,20],838:[681,-538,0,-350,-68],844:[777,-532,0,-386,-56],857:[-65,367,0,-357,-87],860:[-76,233,0,-373,295],864:[633,-517,0,-395,365],865:[664,-507,0,-373,295],866:[-65,270,0,-395,355]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/CombDiacritMarks.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CombDiactForSymbols.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CombDiactForSymbols.js
new file mode 100644
index 0000000..1bb9eb9
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CombDiactForSymbols.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CombDiactForSymbols.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{8400:[760,-627,0,-453,-17],8401:[760,-627,0,-453,-17],8402:[662,156,0,-242,-192],8406:[760,-548,0,-453,-17],8411:[622,-523,0,-462,35],8412:[622,-523,0,-600,96],8413:[725,221,0,-723,223],8414:[780,180,0,-730,230],8415:[843,341,0,-840,344],8417:[760,-548,0,-453,25],8420:[1023,155,0,-970,490],8421:[662,156,0,-430,-40],8422:[662,156,0,-335,-102],8423:[725,178,0,-650,166],8424:[-119,218,0,-462,35],8425:[681,-538,0,-480,53],8426:[419,-87,0,-658,118],8427:[756,217,0,-448,193],8428:[-119,252,0,-453,-17],8429:[-119,252,0,-453,-17],8430:[-40,252,0,-453,-17],8431:[-40,252,0,-453,-17],8432:[819,-517,0,-357,-87]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/CombDiactForSymbols.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/ControlPictures.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/ControlPictures.js
new file mode 100644
index 0000000..c058176
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/ControlPictures.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/ControlPictures.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{9251:[16,120,500,40,460]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/ControlPictures.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CurrencySymbols.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CurrencySymbols.js
new file mode 100644
index 0000000..a5dbf29
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CurrencySymbols.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CurrencySymbols.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{8355:[662,0,556,11,546],8356:[676,8,500,12,490],8359:[662,10,1182,16,1141],8364:[664,12,500,38,462]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/CurrencySymbols.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Cyrillic.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Cyrillic.js
new file mode 100644
index 0000000..08b8d57
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Cyrillic.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Cyrillic.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{1025:[872,0,629,22,607],1026:[662,189,756,18,700],1027:[928,0,571,19,544],1028:[676,14,651,38,621],1029:[676,14,556,62,510],1030:[662,0,333,18,315],1031:[872,0,333,25,323],1032:[662,14,373,-6,354],1033:[662,14,988,10,954],1034:[662,0,1017,19,983],1035:[662,0,803,18,786],1036:[928,0,690,19,686],1038:[915,15,711,15,694],1039:[662,153,715,19,696],1040:[674,0,713,9,701],1041:[662,0,611,19,577],1042:[662,0,651,19,595],1043:[662,0,571,19,544],1044:[662,153,665,14,646],1045:[662,0,629,22,607],1046:[676,0,1021,8,1013],1047:[676,14,576,28,545],1048:[662,0,723,19,704],1049:[915,0,723,19,704],1050:[676,0,690,19,686],1051:[662,14,683,9,664],1052:[662,0,893,19,871],1053:[662,0,726,19,704],1054:[676,14,729,36,690],1055:[662,0,724,19,705],1056:[662,0,571,19,535],1057:[676,14,677,36,641],1058:[662,0,618,30,592],1059:[662,15,711,15,694],1060:[662,0,769,38,731],1061:[662,0,716,9,703],1062:[662,153,715,19,696],1063:[662,0,657,3,639],1064:[662,0,994,29,965],1065:[662,153,994,29,965],1066:[662,0,737,13,703],1067:[662,0,884,19,865],1068:[662,0,612,19,578],1069:[676,14,651,30,613],1070:[676,14,902,19,863],1071:[662,0,637,3,618],1072:[460,10,450,37,446],1073:[685,10,507,39,478],1074:[450,0,474,24,438],1075:[450,0,394,17,387],1076:[450,137,462,14,439],1077:[460,10,466,38,437],1078:[456,0,721,14,707],1079:[460,10,390,14,357],1080:[450,0,525,23,502],1081:[704,0,525,23,502],1082:[456,0,503,23,495],1083:[450,10,499,8,476],1084:[450,0,617,23,594],1085:[450,0,525,23,502],1086:[460,10,512,35,476],1087:[450,0,525,23,502],1088:[460,217,499,-2,463],1089:[460,10,456,41,428],1090:[450,0,434,8,426],1091:[450,218,491,8,483],1092:[662,217,678,43,635],1093:[450,0,489,14,476],1094:[450,137,525,23,502],1095:[450,0,512,18,489],1096:[450,0,768,23,745],1097:[450,137,768,23,745],1098:[450,0,539,8,507],1099:[450,0,670,23,646],1100:[450,0,457,23,425],1101:[460,10,444,14,410],1102:[460,10,738,23,703],1103:[450,0,471,4,448],1105:[622,10,466,38,437],1106:[683,218,512,6,439],1107:[679,0,394,17,387],1108:[460,10,444,34,430],1109:[459,10,389,49,346],1110:[683,0,278,29,266],1111:[622,0,278,1,299],1112:[683,218,278,-77,187],1113:[450,10,702,8,670],1114:[450,0,721,23,689],1115:[683,0,512,6,499],1116:[679,0,503,23,495],1118:[704,218,491,8,483],1119:[450,137,518,23,495],1122:[662,0,746,26,713],1123:[683,0,539,8,507],1130:[662,0,998,6,992],1131:[450,0,722,14,708],1138:[676,14,729,36,690],1139:[460,10,512,35,476],1140:[676,11,766,16,760],1141:[456,14,539,19,532],1168:[803,0,571,19,544],1169:[558,0,394,17,387]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/Cyrillic.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Dingbats.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Dingbats.js
new file mode 100644
index 0000000..0d3296f
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Dingbats.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Dingbats.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{9986:[612,-82,961,35,905],9993:[555,-138,690,34,638],10003:[707,12,755,34,704],10016:[592,87,767,53,714],10026:[613,106,789,35,733],10038:[616,108,695,35,642],10045:[612,108,682,35,626],10098:[719,213,488,188,466],10099:[719,213,488,22,300],10112:[705,14,788,35,733],10113:[705,14,788,35,733],10114:[705,14,788,35,733],10115:[705,14,788,35,733],10116:[705,14,788,35,733],10117:[705,14,788,35,733],10118:[705,14,788,35,733],10119:[705,14,788,35,733],10120:[705,14,788,35,733],10121:[705,14,788,35,733],10122:[705,14,788,35,733],10123:[705,14,788,35,733],10124:[705,14,788,35,733],10125:[705,14,788,35,733],10126:[705,14,788,35,733],10127:[705,14,788,35,733],10128:[705,14,788,35,733],10129:[705,14,788,35,733],10130:[705,14,788,35,733],10131:[705,14,788,35,733],10139:[433,-70,918,35,861]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/Dingbats.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/EnclosedAlphanum.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/EnclosedAlphanum.js
new file mode 100644
index 0000000..87a5b75
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/EnclosedAlphanum.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/EnclosedAlphanum.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{9312:[676,14,684,0,684],9313:[676,14,684,0,684],9314:[676,14,684,0,684],9315:[676,14,684,0,684],9316:[676,14,684,0,684],9317:[676,14,684,0,684],9318:[676,14,684,0,684],9319:[676,14,684,0,684],9320:[676,14,684,0,684],9398:[676,14,684,0,684],9399:[676,14,684,0,684],9400:[676,14,684,0,684],9401:[676,14,684,0,684],9402:[676,14,684,0,684],9403:[676,14,684,0,684],9404:[676,14,684,0,684],9405:[676,14,684,0,684],9406:[676,14,684,0,684],9407:[676,14,684,0,684],9408:[676,14,684,0,684],9409:[676,14,684,0,684],9410:[676,14,684,0,684],9411:[676,14,684,0,684],9412:[676,14,684,0,684],9413:[676,14,684,0,684],9414:[676,14,684,0,684],9415:[676,14,684,0,684],9416:[676,14,684,0,684],9417:[676,14,684,0,684],9418:[676,14,684,0,684],9419:[676,14,684,0,684],9420:[676,14,684,0,684],9421:[676,14,684,0,684],9422:[676,14,684,0,684],9423:[676,14,684,0,684],9424:[676,14,684,0,684],9425:[676,14,684,0,684],9426:[676,14,684,0,684],9427:[676,14,684,0,684],9428:[676,14,684,0,684],9429:[676,14,684,0,684],9430:[676,14,684,0,684],9431:[676,14,684,0,684],9432:[676,14,684,0,684],9433:[676,14,684,0,684],9434:[676,14,684,0,684],9435:[676,14,684,0,684],9436:[676,14,684,0,684],9437:[676,14,684,0,684],9438:[676,14,684,0,684],9439:[676,14,684,0,684],9440:[676,14,684,0,684],9441:[676,14,684,0,684],9442:[676,14,684,0,684],9443:[676,14,684,0,684],9444:[676,14,684,0,684],9445:[676,14,684,0,684],9446:[676,14,684,0,684],9447:[676,14,684,0,684],9448:[676,14,684,0,684],9449:[676,14,684,0,684],9450:[676,14,684,0,684]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/EnclosedAlphanum.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Fraktur.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Fraktur.js
new file mode 100644
index 0000000..8852471
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Fraktur.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Fraktur.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{120068:[695,22,785,47,742],120069:[704,24,822,48,774],120071:[695,24,868,50,817],120072:[695,24,729,50,678],120073:[695,204,767,50,716],120074:[695,24,806,50,755],120077:[695,204,772,50,721],120078:[695,22,846,50,801],120079:[695,24,669,47,626],120080:[695,22,1083,50,1031],120081:[695,22,827,50,775],120082:[695,24,837,37,786],120083:[695,204,823,40,773],120084:[695,64,865,37,814],120086:[695,24,856,55,801],120087:[695,24,766,47,722],120088:[696,22,787,50,744],120089:[695,24,831,48,781],120090:[695,24,1075,48,1025],120091:[695,31,763,46,735],120092:[695,204,766,47,714],120094:[468,18,530,51,479],120095:[695,18,513,46,462],120096:[468,18,385,57,344],120097:[695,18,506,45,455],120098:[468,18,420,47,379],120099:[694,209,327,27,316],120100:[468,209,499,51,461],120101:[695,209,528,48,476],120102:[694,18,384,42,338],120103:[695,209,345,44,311],120104:[695,18,420,48,368],120105:[695,18,398,46,350],120106:[468,25,910,59,856],120107:[468,25,636,60,582],120108:[468,18,503,50,452],120109:[586,209,555,38,504],120110:[468,209,507,51,459],120111:[468,18,463,38,426],120112:[623,24,518,49,469],120113:[656,18,374,38,337],120114:[478,18,647,60,593],120115:[586,18,515,47,464],120116:[586,25,759,41,708],120117:[468,189,456,45,406],120118:[586,209,516,48,464],120119:[468,209,457,43,407]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/Fraktur.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GeneralPunctuation.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GeneralPunctuation.js
new file mode 100644
index 0000000..2d86103
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GeneralPunctuation.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GeneralPunctuation.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{8208:[259,-193,333,39,285],8209:[257,-194,333,39,285],8210:[259,-193,500,0,500],8211:[250,-201,500,0,500],8212:[250,-201,1000,0,1000],8213:[250,-201,2000,0,2000],8214:[690,189,523,129,394],8215:[-141,300,500,0,500],8216:[676,-433,333,115,254],8217:[676,-433,333,79,218],8218:[102,141,333,79,218],8219:[676,-433,333,79,218],8220:[676,-433,444,43,414],8221:[676,-433,444,30,401],8222:[102,141,444,45,416],8223:[676,-433,444,30,401],8226:[444,-59,523,70,455],8229:[100,11,667,111,555],8240:[706,19,1109,61,1048],8241:[706,19,1471,61,1410],8243:[678,-401,426,75,351],8244:[678,-401,563,75,488],8245:[678,-402,289,75,214],8246:[678,-401,426,75,351],8247:[678,-401,563,75,488],8248:[102,156,511,59,454],8249:[416,-33,333,63,285],8250:[416,-33,333,48,270],8251:[547,41,685,48,635],8252:[676,9,549,130,452],8256:[709,-512,798,72,726],8259:[332,-172,333,39,285],8260:[676,14,167,-168,331],8263:[676,8,839,68,809],8270:[240,171,500,68,433],8271:[459,141,278,60,199],8272:[691,40,790,55,735],8273:[676,171,501,68,433],8274:[706,200,471,54,417],8279:[678,-401,710,75,635],8287:[0,0,1000,0,0]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/GeneralPunctuation.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GeometricShapes.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GeometricShapes.js
new file mode 100644
index 0000000..8de5abd
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GeometricShapes.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GeometricShapes.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{9632:[662,158,910,45,865],9633:[662,158,910,45,865],9634:[662,158,910,45,865],9635:[662,158,910,45,865],9636:[662,158,910,45,865],9637:[662,158,910,45,865],9638:[662,158,910,45,865],9639:[662,158,910,45,865],9640:[662,158,910,45,865],9641:[662,158,910,45,865],9642:[460,-40,484,32,452],9643:[460,-40,484,32,452],9644:[469,11,1020,38,982],9645:[469,11,1020,38,982],9646:[724,220,560,40,520],9647:[724,220,560,40,520],9648:[514,11,1140,28,1112],9649:[514,11,1140,29,1111],9650:[811,127,1145,35,1110],9652:[553,-28,660,27,632],9653:[553,-28,660,27,632],9654:[790,285,1043,70,1008],9655:[791,284,1043,70,1008],9656:[556,49,660,80,605],9658:[555,50,930,65,885],9659:[555,50,930,65,885],9660:[811,127,1145,35,1110],9662:[477,48,660,27,632],9663:[477,48,660,27,632],9664:[790,285,1043,35,973],9665:[791,284,1043,70,1008],9666:[555,50,660,55,580],9668:[555,50,930,45,865],9669:[555,50,930,45,865],9670:[744,242,1064,39,1025],9671:[744,242,1064,39,1025],9672:[744,242,1064,39,1025],9673:[623,119,842,50,792],9674:[795,289,790,45,745],9675:[623,119,842,50,792],9676:[680,176,910,29,881],9677:[680,176,910,27,884],9678:[623,119,842,50,792],9679:[623,119,842,50,792],9680:[623,119,842,50,792],9681:[623,119,842,50,792],9682:[623,119,842,50,792],9683:[623,119,842,50,792],9684:[623,119,842,50,792],9685:[623,119,842,50,792],9686:[680,176,580,66,494],9687:[680,176,580,86,514],9688:[662,158,910,45,865],9689:[662,158,910,45,865],9690:[662,-252,910,45,865],9691:[252,158,910,45,865],9692:[680,-252,910,27,455],9693:[680,-252,910,455,884],9694:[252,176,910,455,884],9695:[252,176,910,26,455],9696:[680,-251,910,27,884],9697:[252,176,910,27,884],9698:[662,158,911,45,865],9699:[662,158,911,45,865],9700:[662,158,911,45,865],9701:[662,158,911,45,865],9702:[444,-59,523,70,455],9703:[662,157,910,45,865],9704:[662,157,910,45,865],9705:[662,157,910,45,865],9706:[662,157,910,45,865],9707:[662,157,910,45,865],9708:[811,127,1145,35,1110],9709:[811,127,1145,35,1110],9710:[811,127,1145,35,1110],9712:[662,158,910,45,865],9713:[662,158,910,45,865],9714:[662,158,910,45,865],9715:[662,158,910,45,865],9716:[623,119,842,50,792],9717:[623,119,842,50,792],9718:[623,119,842,50,792],9719:[623,119,842,50,792],9720:[662,158,911,45,865],9721:[662,158,911,45,865],9722:[662,158,911,45,865],9723:[580,76,746,45,701],9724:[580,76,746,45,701],9725:[513,12,601,38,563],9726:[514,11,601,38,563],9727:[662,158,911,45,865]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/GeometricShapes.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekAndCoptic.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekAndCoptic.js
new file mode 100644
index 0000000..23e7f2d
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekAndCoptic.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekAndCoptic.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{894:[459,141,278,80,219],900:[662,-507,277,113,240],901:[662,-507,333,18,316],902:[683,0,722,15,707],903:[459,-348,278,81,192],904:[683,0,750,8,737],905:[683,0,850,8,836],906:[683,0,470,8,449],908:[683,14,722,8,688],910:[683,0,840,8,818],911:[683,0,744,8,715],912:[662,10,340,18,316],913:[674,0,722,15,707],914:[662,0,667,17,593],917:[662,0,611,12,597],918:[662,0,612,10,598],919:[662,0,722,18,703],921:[662,0,333,18,315],922:[662,0,731,33,723],924:[662,0,889,12,864],925:[662,11,722,12,707],927:[676,14,722,34,688],929:[662,0,557,16,542],932:[662,0,611,17,593],935:[662,0,722,10,704],938:[873,0,333,18,316],939:[873,0,722,29,703],940:[662,10,543,29,529],941:[662,10,439,25,407],942:[662,217,512,10,452],943:[662,10,275,20,267],944:[662,10,524,16,494],945:[460,10,543,29,529],946:[683,217,496,55,466],947:[457,218,474,10,444],948:[683,10,500,29,470],949:[460,10,439,25,407],950:[683,218,441,35,407],951:[460,217,512,10,452],952:[683,10,496,27,468],953:[460,10,275,20,267],954:[460,0,500,7,503],955:[683,11,497,12,492],956:[450,217,528,55,516],957:[460,14,455,20,443],958:[683,218,441,35,407],959:[460,10,505,35,473],960:[450,14,501,9,482],961:[460,217,496,55,466],962:[460,218,441,35,432],963:[450,10,548,29,518],964:[450,10,477,3,442],965:[460,10,524,16,494],966:[460,217,623,29,593],967:[460,220,500,11,486],968:[460,217,694,20,684],969:[460,10,625,29,595],970:[622,10,340,18,316],971:[622,10,524,16,494],972:[662,10,505,35,473],973:[662,10,524,16,494],974:[662,10,625,29,595],976:[693,10,450,54,411],977:[683,10,554,0,544],978:[676,0,722,29,698],981:[683,217,623,29,593],982:[450,10,762,6,726],984:[676,217,722,34,688],985:[460,217,500,29,470],986:[676,218,667,28,622],987:[490,218,461,35,436],988:[662,0,556,11,546],989:[450,190,470,80,435],990:[797,14,703,13,678],991:[662,0,511,64,455],992:[676,218,801,11,767],993:[573,216,528,-6,487],1008:[460,10,551,42,515],1009:[460,215,500,29,470],1012:[676,14,722,34,688],1013:[460,10,439,25,407],1014:[460,10,444,32,414]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/GreekAndCoptic.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekBold.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekBold.js
new file mode 100644
index 0000000..331ce88
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekBold.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekBold.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{120488:[690,0,735,9,689],120489:[676,0,667,16,619],120490:[676,0,620,16,593],120491:[690,0,691,16,656],120492:[676,0,679,16,641],120493:[676,0,693,28,634],120494:[676,0,810,21,759],120495:[692,18,778,35,743],120496:[676,0,421,20,370],120497:[676,0,820,30,769],120498:[690,0,707,9,674],120499:[676,0,972,14,921],120500:[676,18,722,16,701],120501:[676,0,623,28,595],120502:[691,19,778,35,743],120503:[676,0,780,21,759],120504:[676,0,611,16,600],120505:[692,18,778,35,743],120506:[676,0,665,14,627],120507:[676,0,667,31,636],120508:[692,0,722,3,699],120509:[676,0,836,18,818],120510:[676,0,747,16,699],120511:[692,0,800,3,785],120512:[692,0,778,35,723],120513:[676,14,691,16,656],120514:[473,14,644,25,618],120515:[692,205,556,45,524],120516:[473,205,518,12,501],120517:[692,14,502,26,477],120518:[473,14,444,28,429],120519:[692,205,459,23,437],120520:[473,205,580,12,545],120521:[692,14,501,25,476],120522:[461,14,326,15,304],120523:[473,0,581,21,559],120524:[692,18,546,19,527],120525:[461,205,610,45,588],120526:[473,14,518,15,495],120527:[692,205,465,23,439],120528:[473,14,500,25,476],120529:[461,18,631,20,609],120530:[473,205,547,45,515],120531:[473,203,464,23,444],120532:[461,14,568,25,529],120533:[461,14,492,18,457],120534:[473,14,576,12,551],120535:[473,205,653,24,629],120536:[473,205,612,21,586],120537:[473,205,763,12,751],120538:[473,14,734,26,708],120539:[707,14,515,25,491],120540:[473,14,444,25,430],120541:[692,14,647,12,620],120542:[473,19,563,12,546],120543:[676,205,653,24,629],120544:[473,205,511,25,486],120545:[461,14,864,9,851]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/GreekBold.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekBoldItalic.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekBoldItalic.js
new file mode 100644
index 0000000..5439e0f
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekBoldItalic.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekBoldItalic.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{120604:[685,0,759,39,724],120605:[669,0,726,42,715],120606:[669,0,634,42,749],120607:[685,0,632,32,589],120608:[669,0,732,42,754],120609:[669,0,797,66,830],120610:[669,0,891,42,946],120611:[685,16,783,55,755],120612:[669,0,502,42,557],120613:[669,0,795,42,839],120614:[685,0,759,39,724],120615:[669,0,1016,42,1071],120616:[669,0,869,42,924],120617:[669,0,718,57,757],120618:[685,16,777,55,755],120619:[669,0,887,39,942],120620:[669,0,612,42,733],120621:[685,16,783,55,755],120622:[669,0,759,64,787],120623:[669,0,568,28,700],120624:[685,0,589,31,721],120625:[669,0,827,28,799],120626:[669,0,808,28,830],120627:[685,0,694,30,781],120628:[685,0,826,57,815],120629:[669,16,632,43,600],120630:[461,12,624,44,630],120631:[685,205,555,28,583],120632:[462,202,490,44,503],120633:[685,8,538,44,538],120634:[462,10,495,28,451],120635:[685,203,472,44,522],120636:[462,205,517,33,511],120637:[686,11,566,44,555],120638:[462,9,318,55,274],120639:[462,0,560,55,577],120640:[685,16,570,55,537],120641:[450,205,636,33,603],120642:[459,10,523,55,534],120643:[685,203,476,28,487],120644:[462,10,561,44,539],120645:[450,13,579,39,590],120646:[462,205,595,33,562],120647:[462,203,480,39,508],120648:[450,10,592,44,603],120649:[450,7,469,33,502],120650:[462,10,552,33,535],120651:[462,205,706,55,667],120652:[462,204,621,33,676],120653:[462,205,701,33,756],120654:[462,10,687,22,665],120655:[686,10,559,44,559],120656:[461,10,481,44,481],120657:[698,13,607,33,584],120658:[462,15,607,-12,630],120659:[685,205,683,44,655],120660:[462,205,585,44,563],120661:[450,10,868,33,879]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/GreekBoldItalic.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekItalic.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekItalic.js
new file mode 100644
index 0000000..dda0f25
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekItalic.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekItalic.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{120546:[667,0,717,35,685],120547:[653,0,696,38,686],120548:[653,0,616,38,721],120549:[667,0,596,30,556],120550:[653,0,714,38,734],120551:[653,0,772,60,802],120552:[653,0,873,38,923],120553:[669,11,737,50,712],120554:[653,0,480,38,530],120555:[653,0,762,38,802],120556:[667,0,718,35,686],120557:[653,0,1005,38,1055],120558:[653,0,851,38,901],120559:[653,0,706,52,741],120560:[669,11,732,50,712],120561:[653,0,873,38,923],120562:[653,0,594,38,704],120563:[669,11,737,50,712],120564:[653,0,735,58,760],120565:[653,0,550,25,670],120566:[668,0,567,28,687],120567:[653,0,772,25,747],120568:[653,0,790,25,810],120569:[667,0,670,28,743],120570:[666,0,800,32,777],120571:[653,15,627,42,600],120572:[441,10,524,40,529],120573:[668,183,493,25,518],120574:[441,187,428,35,458],120575:[668,11,463,40,451],120576:[441,11,484,25,444],120577:[668,183,435,40,480],120578:[441,183,460,30,455],120579:[668,11,484,40,474],120580:[441,11,267,50,227],120581:[441,0,534,50,549],120582:[668,16,541,50,511],120583:[428,183,579,30,549],120584:[446,9,452,50,462],120585:[668,183,433,25,443],120586:[441,11,458,40,438],120587:[428,13,558,35,568],120588:[441,183,502,30,472],120589:[490,183,439,35,464],120590:[428,11,537,40,547],120591:[428,5,442,30,472],120592:[439,11,460,30,445],120593:[441,183,666,50,631],120594:[441,202,595,30,645],120595:[441,183,661,30,711],120596:[441,11,681,20,661],120597:[668,11,471,40,471],120598:[441,11,430,40,430],120599:[678,10,554,20,507],120600:[441,13,561,12,587],120601:[668,183,645,40,620],120602:[441,187,509,40,489],120603:[428,11,856,30,866]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/GreekItalic.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekSSBold.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekSSBold.js
new file mode 100644
index 0000000..dd88443
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekSSBold.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekSSBold.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{120662:[690,0,690,25,665],120663:[676,0,636,80,594],120664:[676,0,591,80,569],120665:[690,0,720,40,680],120666:[676,0,635,80,597],120667:[676,0,653,25,623],120668:[676,0,715,80,635],120669:[691,19,778,35,743],120670:[676,0,440,65,375],120671:[676,0,712,80,707],120672:[690,0,706,40,666],120673:[676,0,913,80,833],120674:[676,18,724,80,644],120675:[676,0,640,35,605],120676:[692,18,778,35,743],120677:[676,0,715,80,635],120678:[676,0,581,80,569],120679:[691,19,778,35,743],120680:[676,0,674,28,632],120681:[676,0,641,14,627],120682:[691,0,748,20,728],120683:[676,0,800,25,775],120684:[676,0,740,40,700],120685:[691,0,806,15,791],120686:[691,0,752,32,720],120687:[664,30,735,45,685],120688:[473,14,662,40,629],120689:[692,205,512,39,487],120690:[473,205,502,10,477],120691:[692,14,502,25,477],120692:[473,14,451,25,434],120693:[692,205,500,28,488],120694:[473,205,510,35,474],120695:[692,14,500,23,477],120696:[461,14,319,53,296],120697:[473,0,527,55,512],120698:[692,14,554,18,520],120699:[461,205,550,39,517],120700:[473,14,492,55,472],120701:[692,205,501,28,489],120702:[473,14,501,25,476],120703:[461,14,594,10,572],120704:[473,205,511,38,486],120705:[473,205,498,26,486],120706:[461,14,520,25,552],120707:[461,14,479,6,472],120708:[473,14,514,35,489],120709:[473,205,634,25,609],120710:[473,205,573,9,553],120711:[473,205,680,25,699],120712:[461,14,740,42,689],120713:[691,14,501,25,476],120714:[473,14,462,25,440],120715:[692,14,536,35,522],120716:[473,14,570,14,554],120717:[692,205,634,25,609],120718:[473,205,494,25,469],120719:[461,14,848,6,839]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/GreekSSBold.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekSSBoldItalic.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekSSBoldItalic.js
new file mode 100644
index 0000000..f404eeb
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekSSBoldItalic.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekSSBoldItalic.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{120720:[690,0,690,25,665],120721:[676,0,706,60,671],120722:[676,0,602,60,705],120723:[690,0,720,40,680],120724:[676,0,683,60,708],120725:[676,0,707,25,769],120726:[676,0,748,60,783],120727:[691,19,847,90,822],120728:[676,0,435,50,505],120729:[676,0,712,60,796],120730:[690,0,686,20,646],120731:[676,0,933,60,981],120732:[676,18,744,60,792],120733:[676,0,690,47,737],120734:[692,18,849,90,824],120735:[676,0,745,60,783],120736:[676,0,581,60,675],120737:[691,19,847,90,822],120738:[676,0,696,21,748],120739:[676,0,641,87,715],120740:[691,0,671,91,799],120741:[676,0,835,72,835],120742:[676,0,740,20,833],120743:[691,0,791,125,901],120744:[691,0,816,47,816],120745:[664,30,780,120,760],120746:[473,14,678,47,703],120747:[692,205,552,-12,581],120748:[473,204,525,84,571],120749:[692,14,507,30,547],120750:[473,14,504,45,508],120751:[692,205,480,49,539],120752:[473,205,532,38,525],120753:[692,14,560,65,553],120754:[462,14,325,56,302],120755:[473,0,537,38,582],120756:[692,14,574,18,540],120757:[462,205,594,-12,569],120758:[473,14,525,41,565],120759:[692,205,481,43,525],120760:[473,14,543,45,515],120761:[462,14,632,45,656],120762:[473,205,560,-33,536],120763:[473,205,517,52,554],120764:[462,14,614,45,639],120765:[462,14,523,42,547],120766:[473,14,550,61,526],120767:[473,205,683,55,659],120768:[473,205,575,-80,626],120769:[473,205,703,75,751],120770:[461,14,756,64,732],120771:[691,14,548,45,539],120772:[473,14,468,45,470],120773:[692,14,579,54,579],120774:[473,10,646,-10,665],120775:[692,205,678,48,654],120776:[473,205,544,38,520],120777:[462,14,889,40,912]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/GreekSSBoldItalic.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Hiragana.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Hiragana.js
new file mode 100644
index 0000000..aab70e8
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Hiragana.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Hiragana.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{12398:[661,41,901,37,840]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/Hiragana.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/IPAExtensions.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/IPAExtensions.js
new file mode 100644
index 0000000..1493520
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/IPAExtensions.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/IPAExtensions.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{592:[460,10,444,8,413],593:[460,10,500,27,491],594:[460,10,500,27,491],595:[683,10,500,69,468],596:[459,11,444,10,397],597:[460,160,444,25,417],598:[683,233,553,27,599],599:[683,10,587,27,602],600:[460,10,444,20,419],601:[460,10,444,14,413],602:[460,13,657,36,651],603:[475,14,438,20,389],604:[475,14,438,20,389],605:[475,14,623,20,603],606:[475,14,479,20,430],607:[460,218,315,-49,296],608:[683,212,594,32,634],609:[482,212,537,32,455],610:[450,11,570,30,539],611:[450,234,500,19,480],612:[450,10,500,13,486],613:[450,233,500,13,491],614:[683,0,500,9,487],615:[683,233,481,9,427],616:[683,0,278,16,253],617:[454,10,333,17,311],618:[450,0,258,21,231],619:[683,0,350,10,340],620:[683,0,375,12,362],621:[683,233,302,10,352],622:[683,233,549,19,538],623:[450,10,778,11,770],624:[450,233,803,11,785],625:[460,233,778,16,706],626:[460,233,529,-70,514],627:[460,233,533,16,603],628:[450,8,602,29,561],629:[460,10,500,29,470],630:[450,6,720,23,697],631:[475,4,667,37,629],632:[683,233,667,40,626],633:[450,10,370,30,360],634:[683,10,370,30,364],635:[450,233,418,30,468],636:[460,233,333,5,335],637:[460,233,370,7,339],638:[470,0,315,10,337],639:[470,0,350,5,332],640:[464,0,475,21,470],641:[464,0,475,21,470],642:[458,218,389,50,348],643:[683,233,322,-70,372],644:[683,218,304,-70,372],645:[470,233,400,15,457],646:[683,243,437,-23,422],647:[460,129,278,16,282],648:[579,233,270,13,283],649:[450,10,500,9,480],650:[450,10,537,46,490],651:[460,10,500,32,476],652:[464,0,500,-4,454],653:[464,0,722,21,694],654:[668,0,444,-2,459],655:[464,0,587,23,564],656:[450,218,528,27,569],657:[450,150,507,27,487],658:[450,233,413,12,392],659:[450,305,431,12,410],660:[683,0,450,47,400],661:[683,0,450,48,401],662:[662,14,450,47,400],663:[460,230,450,80,410],664:[679,17,723,33,690],665:[464,0,460,15,444],666:[475,14,479,20,430],667:[523,11,600,29,583],668:[464,0,572,21,560],669:[683,233,387,-23,412],670:[450,233,519,1,499],671:[464,0,470,21,441],672:[582,217,600,24,590],673:[683,0,450,48,401],674:[683,0,450,48,401],675:[683,10,802,27,775],676:[683,233,743,27,722],677:[683,160,864,27,844],678:[579,10,536,13,495],679:[683,233,483,13,540],680:[579,10,650,13,641],686:[469,232,619,15,612],687:[469,233,679,15,729]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/IPAExtensions.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Latin1Supplement.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Latin1Supplement.js
new file mode 100644
index 0000000..3369ef5
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Latin1Supplement.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Latin1Supplement.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{161:[468,218,330,96,202],162:[579,138,500,53,448],163:[676,8,500,12,490],164:[534,10,500,-22,522],165:[662,0,500,-53,512],166:[676,14,200,67,133],167:[676,148,500,70,426],169:[676,14,760,38,722],170:[676,-394,276,4,270],171:[416,-33,500,42,456],173:[257,-194,333,39,285],174:[676,14,760,38,722],176:[676,-390,400,57,343],178:[676,-270,300,1,296],179:[676,-262,300,13,291],180:[678,-507,333,93,317],181:[450,218,500,36,512],182:[662,154,592,60,532],184:[0,215,333,52,261],185:[676,-270,300,57,248],186:[676,-394,310,6,304],187:[416,-33,500,43,458],188:[676,14,750,42,713],189:[676,14,750,36,741],190:[676,14,750,13,718],191:[467,218,444,30,376],192:[928,0,722,15,707],193:[928,0,722,15,707],194:[924,0,722,15,707],195:[888,0,722,15,707],196:[872,0,722,15,707],197:[961,0,722,15,707],198:[662,0,889,0,863],199:[676,215,667,28,633],200:[928,0,611,12,597],201:[928,0,611,12,597],202:[924,0,611,12,597],203:[872,0,611,12,597],204:[928,0,333,18,315],205:[928,0,333,18,315],206:[924,0,333,10,321],207:[872,0,333,17,315],208:[662,0,722,16,685],209:[888,11,722,12,707],210:[928,14,722,34,688],211:[928,14,722,34,688],212:[924,14,722,34,688],213:[888,14,722,34,688],214:[872,14,722,34,688],216:[734,80,722,34,688],217:[928,14,722,14,705],218:[928,14,722,14,705],219:[924,14,722,14,705],220:[872,14,722,14,705],221:[928,0,722,22,703],222:[662,0,556,16,542],223:[683,9,500,12,468],224:[678,10,444,37,442],225:[678,10,444,37,442],226:[674,10,444,37,442],227:[638,10,444,37,442],228:[622,10,444,37,442],229:[713,10,444,37,442],230:[460,7,667,38,632],231:[460,215,444,25,412],232:[678,10,444,25,424],233:[678,10,444,25,424],234:[674,10,444,25,424],235:[622,10,444,25,424],236:[678,0,278,6,243],237:[678,0,278,16,273],238:[674,0,278,-17,294],239:[622,0,278,-10,288],240:[686,10,500,29,471],241:[638,0,500,16,485],242:[678,10,500,29,470],243:[678,10,500,29,470],244:[674,10,500,29,470],245:[638,10,500,29,470],246:[622,10,500,29,470],248:[551,112,500,29,470],249:[678,10,500,9,480],250:[678,10,500,9,480],251:[674,10,500,9,480],252:[622,10,500,9,480],253:[678,218,500,14,475],254:[683,217,500,5,470],255:[622,218,500,14,475]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/Latin1Supplement.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedA.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedA.js
new file mode 100644
index 0000000..ae06d4a
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedA.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedA.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{256:[773,0,722,15,707],257:[561,10,444,37,442],258:[876,0,722,15,707],259:[664,10,444,37,442],260:[674,165,722,15,707],261:[460,165,444,37,472],262:[890,14,667,28,633],263:[678,10,444,25,412],264:[886,14,667,28,633],265:[674,10,444,25,412],266:[834,14,667,28,633],267:[622,10,444,25,412],268:[886,14,667,28,633],269:[674,10,444,25,412],270:[886,0,722,16,685],271:[701,10,586,27,604],272:[662,0,722,16,685],273:[683,10,500,27,507],274:[773,0,611,12,597],275:[561,10,444,25,424],276:[876,0,611,12,597],277:[664,10,444,25,424],278:[834,0,611,12,597],279:[622,10,444,25,424],280:[662,165,611,12,597],281:[460,165,444,25,424],282:[886,0,611,12,597],283:[674,10,444,25,424],284:[886,14,722,32,709],285:[674,218,500,28,470],286:[876,14,722,32,709],287:[664,218,500,28,470],288:[834,14,722,32,709],289:[622,218,500,28,470],290:[676,280,722,32,709],291:[766,218,500,28,470],292:[886,0,722,18,703],293:[886,0,500,9,487],294:[662,0,723,17,702],295:[683,0,500,8,487],296:[850,0,333,1,331],297:[638,0,278,-25,305],298:[773,0,333,11,322],299:[561,0,278,-21,290],300:[876,0,333,18,315],301:[664,0,278,-1,280],302:[662,165,333,18,315],303:[683,165,278,16,277],304:[834,0,333,18,315],306:[662,14,747,18,728],307:[683,218,538,16,454],308:[886,14,373,-6,367],309:[674,218,278,-70,295],310:[662,280,722,33,723],311:[683,280,500,7,505],312:[459,0,542,5,532],313:[890,0,611,12,598],314:[890,0,278,19,257],315:[662,280,611,12,598],316:[683,280,278,19,257],317:[683,0,611,12,598],318:[702,0,381,19,362],319:[662,0,620,29,615],320:[683,0,370,19,354],321:[662,0,611,10,597],322:[683,0,278,19,259],323:[890,11,722,12,707],324:[678,0,500,16,485],325:[662,280,722,12,707],326:[460,280,500,16,485],327:[886,11,722,12,707],328:[674,0,500,16,485],329:[702,0,590,20,566],330:[678,18,710,16,673],331:[460,218,504,16,424],332:[773,14,722,34,688],333:[561,10,500,29,470],334:[876,14,722,34,688],335:[664,10,500,29,470],336:[890,14,722,34,688],337:[678,10,500,29,470],338:[668,6,889,30,885],339:[460,10,722,30,690],340:[890,0,667,17,660],341:[678,0,333,5,335],342:[662,280,667,17,660],343:[460,280,333,5,335],344:[886,0,667,17,660],345:[674,0,333,5,335],346:[890,14,556,43,491],347:[678,10,389,51,348],348:[886,14,556,43,491],349:[674,10,389,40,351],350:[676,215,556,43,491],351:[459,215,389,51,348],352:[924,14,556,43,491],353:[674,10,389,38,349],354:[662,215,611,17,593],355:[579,215,278,13,279],356:[886,0,611,17,593],357:[701,10,315,13,333],358:[662,0,613,17,593],359:[584,5,279,11,280],360:[849,14,722,14,705],361:[638,10,500,9,480],362:[773,14,722,14,705],363:[561,10,500,9,480],364:[876,14,722,14,705],365:[664,10,500,9,480],366:[898,14,722,14,705],367:[711,10,500,9,480],368:[890,14,722,14,705],369:[678,10,500,9,480],370:[662,165,722,14,705],371:[450,156,500,9,480],372:[886,11,944,5,932],373:[674,14,722,21,694],374:[886,0,722,22,703],375:[674,218,500,14,475],376:[872,0,722,22,703],377:[890,0,612,10,598],378:[678,0,444,27,418],379:[834,0,612,10,598],380:[622,0,444,27,418],381:[924,0,612,10,598],382:[674,0,444,27,418],383:[683,0,334,20,383]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/LatinExtendedA.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedAdditional.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedAdditional.js
new file mode 100644
index 0000000..4d2b8b3
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedAdditional.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedAdditional.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{7808:[890,11,944,5,932],7809:[678,14,722,21,694],7810:[890,11,944,5,932],7811:[678,14,722,21,694],7812:[834,11,944,5,932],7813:[622,14,722,21,694],7922:[890,0,722,22,703],7923:[678,218,500,14,475]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/LatinExtendedAdditional.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedB.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedB.js
new file mode 100644
index 0000000..f513b5f
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedB.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedB.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{384:[683,10,500,-19,472],392:[559,10,500,25,511],400:[684,6,580,33,562],402:[706,159,434,6,426],405:[683,10,735,9,710],409:[683,0,500,7,505],410:[683,0,278,19,257],411:[668,0,520,55,516],414:[460,233,500,16,485],416:[754,14,722,34,688],417:[474,10,545,29,531],421:[669,217,500,5,470],426:[684,233,432,20,412],427:[579,218,290,13,279],429:[683,10,310,14,333],431:[774,14,766,14,810],432:[561,10,500,9,539],437:[662,0,612,10,598],442:[450,234,381,4,360],443:[676,0,500,22,482],446:[539,12,500,73,427],448:[736,0,160,54,105],449:[736,0,280,54,225],450:[736,0,435,34,400],451:[676,9,333,130,236],496:[674,218,278,-70,294],506:[938,0,722,15,707],507:[890,10,444,37,442],508:[890,0,889,0,863],509:[678,7,667,38,632],510:[890,80,722,34,688],511:[678,112,500,29,470],545:[683,150,671,27,652],564:[683,150,429,19,410],565:[460,150,672,16,653],566:[580,150,401,13,382]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/LatinExtendedB.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedD.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedD.js
new file mode 100644
index 0000000..5089a87
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedD.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedD.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{42791:[683,233,481,9,427]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/LatinExtendedD.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LetterlikeSymbols.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LetterlikeSymbols.js
new file mode 100644
index 0000000..346ebf5
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LetterlikeSymbols.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LetterlikeSymbols.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{8450:[676,14,705,45,663],8453:[676,14,837,48,795],8455:[676,14,598,28,561],8458:[441,219,738,30,678],8459:[687,15,997,53,991],8460:[695,204,824,43,773],8461:[662,0,718,70,648],8462:[683,10,577,47,545],8463:[683,10,579,47,547],8464:[675,15,897,26,888],8466:[687,15,946,33,931],8467:[687,11,579,48,571],8469:[662,0,698,70,628],8470:[676,14,1012,7,966],8471:[676,14,760,38,722],8473:[662,0,678,70,628],8474:[676,65,765,45,715],8475:[687,15,944,34,876],8477:[662,0,747,70,712],8478:[667,101,780,69,763],8482:[662,-256,980,30,957],8484:[662,0,727,50,677],8485:[662,218,424,35,391],8486:[676,0,744,29,715],8487:[662,14,744,29,715],8488:[695,204,726,50,676],8489:[463,0,360,32,276],8491:[871,0,722,15,707],8492:[687,15,950,34,902],8493:[695,24,717,47,675],8494:[676,17,843,35,808],8495:[441,11,627,30,554],8496:[687,15,750,100,734],8497:[680,0,919,43,907],8498:[662,0,535,13,462],8499:[674,15,1072,38,1056],8500:[441,11,697,30,680],8502:[677,19,639,57,572],8503:[677,19,505,40,463],8504:[677,19,599,52,495],8508:[450,12,673,25,645],8509:[460,218,540,0,526],8510:[662,0,469,70,567],8511:[662,0,718,70,648],8512:[763,259,923,61,882],8513:[676,14,695,68,668],8514:[662,0,559,13,485],8515:[662,0,559,13,485],8516:[662,0,630,21,609],8517:[662,0,722,70,677],8518:[683,10,574,45,519],8519:[460,10,523,45,478],8520:[683,0,258,55,203],8521:[683,217,305,-15,250],8522:[692,0,664,45,602],8523:[676,13,778,28,736]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/LetterlikeSymbols.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Main.js
new file mode 100644
index 0000000..588d30f
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral={directory:"General/Regular",family:"STIXGeneral",Ranges:[[160,255,"Latin1Supplement"],[256,383,"LatinExtendedA"],[384,591,"LatinExtendedB"],[592,687,"IPAExtensions"],[688,767,"SpacingModLetters"],[768,879,"CombDiacritMarks"],[880,1023,"GreekAndCoptic"],[1024,1279,"Cyrillic"],[7424,7615,"PhoneticExtensions"],[7680,7935,"LatinExtendedAdditional"],[8192,8303,"GeneralPunctuation"],[8304,8351,"SuperAndSubscripts"],[8352,8399,"CurrencySymbols"],[8400,8447,"CombDiactForSymbols"],[8448,8527,"LetterlikeSymbols"],[8528,8591,"NumberForms"],[8592,8703,"Arrows"],[8704,8959,"MathOperators"],[8960,9215,"MiscTechnical"],[9216,9279,"ControlPictures"],[9312,9471,"EnclosedAlphanum"],[9472,9599,"BoxDrawing"],[9600,9631,"BlockElements"],[9632,9727,"GeometricShapes"],[9728,9983,"MiscSymbols"],[9984,10175,"Dingbats"],[10176,10223,"MiscMathSymbolsA"],[10224,10239,"SupplementalArrowsA"],[10496,10623,"SupplementalArrowsB"],[10624,10751,"MiscMathSymbolsB"],[10752,11007,"SuppMathOperators"],[11008,11263,"MiscSymbolsAndArrows"],[12288,12351,"CJK"],[12352,12447,"Hiragana"],[42784,43007,"LatinExtendedD"],[64256,64335,"AlphaPresentForms"],[65520,65535,"Specials"],[119808,119859,"MathBold"],[119860,119911,"MathItalic"],[119912,119963,"MathBoldItalic"],[119964,120015,"MathScript"],[120016,120067,"MathBoldScript"],[120068,120119,"Fraktur"],[120120,120171,"BBBold"],[120172,120223,"BoldFraktur"],[120224,120275,"MathSS"],[120276,120327,"MathSSBold"],[120328,120379,"MathSSItalic"],[120380,120431,"MathSSItalicBold"],[120432,120483,"MathTT"],[120484,120485,"ij"],[120488,120545,"GreekBold"],[120546,120603,"GreekItalic"],[120604,120661,"GreekBoldItalic"],[120662,120719,"GreekSSBold"],[120720,120777,"GreekSSBoldItalic"],[120782,120791,"MathBold"],[120792,120801,"BBBold"],[120802,120811,"MathSS"],[120812,120822,"MathSSBold"],[120822,120831,"MathTT"]],32:[0,0,250,0,0],33:[676,9,333,130,236],34:[676,-431,408,77,331],35:[662,0,500,6,495],36:[727,87,500,44,458],37:[706,19,747,61,686],38:[676,13,778,42,750],39:[676,-431,180,48,133],40:[676,177,333,48,304],41:[676,177,333,29,285],42:[676,-265,500,68,433],43:[547,41,685,48,636],44:[102,141,250,55,195],45:[257,-194,333,39,285],46:[100,11,250,70,181],47:[676,14,278,-9,287],48:[676,14,500,24,476],49:[676,0,500,111,394],50:[676,0,500,29,474],51:[676,14,500,41,431],52:[676,0,500,12,473],53:[688,14,500,31,438],54:[684,14,500,34,468],55:[662,8,500,20,449],56:[676,14,500,56,445],57:[676,22,500,30,459],58:[459,11,278,81,192],59:[459,141,278,80,219],60:[534,24,685,56,621],61:[386,-120,685,48,637],62:[534,24,685,56,621],63:[676,8,444,68,414],64:[676,14,921,116,809],65:[674,0,722,15,707],66:[662,0,667,17,593],67:[676,14,667,28,633],68:[662,0,722,16,685],69:[662,0,611,12,597],70:[662,0,556,11,546],71:[676,14,722,32,709],72:[662,0,722,18,703],73:[662,0,333,18,315],74:[662,14,373,-6,354],75:[662,0,722,33,723],76:[662,0,611,12,598],77:[662,0,889,12,864],78:[662,11,722,12,707],79:[676,14,722,34,688],80:[662,0,557,16,542],81:[676,177,722,34,701],82:[662,0,667,17,660],83:[676,14,556,43,491],84:[662,0,611,17,593],85:[662,14,722,14,705],86:[662,11,722,16,697],87:[662,11,944,5,932],88:[662,0,722,10,704],89:[662,0,722,22,703],90:[662,0,612,10,598],91:[662,156,333,88,299],92:[676,14,278,-9,287],93:[662,156,333,34,245],94:[662,-297,469,24,446],95:[-75,125,500,0,500],96:[678,-507,333,18,242],97:[460,10,444,37,442],98:[683,10,500,3,468],99:[460,10,444,25,412],100:[683,10,500,27,491],101:[460,10,444,25,424],102:[683,0,333,20,383],103:[460,218,500,28,470],104:[683,0,500,9,487],105:[683,0,278,16,253],106:[683,218,278,-70,194],107:[683,0,500,7,505],108:[683,0,278,19,257],109:[460,0,778,16,775],110:[460,0,500,16,485],111:[460,10,500,29,470],112:[460,217,500,5,470],113:[460,217,500,24,488],114:[460,0,333,5,335],115:[459,10,389,51,348],116:[579,10,278,13,279],117:[450,10,500,9,480],118:[450,14,500,19,477],119:[450,14,722,21,694],120:[450,0,500,17,479],121:[450,218,500,14,475],122:[450,0,444,27,418],123:[680,181,480,100,350],124:[676,14,200,67,133],125:[680,181,480,130,380],126:[325,-183,541,40,502],160:[0,0,250,0,0],168:[622,-523,333,18,316],172:[393,-115,600,48,552],175:[601,-547,333,11,322],177:[502,87,685,48,637],183:[310,-199,250,70,181],215:[529,25,640,43,597],247:[516,10,564,30,534],305:[460,0,278,16,253],567:[460,218,278,-70,193],710:[674,-507,333,11,322],711:[674,-507,333,11,322],713:[601,-547,334,11,322],714:[679,-509,333,93,320],715:[679,-509,333,22,249],728:[664,-507,335,27,308],729:[622,-523,333,118,217],732:[638,-532,333,1,331],768:[678,-507,0,-371,-147],769:[678,-507,0,-371,-147],770:[674,-507,0,-386,-75],771:[638,-532,0,-395,-65],772:[601,-547,0,-385,-74],774:[664,-507,0,-373,-92],775:[622,-523,0,-280,-181],776:[622,-523,0,-379,-81],778:[711,-512,0,-329,-130],779:[678,-507,0,-401,-22],780:[674,-507,0,-385,-74],824:[662,156,0,-380,31],915:[662,0,587,11,577],916:[674,0,722,48,675],920:[676,14,722,34,688],923:[674,0,702,15,687],926:[662,0,643,29,614],928:[662,0,722,18,703],931:[662,0,624,30,600],933:[674,0,722,29,703],934:[662,0,763,35,728],936:[690,0,746,22,724],937:[676,0,744,29,715],8224:[676,149,500,59,442],8225:[676,153,500,58,442],8230:[100,11,1000,111,888],8242:[678,-402,289,75,214],8254:[820,-770,500,0,500],8407:[760,-548,0,-453,-17],8465:[695,34,762,45,711],8472:[547,217,826,52,799],8476:[704,22,874,50,829],8501:[677,13,682,43,634],8592:[449,-58,926,71,857],8593:[662,156,511,60,451],8594:[448,-57,926,70,856],8595:[662,156,511,60,451],8596:[449,-57,926,38,888],8597:[730,224,511,60,451],8598:[662,156,926,70,856],8599:[662,156,926,70,856],8600:[662,156,926,70,856],8601:[662,156,926,70,856],8614:[450,-57,926,70,857],8617:[553,-57,926,70,856],8618:[553,-57,926,70,856],8636:[494,-220,955,54,901],8637:[286,-12,955,54,901],8640:[494,-220,955,54,901],8641:[286,-12,955,54,901],8652:[539,33,926,70,856],8656:[551,45,926,60,866],8657:[662,156,685,45,641],8658:[551,45,926,60,866],8659:[662,156,685,45,641],8660:[517,10,926,20,906],8661:[730,224,685,45,641],8704:[662,0,560,2,558],8706:[668,11,471,40,471],8707:[662,0,560,73,487],8709:[583,79,762,50,712],8711:[662,12,731,63,667],8712:[531,27,685,60,625],8713:[662,157,685,60,625],8715:[531,27,685,60,625],8719:[763,259,1000,52,948],8720:[763,259,1000,52,948],8721:[763,259,914,58,856],8722:[286,-220,685,64,621],8723:[502,87,685,48,637],8725:[710,222,523,46,478],8726:[411,-93,428,25,403],8727:[471,-33,523,67,457],8728:[387,-117,350,40,310],8729:[387,-117,350,40,310],8730:[973,259,928,112,963],8733:[430,0,685,41,643],8734:[430,0,926,70,854],8736:[547,0,685,23,643],8739:[690,189,266,100,166],8741:[690,189,523,129,394],8743:[536,29,620,31,589],8744:[536,29,620,31,589],8745:[536,31,620,48,572],8746:[536,31,620,48,572],8747:[824,320,459,32,639],8764:[362,-148,685,48,637],8768:[547,42,286,35,249],8771:[445,-55,685,48,637],8773:[532,27,685,48,637],8776:[475,-25,685,48,637],8781:[498,-8,685,48,637],8784:[611,-120,685,48,637],8800:[662,156,685,48,637],8801:[478,-28,685,48,637],8804:[609,103,685,64,629],8805:[609,103,685,64,629],8810:[532,26,933,25,908],8811:[532,26,933,25,908],8826:[532,26,685,64,621],8827:[532,26,685,64,621],8828:[628,120,685,64,621],8829:[629,119,685,64,621],8834:[531,25,685,64,621],8835:[531,25,685,64,621],8838:[607,103,685,64,621],8839:[607,103,685,64,621],8846:[536,31,620,48,572],8849:[607,103,685,64,621],8850:[607,103,685,64,621],8851:[536,31,620,48,572],8852:[536,31,620,48,572],8853:[623,119,842,50,792],8854:[623,119,842,50,792],8855:[623,119,842,50,792],8856:[623,119,842,50,792],8857:[583,79,762,50,712],8866:[662,0,685,64,621],8867:[662,0,685,64,621],8868:[662,0,685,48,637],8869:[662,0,685,48,637],8872:[662,0,685,64,621],8896:[763,259,924,54,870],8897:[763,259,924,54,870],8898:[778,254,924,94,830],8899:[768,264,924,94,830],8900:[488,-16,523,26,497],8901:[313,-193,286,83,203],8902:[597,13,700,35,665],8904:[582,80,810,54,756],8942:[606,104,511,192,319],8943:[316,-189,926,108,818],8945:[520,18,926,194,732],8968:[713,213,469,188,447],8969:[713,213,469,27,286],8970:[713,213,469,188,447],8971:[713,213,469,27,286],8994:[360,-147,1019,54,965],8995:[360,-147,1019,54,965],9135:[286,-220,315,0,315],9168:[405,-101,511,222,288],9651:[811,127,1145,35,1110],9657:[555,50,660,80,605],9661:[811,127,1145,35,1110],9667:[554,51,660,55,580],9711:[785,282,1207,70,1137],9824:[609,99,685,34,651],9825:[603,105,685,34,651],9826:[609,105,685,41,643],9827:[603,99,685,34,651],9837:[768,10,426,57,346],9838:[768,181,426,75,350],9839:[768,181,426,41,386],10216:[713,213,400,77,335],10217:[713,213,400,65,323],10222:[676,177,233,56,211],10223:[676,177,233,22,177],10229:[449,-58,1574,55,1519],10230:[449,-57,1574,55,1519],10231:[449,-57,1574,55,1519],10232:[551,45,1574,55,1519],10233:[551,45,1574,55,1519],10234:[517,10,1574,55,1519],10235:[450,-57,1574,55,1519],10236:[450,-57,1574,55,1519],10741:[710,222,523,46,478],10752:[763,259,1126,53,1073],10753:[763,259,1126,53,1073],10754:[763,259,1126,53,1073],10755:[768,264,924,94,830],10756:[768,264,924,94,830],10757:[763,259,924,94,830],10758:[763,259,924,94,830],10815:[662,0,694,30,664],10927:[609,103,685,64,621],10928:[609,103,685,64,621]};MathJax.OutputJax["HTML-CSS"].initFont("STIXGeneral");MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/Main.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathBold.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathBold.js
new file mode 100644
index 0000000..554e599
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathBold.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathBold.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{119808:[690,0,722,9,689],119809:[676,0,667,16,619],119810:[691,19,722,49,687],119811:[676,0,722,14,690],119812:[676,0,667,16,641],119813:[676,0,611,16,583],119814:[691,19,778,37,755],119815:[676,0,778,21,759],119816:[676,0,389,20,370],119817:[676,96,500,3,478],119818:[676,0,778,30,769],119819:[676,0,667,19,638],119820:[676,0,944,14,921],119821:[676,18,722,16,701],119822:[691,19,778,35,743],119823:[676,0,611,16,600],119824:[691,176,778,35,743],119825:[676,0,722,26,716],119826:[692,19,556,35,513],119827:[676,0,667,31,636],119828:[676,19,722,16,701],119829:[676,18,722,16,701],119830:[676,15,1000,19,981],119831:[676,0,722,16,699],119832:[676,0,722,15,699],119833:[676,0,667,28,634],119834:[473,14,500,25,488],119835:[676,14,556,17,521],119836:[473,14,444,25,430],119837:[676,14,556,25,534],119838:[473,14,444,25,427],119839:[691,0,333,14,389],119840:[472,206,500,28,483],119841:[676,0,556,15,534],119842:[691,0,278,15,256],119843:[691,203,333,-57,263],119844:[676,0,556,22,543],119845:[676,0,278,15,256],119846:[473,0,833,15,814],119847:[473,0,556,21,539],119848:[473,14,500,25,476],119849:[473,205,556,19,524],119850:[473,205,556,34,536],119851:[473,0,444,28,434],119852:[473,14,389,25,361],119853:[630,12,333,19,332],119854:[461,14,556,16,538],119855:[461,14,500,21,485],119856:[461,14,722,23,707],119857:[461,0,500,12,484],119858:[461,205,500,16,482],119859:[461,0,444,21,420],120782:[688,13,500,24,476],120783:[688,0,500,65,441],120784:[688,0,500,17,478],120785:[688,14,500,16,468],120786:[688,0,500,19,476],120787:[676,8,500,22,470],120788:[688,13,500,28,475],120789:[676,0,500,17,477],120790:[688,13,500,28,472],120791:[688,13,500,26,473]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/MathBold.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathBoldItalic.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathBoldItalic.js
new file mode 100644
index 0000000..ea01a7a
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathBoldItalic.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathBoldItalic.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{119912:[685,0,759,39,724],119913:[669,0,726,42,715],119914:[685,12,701,55,745],119915:[669,0,818,42,790],119916:[669,0,732,42,754],119917:[669,0,635,44,750],119918:[685,12,768,55,768],119919:[669,0,891,42,946],119920:[669,0,502,42,557],119921:[669,12,558,66,646],119922:[669,0,795,42,839],119923:[669,0,744,42,700],119924:[669,0,1016,42,1071],119925:[669,0,869,42,924],119926:[685,16,777,55,755],119927:[669,0,612,42,733],119928:[685,154,810,55,756],119929:[669,0,801,42,784],119930:[685,10,671,55,704],119931:[669,0,568,28,700],119932:[669,10,733,72,810],119933:[669,15,593,66,797],119934:[669,17,925,66,1129],119935:[669,0,808,28,830],119936:[669,0,549,39,725],119937:[669,0,797,66,830],119938:[462,10,581,44,548],119939:[685,8,509,50,487],119940:[462,10,477,44,460],119941:[685,14,595,44,589],119942:[462,10,498,44,459],119943:[685,206,572,44,632],119944:[462,203,527,22,527],119945:[685,10,576,50,543],119946:[620,9,357,55,300],119947:[620,207,431,-18,414],119948:[686,11,580,55,563],119949:[685,9,346,50,310],119950:[467,9,760,33,727],119951:[467,10,559,33,526],119952:[462,10,561,44,539],119953:[469,205,571,-33,554],119954:[462,205,526,44,532],119955:[467,0,441,33,424],119956:[462,11,474,55,419],119957:[592,10,351,44,318],119958:[463,10,535,33,502],119959:[473,14,554,52,539],119960:[473,14,814,52,799],119961:[462,8,587,33,543],119962:[462,205,519,35,522],119963:[461,19,531,35,499]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/MathBoldItalic.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathBoldScript.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathBoldScript.js
new file mode 100644
index 0000000..3fb6d9f
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathBoldScript.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathBoldScript.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{120016:[699,21,984,50,955],120017:[699,21,1060,55,985],120018:[699,21,912,60,877],120019:[699,21,991,60,906],120020:[699,21,826,95,791],120021:[699,21,1042,65,1025],120022:[699,21,834,82,799],120023:[699,21,1171,65,1154],120024:[699,21,997,47,977],120025:[699,224,906,19,886],120026:[699,21,1154,45,1130],120027:[699,21,1036,40,1015],120028:[699,21,1300,60,1245],120029:[699,21,1095,60,1078],120030:[699,21,809,72,749],120031:[699,21,1025,55,994],120032:[699,52,809,72,749],120033:[699,21,1048,55,973],120034:[699,21,816,81,781],120035:[699,21,1030,65,1025],120036:[699,21,964,60,904],120037:[699,21,1040,60,1024],120038:[699,21,1320,60,1306],120039:[699,21,1033,64,1010],120040:[699,224,989,60,963],120041:[699,21,996,50,976],120042:[462,14,942,35,865],120043:[699,14,646,60,624],120044:[462,14,764,35,683],120045:[699,14,949,28,912],120046:[462,14,726,35,648],120047:[699,205,768,25,749],120048:[462,224,819,27,771],120049:[699,14,838,55,758],120050:[698,14,558,40,534],120051:[698,223,840,41,823],120052:[699,14,810,55,730],120053:[699,14,650,43,632],120054:[462,14,1137,45,1057],120055:[462,14,851,45,771],120056:[462,14,848,35,780],120057:[462,205,885,25,770],120058:[462,205,913,35,833],120059:[462,0,677,40,648],120060:[557,14,562,51,449],120061:[669,14,618,47,612],120062:[450,14,842,31,762],120063:[458,14,732,40,670],120064:[458,14,1012,40,950],120065:[462,14,820,63,740],120066:[450,224,784,40,711],120067:[493,14,782,61,702]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/MathBoldScript.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathItalic.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathItalic.js
new file mode 100644
index 0000000..d5b18ae
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathItalic.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathItalic.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{119860:[667,0,717,35,685],119861:[653,0,696,38,686],119862:[659,12,671,50,711],119863:[653,0,790,38,765],119864:[653,0,714,38,734],119865:[653,0,618,38,723],119866:[668,12,734,50,734],119867:[653,0,873,38,923],119868:[653,0,480,38,530],119869:[653,12,540,60,620],119870:[653,0,762,38,802],119871:[653,0,708,38,668],119872:[653,0,1005,38,1055],119873:[653,0,851,38,901],119874:[669,11,732,50,712],119875:[653,0,594,38,704],119876:[667,152,781,50,731],119877:[653,0,740,38,725],119878:[668,10,650,50,680],119879:[653,0,550,25,670],119880:[653,13,705,65,775],119881:[653,16,575,60,760],119882:[653,16,916,60,1101],119883:[653,0,790,25,810],119884:[653,0,535,35,695],119885:[653,0,772,60,802],119886:[441,10,502,40,472],119887:[668,11,470,45,450],119888:[441,11,415,40,400],119889:[668,12,532,40,527],119890:[441,11,445,40,410],119891:[668,187,555,40,615],119892:[441,187,492,20,492],119894:[616,11,311,50,257],119895:[616,187,389,-16,372],119896:[668,11,542,45,527],119897:[668,10,318,45,278],119898:[441,8,710,30,680],119899:[441,8,497,30,467],119900:[441,11,458,40,438],119901:[441,183,489,-30,474],119902:[441,183,458,40,463],119903:[441,0,408,30,393],119904:[441,11,440,50,390],119905:[567,9,313,40,283],119906:[441,9,474,30,444],119907:[458,9,506,72,479],119908:[460,9,775,72,748],119909:[441,9,550,30,510],119910:[440,183,496,30,496],119911:[450,14,499,42,467]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/MathItalic.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathOperators.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathOperators.js
new file mode 100644
index 0000000..80ba277
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathOperators.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathOperators.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{8705:[760,15,463,59,404],8708:[775,122,560,71,487],8710:[674,0,731,63,665],8714:[459,-45,486,64,422],8716:[662,157,685,60,625],8717:[459,-45,486,64,422],8718:[640,0,545,60,485],8724:[741,41,685,48,636],8731:[973,259,928,112,963],8732:[973,259,928,112,963],8735:[584,0,685,50,634],8737:[547,72,685,22,642],8738:[519,11,685,56,653],8740:[690,189,404,23,381],8742:[690,189,609,23,586],8748:[824,320,701,32,881],8749:[824,320,943,32,1123],8750:[824,320,499,32,639],8751:[824,320,741,32,881],8752:[824,320,982,32,1122],8753:[824,320,499,32,639],8754:[824,320,499,32,639],8755:[824,320,499,32,639],8756:[521,16,620,38,582],8757:[521,16,620,38,582],8758:[521,13,511,192,319],8759:[521,13,685,82,602],8760:[511,-220,685,48,637],8761:[511,5,685,48,637],8762:[511,5,685,48,637],8763:[521,13,685,48,637],8765:[362,-148,685,48,637],8766:[413,-90,685,48,637],8767:[467,-39,685,49,637],8769:[424,-88,685,48,637],8770:[445,-55,685,48,637],8772:[519,35,685,48,637],8774:[604,107,685,47,637],8775:[647,202,685,48,637],8777:[549,49,685,48,637],8778:[552,45,685,48,637],8779:[532,26,685,48,638],8780:[532,27,685,48,637],8782:[471,-35,685,48,637],8783:[471,-120,685,48,637],8785:[611,106,685,48,637],8786:[611,105,685,48,637],8787:[611,106,685,48,637],8788:[417,-89,824,48,776],8789:[417,-89,824,48,776],8790:[416,-90,685,48,637],8791:[752,-120,685,48,637],8792:[729,-120,685,48,637],8793:[853,-120,685,48,637],8794:[853,-120,685,48,637],8795:[756,-120,685,48,637],8796:[853,-120,685,48,637],8797:[823,-120,685,7,678],8798:[703,-120,685,48,637],8799:[863,-120,685,48,637],8802:[662,156,685,48,637],8803:[544,38,685,48,637],8806:[718,211,685,57,622],8807:[718,211,685,57,622],8808:[746,260,685,56,621],8809:[746,260,685,56,621],8812:[730,224,466,85,381],8813:[572,66,685,48,637],8814:[662,156,685,56,621],8815:[662,156,685,56,621],8816:[730,229,685,56,621],8817:[730,229,685,56,622],8818:[664,164,685,48,637],8819:[664,164,685,48,637],8820:[731,228,685,48,637],8821:[730,229,685,48,637],8822:[705,204,685,56,621],8823:[705,204,685,56,621],8824:[750,250,685,48,637],8825:[750,250,685,48,637],8830:[664,164,685,48,637],8831:[664,164,685,48,637],8832:[662,156,685,64,621],8833:[662,156,685,64,621],8836:[662,156,685,65,623],8837:[662,156,685,65,623],8840:[730,229,685,64,621],8841:[730,229,685,64,621],8842:[627,216,685,64,621],8843:[627,216,685,64,621],8844:[536,31,620,48,572],8845:[536,31,620,48,572],8847:[531,25,685,64,621],8848:[531,25,685,64,621],8858:[623,119,842,50,792],8859:[623,119,842,50,792],8860:[623,119,842,50,792],8861:[623,119,842,50,792],8862:[662,158,910,45,865],8863:[662,158,910,45,865],8864:[662,158,910,45,865],8865:[662,157,910,45,865],8870:[662,0,497,64,433],8871:[662,0,498,64,434],8873:[662,0,860,57,814],8874:[662,0,860,45,815],8875:[662,0,860,57,814],8876:[662,0,786,9,723],8877:[662,0,786,9,723],8878:[662,0,968,9,922],8879:[662,0,968,9,922],8880:[551,45,685,64,621],8881:[551,45,685,64,621],8882:[531,25,685,24,631],8883:[531,25,685,54,661],8884:[607,103,685,24,631],8885:[607,103,685,54,661],8886:[403,-103,1145,50,1095],8887:[403,-103,1145,50,1095],8888:[403,-103,849,50,799],8889:[547,41,685,48,636],8890:[450,212,480,74,406],8891:[536,139,620,32,590],8892:[646,29,620,32,590],8893:[646,29,620,32,590],8894:[584,0,685,50,634],8895:[662,158,911,45,865],8903:[545,38,685,51,634],8905:[582,80,810,93,716],8906:[582,80,810,93,716],8907:[582,80,810,74,736],8908:[582,80,810,74,736],8909:[445,-55,685,48,637],8910:[532,25,580,31,549],8911:[532,25,580,31,549],8912:[531,25,685,64,621],8913:[531,25,685,64,621],8914:[536,31,620,48,572],8915:[536,31,620,48,572],8916:[631,31,620,48,572],8917:[690,189,685,48,637],8918:[534,24,685,56,621],8919:[534,24,685,56,621],8920:[534,24,1274,45,1229],8921:[534,24,1274,45,1229],8922:[830,324,685,56,621],8923:[830,324,685,56,621],8924:[607,103,685,64,621],8925:[607,103,685,64,621],8926:[627,121,685,64,621],8927:[627,121,685,64,621],8928:[730,229,685,64,621],8929:[730,229,685,64,621],8930:[730,229,685,65,622],8931:[730,229,685,65,622],8932:[627,216,685,64,621],8933:[627,216,685,64,621],8934:[669,279,685,48,637],8935:[669,279,685,48,637],8936:[670,279,685,48,637],8937:[670,279,685,48,637],8938:[662,156,635,24,581],8939:[662,156,635,54,611],8940:[730,229,635,24,581],8941:[730,229,635,54,611],8944:[520,18,926,194,732],8946:[531,27,823,55,763],8947:[531,27,685,60,625],8948:[459,-45,486,62,420],8949:[716,27,685,60,625],8950:[685,27,685,60,625],8951:[613,-45,486,62,420],8952:[532,180,685,60,625],8953:[531,27,685,61,625],8954:[531,27,823,55,763],8955:[531,27,685,59,624],8956:[459,-45,486,62,420],8957:[685,27,685,61,626],8958:[613,-45,486,67,425],8959:[662,0,560,73,487]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/MathOperators.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSS.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSS.js
new file mode 100644
index 0000000..ef1af35
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSS.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSS.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{120224:[674,0,666,31,635],120225:[662,0,604,74,547],120226:[676,14,671,27,637],120227:[662,0,692,74,656],120228:[662,0,583,74,540],120229:[662,0,535,74,523],120230:[676,14,695,27,627],120231:[662,0,658,74,584],120232:[662,0,401,45,356],120233:[662,14,398,12,305],120234:[662,0,634,74,630],120235:[662,0,559,74,546],120236:[662,0,843,75,768],120237:[662,14,675,74,601],120238:[676,14,714,30,684],120239:[662,0,525,74,512],120240:[676,175,716,30,691],120241:[662,0,589,74,581],120242:[676,14,541,32,481],120243:[662,0,608,15,593],120244:[662,14,661,69,592],120245:[662,11,654,31,623],120246:[662,11,921,29,892],120247:[662,0,700,31,669],120248:[662,0,630,21,609],120249:[662,0,637,28,603],120250:[463,10,448,35,391],120251:[684,10,496,63,466],120252:[463,10,456,23,432],120253:[684,11,494,28,437],120254:[463,10,444,23,428],120255:[683,0,336,20,369],120256:[463,216,496,21,467],120257:[684,0,487,63,424],120258:[679,0,220,64,156],120259:[679,216,254,-74,185],120260:[684,0,453,63,452],120261:[684,0,205,61,144],120262:[464,0,756,65,691],120263:[464,0,487,63,424],120264:[463,10,499,28,471],120265:[464,216,498,67,470],120266:[464,216,498,28,435],120267:[464,0,336,63,328],120268:[463,10,389,49,350],120269:[580,10,291,1,287],120270:[453,11,491,63,430],120271:[453,14,474,31,443],120272:[453,14,702,28,675],120273:[453,0,482,30,452],120274:[453,216,484,28,453],120275:[453,0,447,25,417],120802:[676,14,500,23,477],120803:[677,0,500,108,302],120804:[676,0,500,35,469],120805:[676,14,500,31,441],120806:[676,0,500,11,489],120807:[676,14,500,36,458],120808:[684,14,500,32,470],120809:[662,8,500,38,451],120810:[676,14,500,49,447],120811:[676,21,500,28,466]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/MathSS.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSSBold.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSSBold.js
new file mode 100644
index 0000000..473800d
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSSBold.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSSBold.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{120276:[690,0,690,25,665],120277:[676,0,636,80,594],120278:[691,19,723,49,688],120279:[676,0,709,80,674],120280:[676,0,635,80,597],120281:[676,0,582,80,570],120282:[691,19,746,37,671],120283:[676,0,715,80,635],120284:[676,0,440,65,375],120285:[676,96,481,15,406],120286:[676,0,712,80,707],120287:[676,0,603,80,587],120288:[676,0,913,80,833],120289:[676,18,724,80,644],120290:[692,18,778,35,743],120291:[676,0,581,80,569],120292:[691,176,779,35,754],120293:[676,0,670,80,657],120294:[691,19,554,35,511],120295:[676,0,641,14,627],120296:[676,19,699,75,624],120297:[676,18,690,25,665],120298:[676,15,997,30,967],120299:[676,0,740,40,700],120300:[676,0,694,20,674],120301:[676,0,653,25,623],120302:[473,14,489,23,428],120303:[676,13,512,55,487],120304:[473,14,462,25,442],120305:[676,14,518,25,463],120306:[473,13,452,25,433],120307:[691,0,340,14,374],120308:[472,206,504,28,490],120309:[676,0,510,55,455],120310:[688,0,245,50,195],120311:[688,203,324,-57,269],120312:[676,0,519,55,506],120313:[676,0,235,55,180],120314:[473,0,776,55,721],120315:[473,0,510,55,455],120316:[473,14,501,25,476],120317:[473,205,512,55,487],120318:[473,205,512,25,457],120319:[473,0,411,55,406],120320:[473,13,385,25,357],120321:[630,12,386,7,371],120322:[461,15,518,55,463],120323:[461,14,462,15,447],120324:[461,14,701,17,684],120325:[461,0,506,20,486],120326:[461,205,472,18,455],120327:[461,0,441,21,417],120812:[688,13,500,24,476],120813:[688,0,500,82,334],120814:[688,0,500,20,474],120815:[688,13,500,18,479],120816:[688,0,500,19,484],120817:[676,13,500,13,483],120818:[688,13,500,26,475],120819:[676,0,500,35,471],120820:[688,13,500,28,472],120821:[688,13,500,26,475],120822:[681,11,525,55,467]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/MathSSBold.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSSItalic.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSSItalic.js
new file mode 100644
index 0000000..ae5587e
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSSItalic.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSSItalic.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{120328:[674,0,666,31,635],120329:[662,0,604,74,641],120330:[676,14,671,96,755],120331:[662,0,692,74,751],120332:[662,0,583,74,678],120333:[662,0,535,74,679],120334:[676,14,695,97,755],120335:[662,0,658,74,749],120336:[662,0,401,59,512],120337:[662,14,398,22,470],120338:[662,0,634,74,729],120339:[662,0,559,74,564],120340:[662,0,843,75,933],120341:[662,14,675,74,766],120342:[676,14,714,99,779],120343:[662,0,525,74,638],120344:[676,175,716,99,779],120345:[662,0,589,74,639],120346:[676,14,541,62,597],120347:[662,0,608,161,748],120348:[662,14,661,117,757],120349:[662,11,654,196,788],120350:[662,11,921,194,1057],120351:[662,0,700,31,806],120352:[662,0,630,186,774],120353:[662,0,637,28,763],120354:[463,10,448,55,467],120355:[684,10,496,74,535],120356:[463,10,456,67,503],120357:[684,11,494,72,600],120358:[463,10,444,69,487],120359:[683,0,336,101,526],120360:[463,216,496,-7,575],120361:[684,0,487,63,510],120362:[679,0,220,69,325],120363:[679,216,254,-118,354],120364:[684,0,453,63,556],120365:[684,0,205,61,313],120366:[464,0,756,65,775],120367:[464,0,487,63,510],120368:[463,10,499,76,536],120369:[464,216,498,14,538],120370:[464,216,498,72,549],120371:[464,0,336,63,439],120372:[463,10,389,61,432],120373:[580,10,291,96,376],120374:[453,11,491,89,536],120375:[453,14,474,143,555],120376:[453,14,702,140,787],120377:[453,0,482,30,544],120378:[453,216,484,-19,565],120379:[453,0,447,25,517]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/MathSSItalic.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSSItalicBold.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSSItalicBold.js
new file mode 100644
index 0000000..27cb660
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSSItalicBold.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSSItalicBold.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{120380:[690,0,690,25,665],120381:[676,0,636,80,691],120382:[691,19,723,119,797],120383:[676,0,709,80,772],120384:[676,0,635,80,728],120385:[676,0,582,80,725],120386:[691,19,746,107,785],120387:[676,0,715,80,803],120388:[676,0,440,79,534],120389:[676,96,481,15,574],120390:[676,0,712,80,816],120391:[676,0,603,80,612],120392:[676,0,913,80,1001],120393:[676,18,724,80,812],120394:[692,18,778,106,840],120395:[676,0,581,80,695],120396:[691,176,779,105,839],120397:[676,0,670,80,698],120398:[691,19,554,66,637],120399:[676,0,641,157,785],120400:[676,19,699,123,792],120401:[676,18,690,193,833],120402:[676,15,997,198,1135],120403:[676,0,740,40,853],120404:[676,0,694,188,842],120405:[676,0,653,25,769],120406:[473,14,489,48,507],120407:[676,13,512,51,558],120408:[473,14,462,71,524],120409:[676,14,518,69,625],120410:[473,13,452,71,492],120411:[692,0,340,72,533],120412:[472,206,504,2,599],120413:[676,0,510,55,542],120414:[688,0,245,59,366],120415:[688,202,324,-90,440],120416:[676,0,519,55,599],120417:[676,0,235,55,348],120418:[473,0,776,55,809],120419:[473,0,510,55,542],120420:[473,14,501,72,542],120421:[473,205,512,3,559],120422:[473,205,512,69,574],120423:[473,0,411,55,519],120424:[473,13,385,37,442],120425:[631,12,386,98,447],120426:[462,15,518,81,569],120427:[462,14,462,129,561],120428:[462,14,701,131,798],120429:[462,0,506,20,582],120430:[462,204,472,-27,569],120431:[462,0,441,21,530]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/MathSSItalicBold.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathScript.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathScript.js
new file mode 100644
index 0000000..49fb853
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathScript.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathScript.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{119964:[674,15,855,31,846],119966:[687,15,797,37,781],119967:[687,15,885,36,818],119970:[687,15,773,83,740],119973:[674,177,802,9,792],119974:[687,15,1009,40,1004],119977:[687,15,970,38,956],119978:[680,15,692,82,663],119979:[687,15,910,38,886],119980:[680,38,692,82,663],119982:[680,15,743,67,701],119983:[687,15,912,43,907],119984:[687,15,842,36,805],119985:[687,15,932,35,922],119986:[687,15,1078,35,1070],119987:[687,15,891,36,873],119988:[687,226,926,91,916],119989:[687,15,932,59,912],119990:[441,11,819,30,758],119991:[687,12,580,47,559],119992:[441,11,662,30,589],119993:[687,11,845,30,827],119995:[687,209,685,27,673],119997:[687,11,753,38,690],119998:[653,11,496,83,484],119999:[653,219,730,9,718],120000:[687,11,726,40,666],120001:[687,11,579,48,571],120002:[441,11,1038,49,978],120003:[441,11,761,49,701],120005:[441,209,773,23,694],120006:[441,209,780,30,743],120007:[444,0,580,48,572],120008:[531,11,515,62,412],120009:[658,11,551,30,532],120010:[424,11,753,30,693],120011:[441,11,618,30,582],120012:[441,11,888,30,852],120013:[441,11,752,65,675],120014:[424,219,658,30,617],120015:[478,11,691,52,617]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/MathScript.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathTT.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathTT.js
new file mode 100644
index 0000000..d9bcf93
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathTT.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathTT.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{120432:[673,0,525,26,496],120433:[662,0,525,29,480],120434:[672,11,525,40,482],120435:[662,0,525,25,483],120436:[662,0,525,31,500],120437:[662,0,525,34,488],120438:[672,11,525,37,495],120439:[662,0,525,26,496],120440:[662,0,525,84,438],120441:[662,11,525,85,476],120442:[662,0,525,30,494],120443:[662,0,525,37,487],120444:[662,0,525,21,501],120445:[662,0,525,31,491],120446:[672,11,525,56,466],120447:[662,0,525,31,479],120448:[672,139,525,56,466],120449:[662,11,525,26,520],120450:[672,11,525,52,470],120451:[662,0,525,26,496],120452:[662,11,525,9,514],120453:[662,8,525,17,506],120454:[662,8,525,11,512],120455:[662,0,525,24,497],120456:[662,0,525,15,507],120457:[662,0,525,47,479],120458:[459,6,525,58,516],120459:[609,6,525,17,481],120460:[459,6,525,78,464],120461:[609,6,525,41,505],120462:[459,6,525,60,462],120463:[615,0,525,42,437],120464:[461,228,525,29,508],120465:[609,0,525,17,505],120466:[610,0,525,84,448],120467:[610,227,525,47,362],120468:[609,0,525,24,505],120469:[609,0,525,63,459],120470:[456,0,525,2,520],120471:[456,0,525,17,505],120472:[459,6,525,62,460],120473:[456,221,525,17,481],120474:[456,221,525,45,530],120475:[456,0,525,37,485],120476:[459,6,525,72,457],120477:[580,6,525,25,448],120478:[450,6,525,17,505],120479:[450,4,525,22,500],120480:[450,4,525,15,508],120481:[450,0,525,23,498],120482:[450,227,525,24,501],120483:[450,0,525,32,473],120823:[681,0,525,110,435],120824:[681,0,525,52,470],120825:[681,11,525,43,479],120826:[682,0,525,29,493],120827:[670,11,525,52,470],120828:[681,11,525,58,464],120829:[686,11,525,43,479],120830:[681,11,525,43,479],120831:[681,11,525,58,464]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/MathTT.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscMathSymbolsA.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscMathSymbolsA.js
new file mode 100644
index 0000000..50df5b5
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscMathSymbolsA.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscMathSymbolsA.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{10176:[584,0,685,50,634],10177:[811,127,1145,35,1110],10178:[662,0,693,52,641],10179:[529,27,685,60,625],10180:[529,27,685,61,626],10181:[702,198,455,55,400],10182:[702,198,455,55,400],10183:[536,29,620,31,589],10184:[533,25,966,60,906],10185:[533,25,966,60,906],10188:[806,213,325,20,325],10192:[744,242,1064,39,1025],10193:[536,29,620,31,589],10194:[536,31,620,48,572],10195:[584,0,685,50,634],10196:[584,0,685,50,634],10197:[582,80,1019,40,965],10198:[582,80,1019,54,979],10199:[582,80,1228,40,1188],10200:[718,213,866,50,816],10201:[718,213,866,50,816],10202:[662,0,1376,64,1312],10203:[662,0,1376,64,1312],10204:[403,-103,849,50,799],10205:[450,-57,1574,55,1519],10206:[450,-57,1574,55,1519],10207:[693,187,502,101,401],10208:[795,289,790,45,745],10209:[589,87,764,45,719],10210:[589,87,803,45,758],10211:[589,87,803,45,758],10212:[662,158,1182,45,1137],10213:[662,158,1182,45,1137],10214:[717,213,504,188,482],10215:[717,213,504,22,316],10218:[719,213,610,73,545],10219:[719,213,610,65,537],10220:[719,213,488,178,466],10221:[719,213,488,22,310]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/MiscMathSymbolsA.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscMathSymbolsB.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscMathSymbolsB.js
new file mode 100644
index 0000000..f562b96
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscMathSymbolsB.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscMathSymbolsB.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{10624:[695,189,594,85,509],10625:[487,-14,565,46,519],10626:[566,59,503,110,393],10627:[719,213,596,108,477],10628:[719,213,596,119,488],10629:[719,213,463,70,393],10630:[719,213,463,70,393],10631:[719,214,511,115,367],10632:[719,214,511,144,396],10633:[719,213,511,100,352],10634:[719,213,511,159,411],10635:[719,213,469,188,447],10636:[719,213,469,22,281],10637:[719,213,469,188,447],10638:[719,213,469,22,281],10639:[719,213,469,188,447],10640:[719,213,469,22,281],10641:[719,213,400,73,357],10642:[719,213,400,73,357],10643:[649,143,685,34,591],10644:[649,143,685,94,651],10645:[649,143,685,86,643],10646:[649,143,685,42,599],10647:[719,213,488,188,466],10648:[719,213,488,22,300],10649:[661,155,211,50,161],10650:[662,156,511,177,334],10651:[547,72,685,42,662],10652:[584,0,685,50,634],10653:[584,0,685,50,634],10654:[547,0,685,11,675],10655:[396,0,685,24,643],10656:[517,13,685,57,654],10657:[609,-12,685,77,607],10658:[547,0,685,42,662],10659:[547,0,685,42,662],10660:[547,200,685,23,643],10661:[547,200,685,42,662],10662:[547,0,900,40,860],10663:[547,0,900,40,860],10664:[574,72,685,29,649],10665:[574,72,685,36,656],10666:[578,68,685,29,649],10667:[578,68,685,36,656],10668:[562,58,706,34,680],10669:[562,58,706,26,672],10670:[562,58,706,34,680],10671:[562,58,708,26,672],10672:[583,79,762,50,712],10673:[717,79,762,50,712],10674:[819,79,762,50,712],10675:[832,79,762,50,712],10676:[832,79,762,50,712],10677:[623,119,910,24,886],10678:[623,119,842,50,792],10679:[623,119,842,50,792],10680:[623,119,842,50,792],10681:[623,119,842,50,792],10682:[623,119,842,50,792],10683:[623,119,842,50,792],10684:[623,119,842,50,792],10685:[882,179,842,50,792],10686:[623,119,842,50,792],10687:[623,119,842,50,792],10688:[623,119,842,50,792],10689:[623,119,842,50,792],10690:[623,119,1091,50,1056],10691:[623,119,1091,50,1056],10692:[662,158,910,45,865],10693:[662,158,910,45,865],10694:[662,158,910,45,865],10695:[662,158,910,45,865],10696:[662,158,910,45,865],10697:[712,207,1046,64,982],10698:[1003,127,1145,35,1110],10699:[811,259,1145,35,1110],10700:[811,127,1145,35,1110],10701:[811,127,1165,15,1150],10702:[698,193,780,70,710],10703:[531,25,857,48,777],10704:[531,25,857,80,809],10705:[582,80,810,93,716],10706:[582,80,810,93,716],10707:[582,80,810,93,716],10708:[582,80,810,94,717],10709:[582,80,810,93,716],10710:[602,100,810,74,736],10711:[602,100,810,74,736],10712:[620,116,511,177,334],10713:[620,116,511,176,333],10714:[620,116,688,177,511],10715:[620,116,688,177,511],10716:[430,0,926,70,854],10717:[653,0,926,70,854],10718:[695,189,926,70,854],10719:[403,-103,1145,50,1095],10720:[662,157,910,45,865],10721:[512,8,667,24,613],10722:[414,0,790,64,726],10723:[662,156,685,47,637],10724:[842,156,685,47,637],10725:[662,156,685,48,637],10726:[584,78,798,60,738],10727:[695,189,628,48,580],10728:[811,127,1145,35,1110],10729:[811,127,1145,35,1110],10730:[744,241,762,32,730],10731:[795,289,790,45,745],10732:[743,241,762,50,712],10733:[743,241,762,50,712],10734:[747,243,762,97,665],10735:[747,243,762,97,665],10736:[747,243,762,32,730],10737:[747,243,762,32,730],10738:[747,243,762,65,697],10739:[747,243,762,65,697],10740:[521,13,926,55,871],10742:[765,80,520,94,426],10743:[662,80,520,94,426],10744:[695,325,602,85,517],10745:[695,325,602,85,517],10746:[532,25,685,64,621],10747:[532,25,685,64,621],10748:[713,213,459,77,394],10749:[713,213,459,65,382],10750:[540,36,762,93,669],10751:[316,-190,762,93,669]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/MiscMathSymbolsB.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscSymbols.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscSymbols.js
new file mode 100644
index 0000000..9a8e85d
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscSymbols.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscSymbols.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{9733:[655,66,870,60,810],9734:[655,66,870,60,810],9737:[583,79,762,50,712],9740:[634,131,581,54,553],9742:[676,0,1000,32,967],9746:[662,158,910,45,865],9761:[630,35,619,70,549],9785:[728,82,1150,170,980],9786:[728,82,1150,170,980],9787:[728,82,1150,170,980],9788:[623,122,837,46,791],9789:[728,82,641,40,601],9790:[728,82,641,40,601],9791:[702,198,603,65,538],9792:[638,135,603,65,538],9793:[638,135,603,65,538],9794:[634,131,660,54,620],9795:[732,176,970,66,904],9796:[793,140,970,63,866],9798:[760,110,840,60,780],9799:[730,110,632,76,576],9800:[760,110,964,25,939],9801:[644,139,781,43,738],9828:[609,99,685,34,651],9829:[603,105,685,34,651],9830:[609,105,685,41,643],9831:[603,99,685,34,651],9833:[714,125,390,45,345],9834:[714,125,560,50,510],9835:[842,125,840,40,721],9854:[775,271,1186,70,1116],9856:[669,23,1032,170,862],9857:[669,23,1032,170,862],9858:[669,23,1032,170,862],9859:[669,23,1032,170,862],9860:[669,23,1032,170,862],9861:[669,23,1032,170,862],9862:[687,42,1032,152,881],9863:[687,42,1032,152,881],9864:[687,42,1032,152,881],9865:[687,42,1032,152,881],9888:[1023,155,1510,25,1485],9893:[784,281,660,54,620],9898:[583,79,762,50,712],9899:[583,79,762,50,712],9900:[487,-14,565,46,519],9906:[638,135,603,65,538]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/MiscSymbols.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscSymbolsAndArrows.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscSymbolsAndArrows.js
new file mode 100644
index 0000000..38dba8a
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscSymbolsAndArrows.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscSymbolsAndArrows.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{11026:[662,157,910,45,865],11027:[662,157,910,45,865],11028:[662,157,910,45,865],11029:[662,157,910,45,865],11030:[744,242,1064,39,1025],11031:[744,242,1064,39,1025],11032:[744,242,1064,39,1025],11033:[744,242,1064,39,1025],11034:[662,157,910,45,865],11035:[780,180,1040,40,1000],11036:[780,180,1040,40,1000],11037:[332,-172,240,50,190],11038:[332,-172,240,50,190],11039:[690,105,910,36,874],11040:[690,105,910,36,874],11041:[680,178,910,82,828],11042:[680,178,910,82,828],11043:[633,127,926,24,902],11044:[785,282,1207,70,1137],11045:[581,96,779,45,734],11046:[581,96,779,45,734],11047:[609,105,544,40,504],11048:[609,105,544,40,504],11049:[488,-16,523,26,497],11050:[488,-16,357,26,331],11051:[488,-16,357,26,331],11052:[500,-4,842,50,792],11053:[500,-4,842,50,792],11054:[623,119,596,50,546],11055:[623,119,596,50,546],11056:[448,-57,926,70,856],11057:[739,232,926,60,866],11058:[569,61,1200,52,1147],11059:[449,-58,1574,55,1519],11060:[450,-57,926,56,871],11061:[450,-57,926,55,871],11062:[450,-57,926,55,871],11063:[449,-57,1412,55,1357],11064:[449,-57,926,55,873],11065:[450,-57,926,55,871],11066:[450,-57,926,55,871],11067:[449,-57,926,55,871],11068:[450,-57,926,55,871],11069:[450,-57,926,50,876],11070:[449,-57,926,55,871],11071:[449,-57,926,55,871],11072:[565,-57,926,55,871],11073:[508,-57,926,55,871],11074:[449,141,926,55,871],11075:[532,26,926,45,871],11076:[532,26,926,45,871],11077:[701,195,928,55,873],11078:[701,195,928,55,873],11079:[508,-57,926,55,871],11080:[449,141,926,55,871],11081:[508,-57,926,55,871],11082:[449,141,926,55,871],11083:[449,2,926,55,871],11084:[449,2,926,55,871],11088:[619,30,794,60,734],11089:[619,30,794,60,734],11090:[597,13,700,35,665],11091:[712,126,865,45,840],11092:[712,127,865,45,840]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/MiscSymbolsAndArrows.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscTechnical.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscTechnical.js
new file mode 100644
index 0000000..a32f19e
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscTechnical.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscTechnical.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{8960:[487,-14,606,25,581],8962:[774,0,926,55,871],8965:[577,0,620,48,572],8966:[728,0,620,48,572],8972:[166,215,463,52,412],8973:[166,215,463,52,412],8974:[876,-495,463,52,412],8975:[876,-495,463,52,412],8976:[393,-115,600,48,552],8977:[439,-65,523,75,449],8978:[331,0,762,50,712],8979:[331,0,762,50,712],8981:[582,189,847,26,796],8982:[748,246,1100,53,1047],8983:[749,245,1100,53,1047],8984:[662,156,926,55,871],8985:[393,-115,600,48,552],8986:[671,69,685,64,622],8988:[662,-281,463,51,411],8989:[662,-281,463,51,411],8990:[164,217,463,51,411],8991:[164,217,463,52,412],9001:[713,213,400,77,335],9002:[713,213,400,65,323],9004:[692,186,926,83,843],9005:[592,88,986,55,931],9006:[450,140,624,-18,574],9010:[562,56,889,80,809],9014:[751,156,926,85,841],9021:[683,179,910,84,826],9023:[703,176,683,60,623],9024:[703,176,683,60,623],9043:[751,176,794,55,739],9072:[751,176,794,55,739],9084:[584,220,871,50,820],9107:[386,-120,913,85,841],9108:[633,127,926,24,902],9140:[766,-574,926,55,871],9141:[109,83,926,55,871],9142:[495,-11,926,55,871],9166:[731,225,926,50,856],9180:[55,152,556,-10,566],9181:[771,-564,556,-10,566],9182:[117,88,556,-10,566],9183:[769,-564,556,-10,566],9184:[66,212,926,-3,929],9185:[842,-564,926,-3,929],9186:[558,53,1144,54,1090],9187:[680,178,910,82,828],9188:[286,-220,1094,47,1047],9189:[527,20,1018,23,995],9190:[434,-72,926,55,871],9191:[606,97,798,194,733]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/MiscTechnical.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/NumberForms.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/NumberForms.js
new file mode 100644
index 0000000..6392b41
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/NumberForms.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/NumberForms.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{8531:[676,14,750,36,725],8532:[676,14,750,14,731],8533:[676,14,750,37,715],8534:[676,14,750,14,720],8535:[676,14,750,13,720],8536:[676,14,750,14,720],8537:[676,14,750,37,717],8538:[676,15,750,29,722],8539:[676,14,750,37,722],8540:[676,14,750,13,727],8541:[676,14,750,29,727],8542:[676,14,750,28,727]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/NumberForms.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/PhoneticExtensions.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/PhoneticExtensions.js
new file mode 100644
index 0000000..b750c34
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/PhoneticExtensions.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/PhoneticExtensions.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{7424:[468,0,510,15,495],7431:[464,0,504,21,481],7452:[464,14,583,21,560],7553:[683,287,528,27,491],7556:[683,287,542,7,505],7557:[683,287,294,19,257],7562:[459,287,389,51,348],7565:[450,287,516,17,479],7566:[450,287,453,27,416]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/PhoneticExtensions.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SpacingModLetters.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SpacingModLetters.js
new file mode 100644
index 0000000..4679dcc
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SpacingModLetters.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SpacingModLetters.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{688:[848,-336,378,7,365],689:[848,-336,378,7,365],690:[852,-169,300,44,244],691:[681,-336,252,5,252],692:[680,-335,277,10,257],693:[680,-168,325,10,338],694:[680,-335,390,6,379],695:[680,-331,520,6,512],696:[680,-176,370,14,361],697:[684,-421,208,90,257],698:[684,-421,305,19,324],699:[686,-443,333,79,218],700:[686,-443,333,79,218],701:[686,-443,333,79,218],702:[680,-485,198,35,163],703:[680,-485,198,35,163],704:[690,-295,326,23,303],705:[690,-295,326,23,303],706:[755,-419,317,33,285],707:[755,-419,317,33,285],708:[713,-461,317,-9,327],709:[713,-461,317,-9,327],712:[713,-448,278,119,159],716:[70,195,278,119,159],717:[-104,159,334,11,323],718:[-21,192,333,25,249],719:[-21,192,333,84,308],720:[460,-19,333,89,244],721:[460,-299,333,89,244],722:[365,-75,333,72,262],723:[365,-75,333,71,261],724:[205,-18,333,51,281],725:[205,-18,333,51,281],726:[218,-26,333,71,263],727:[144,-100,333,71,263],730:[711,-512,333,67,266],731:[0,165,333,64,249],733:[678,-507,333,-3,376],734:[443,-186,298,0,263],735:[662,-425,333,48,284],736:[684,-219,378,24,335],737:[848,-336,215,19,197],738:[681,-331,291,36,261],739:[680,-336,380,5,372],740:[850,-336,341,45,319],741:[662,0,413,48,373],742:[662,0,405,40,365],743:[662,0,405,40,365],744:[662,0,405,40,365],745:[662,0,405,40,365],748:[70,147,333,21,311],749:[665,-507,405,10,395]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/SpacingModLetters.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Specials.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Specials.js
new file mode 100644
index 0000000..4580491
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Specials.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Specials.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{65533:[662,217,872,55,817]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/Specials.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SuperAndSubscripts.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SuperAndSubscripts.js
new file mode 100644
index 0000000..4c496be
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SuperAndSubscripts.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SuperAndSubscripts.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{8319:[676,-270,541,57,484]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/SuperAndSubscripts.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SuppMathOperators.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SuppMathOperators.js
new file mode 100644
index 0000000..086ef0d
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SuppMathOperators.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SuppMathOperators.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{10759:[763,259,1180,83,1097],10760:[763,259,1180,83,1097],10761:[763,259,1021,50,971],10762:[763,259,914,58,856],10763:[824,320,690,33,659],10764:[824,320,1184,32,1364],10765:[824,320,499,32,639],10766:[824,320,499,32,639],10767:[824,320,499,32,639],10768:[824,320,499,32,639],10769:[824,320,499,32,639],10770:[824,320,519,32,639],10771:[824,320,499,32,639],10772:[824,320,628,32,688],10773:[824,320,499,32,639],10774:[824,320,529,32,639],10775:[824,320,738,32,818],10776:[824,320,539,32,639],10777:[824,320,559,32,639],10778:[824,320,559,32,639],10779:[947,320,459,32,639],10780:[824,443,459,32,639],10781:[770,252,1270,93,1177],10782:[764,258,1018,45,924],10783:[566,291,503,110,410],10784:[633,127,1177,98,1079],10785:[805,300,547,215,472],10786:[819,41,685,48,636],10787:[707,41,685,48,636],10788:[704,41,685,48,636],10789:[547,235,685,48,636],10790:[547,198,685,48,636],10791:[547,210,685,41,673],10792:[547,41,685,48,636],10793:[556,-220,685,48,637],10794:[286,5,685,48,637],10795:[511,5,685,48,637],10796:[511,5,685,48,637],10797:[623,119,724,50,674],10798:[623,119,724,50,674],10799:[447,-59,490,50,439],10800:[686,25,640,43,597],10801:[529,130,640,43,597],10802:[529,45,640,43,597],10803:[538,32,685,57,627],10804:[623,119,674,50,624],10805:[623,119,674,50,624],10806:[810,119,842,50,792],10807:[752,248,1100,50,1050],10808:[623,119,842,50,792],10809:[811,127,1145,35,1110],10810:[811,127,1145,35,1110],10811:[811,127,1145,35,1110],10812:[393,-115,600,48,552],10813:[393,-115,600,48,552],10814:[488,170,300,60,230],10816:[536,31,620,48,572],10817:[536,31,620,48,572],10818:[668,31,620,48,572],10819:[668,31,620,48,572],10820:[536,31,620,48,572],10821:[536,31,620,48,572],10822:[914,406,620,48,572],10823:[914,406,620,48,572],10824:[914,406,620,48,572],10825:[914,406,620,48,572],10826:[528,39,1078,48,1030],10827:[527,40,1078,48,1030],10828:[602,31,620,10,610],10829:[536,97,620,10,610],10830:[536,31,620,48,572],10831:[536,31,620,48,572],10832:[602,31,620,10,610],10833:[710,29,620,31,589],10834:[710,29,620,31,589],10835:[536,29,620,31,589],10836:[536,29,620,31,589],10837:[536,29,780,32,748],10838:[536,29,780,32,748],10839:[536,29,706,106,683],10840:[536,29,706,23,600],10841:[585,77,620,31,589],10842:[536,29,620,31,589],10843:[536,29,620,31,589],10844:[536,29,620,31,589],10845:[536,29,620,31,589],10846:[796,29,620,31,589],10847:[536,139,620,30,590],10848:[536,289,620,30,590],10849:[479,0,620,45,575],10850:[806,29,620,30,590],10851:[536,289,620,30,590],10852:[791,284,1043,70,1008],10853:[791,284,1043,70,1008],10854:[386,105,685,48,637],10855:[703,-28,685,48,637],10856:[695,189,685,48,637],10857:[662,156,685,48,637],10858:[521,-148,685,48,637],10859:[521,13,685,48,637],10860:[543,38,685,48,637],10861:[703,27,685,48,637],10862:[847,-120,685,48,637],10863:[707,-25,685,48,637],10864:[650,146,685,48,637],10865:[648,141,685,48,637],10866:[648,141,685,48,637],10867:[532,27,685,48,637],10868:[417,-89,1015,48,967],10869:[386,-120,997,48,949],10870:[386,-120,1436,48,1388],10871:[611,106,685,48,637],10872:[703,-28,685,38,647],10873:[532,26,685,44,609],10874:[532,26,685,76,641],10875:[806,26,685,44,609],10876:[806,26,685,76,641],10877:[625,137,685,56,621],10878:[625,137,685,56,621],10879:[625,137,685,60,625],10880:[625,137,685,60,625],10881:[625,137,685,60,625],10882:[625,137,685,60,625],10883:[777,137,685,60,625],10884:[777,137,685,60,625],10885:[746,275,685,48,637],10886:[746,275,685,48,637],10887:[628,216,685,60,625],10888:[628,216,687,56,621],10889:[746,309,685,48,637],10890:[746,309,685,48,637],10891:[930,424,685,56,621],10892:[930,424,685,56,621],10893:[746,176,685,48,637],10894:[746,176,685,48,637],10895:[867,361,685,60,649],10896:[867,361,685,60,649],10897:[844,338,685,55,630],10898:[844,338,685,55,630],10899:[866,361,685,60,625],10900:[866,361,685,60,625],10901:[640,122,685,56,621],10902:[640,122,685,56,621],10903:[640,122,685,56,621],10904:[640,122,685,56,621],10905:[718,211,685,60,625],10906:[718,211,685,60,625],10907:[726,220,685,60,625],10908:[726,220,685,60,625],10909:[664,164,685,53,642],10910:[664,164,685,43,632],10911:[774,267,685,48,637],10912:[774,267,685,48,637],10913:[532,26,685,44,609],10914:[532,26,685,76,641],10915:[609,103,933,25,908],10916:[532,26,782,60,722],10917:[532,26,855,60,795],10918:[532,26,685,35,625],10919:[532,26,685,60,650],10920:[625,137,685,50,640],10921:[626,137,685,45,635],10922:[537,31,685,45,609],10923:[537,31,685,76,640],10924:[613,103,685,60,625],10925:[613,103,685,60,625],10926:[563,-28,685,48,637],10929:[628,216,685,60,625],10930:[628,216,685,60,625],10931:[717,211,685,60,625],10932:[717,211,685,60,625],10933:[747,260,685,65,622],10934:[747,260,685,65,622],10935:[747,275,685,48,637],10936:[747,275,685,48,637],10937:[747,309,685,48,637],10938:[747,309,685,48,637],10939:[532,26,933,25,908],10940:[532,26,933,25,908],10941:[532,26,685,60,625],10942:[532,26,685,60,625],10943:[607,103,685,60,625],10944:[607,103,685,60,625],10945:[607,103,685,60,625],10946:[607,103,685,60,625],10947:[709,103,685,60,625],10948:[709,103,685,60,625],10949:[717,211,685,64,622],10950:[717,211,685,65,623],10951:[665,164,685,60,625],10952:[665,164,685,60,625],10953:[746,274,685,60,625],10954:[746,274,685,60,625],10955:[717,319,685,61,619],10956:[717,319,685,66,624],10957:[558,53,1352,64,1288],10958:[558,53,1352,64,1288],10959:[532,26,685,50,615],10960:[532,26,685,70,635],10961:[609,103,685,60,626],10962:[609,103,685,60,625],10963:[715,209,685,60,625],10964:[715,209,685,60,625],10965:[715,209,685,60,625],10966:[715,209,685,60,625],10967:[532,26,1250,60,1190],10968:[532,26,1250,60,1190],10969:[536,31,620,48,572],10970:[697,128,620,48,572],10971:[695,97,620,48,572],10972:[557,10,620,11,572],10973:[557,10,620,48,572],10974:[662,0,497,64,433],10975:[371,0,685,48,637],10976:[371,0,685,48,637],10977:[662,0,685,48,637],10978:[662,0,685,60,625],10979:[662,0,860,46,803],10980:[662,0,685,60,625],10981:[662,0,860,46,803],10982:[662,0,685,57,626],10983:[571,0,685,48,637],10984:[571,0,685,48,637],10985:[691,185,685,48,637],10986:[662,0,685,48,637],10987:[662,0,685,48,637],10988:[489,-18,600,48,552],10989:[489,-18,600,48,552],10990:[690,189,404,23,381],10991:[660,154,502,101,401],10992:[660,154,502,101,401],10993:[693,187,502,101,401],10994:[695,189,523,10,513],10995:[695,189,685,48,637],10996:[695,189,685,131,555],10997:[695,189,685,12,674],10998:[608,102,685,279,406],10999:[661,155,1170,58,1080],11000:[661,155,1170,90,1112],11001:[726,220,685,60,625],11002:[726,220,685,60,625],11003:[710,222,894,46,848],11005:[710,222,709,46,663],11006:[690,189,410,100,310]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/SuppMathOperators.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SupplementalArrowsA.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SupplementalArrowsA.js
new file mode 100644
index 0000000..e892ca4
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SupplementalArrowsA.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SupplementalArrowsA.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{10224:[662,156,1033,69,965],10225:[662,156,1033,69,965],10226:[626,116,974,54,882],10227:[626,116,974,92,920],10228:[569,61,1200,52,1147],10237:[551,45,1574,55,1519],10238:[551,45,1574,55,1519],10239:[449,-58,1574,55,1519]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/SupplementalArrowsA.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SupplementalArrowsB.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SupplementalArrowsB.js
new file mode 100644
index 0000000..23cd679
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SupplementalArrowsB.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SupplementalArrowsB.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{10496:[450,-57,926,56,871],10497:[450,-57,926,55,871],10498:[551,45,926,55,871],10499:[551,45,926,55,871],10500:[551,45,926,20,906],10501:[450,-57,926,55,871],10502:[551,45,926,55,871],10503:[551,45,926,55,871],10504:[662,156,511,59,452],10505:[662,156,511,59,452],10506:[662,156,926,71,854],10507:[662,156,926,72,855],10508:[449,-57,926,55,871],10509:[449,-57,926,55,871],10510:[449,-57,926,55,871],10511:[449,-57,926,55,871],10512:[449,-57,1412,55,1357],10513:[449,-57,926,55,873],10514:[662,156,511,59,452],10515:[662,156,511,59,452],10516:[450,-57,926,55,871],10517:[450,-57,926,55,871],10518:[449,-57,926,55,871],10519:[450,-57,926,55,871],10520:[450,-57,926,50,876],10521:[449,-57,926,55,871],10522:[449,-57,926,55,871],10523:[449,-57,926,55,871],10524:[449,-57,926,55,871],10525:[449,-57,926,55,871],10526:[449,-57,926,55,871],10527:[450,-57,926,55,871],10528:[450,-57,926,55,871],10529:[662,156,926,55,871],10530:[660,156,926,55,873],10531:[662,156,926,55,871],10532:[662,156,926,55,871],10533:[662,156,926,55,871],10534:[662,156,926,55,871],10535:[662,156,926,55,873],10536:[662,156,926,53,871],10537:[662,156,926,53,871],10538:[662,156,926,55,873],10539:[662,156,926,55,871],10540:[662,156,926,55,871],10541:[662,156,926,55,871],10542:[662,156,926,55,871],10543:[662,156,926,55,871],10544:[662,154,926,55,873],10545:[662,156,926,54,870],10546:[662,156,926,55,871],10547:[449,-57,926,55,871],10548:[562,0,926,141,797],10549:[562,0,926,141,797],10550:[493,163,784,87,649],10551:[493,163,784,135,697],10552:[657,153,511,70,415],10553:[657,153,511,96,441],10554:[423,-78,926,69,866],10555:[423,-78,926,60,857],10556:[423,-64,926,59,856],10557:[423,29,926,69,866],10558:[563,116,926,69,856],10559:[563,116,926,69,856],10560:[788,116,926,92,834],10561:[788,116,926,92,834],10562:[598,92,926,55,871],10563:[598,92,926,55,871],10564:[598,92,926,55,871],10565:[449,69,926,55,871],10566:[449,69,926,55,871],10567:[449,-57,926,55,871],10568:[449,-57,926,38,888],10569:[662,154,511,60,451],10570:[439,-67,926,38,888],10571:[439,-67,926,38,888],10572:[662,156,511,69,441],10573:[662,156,511,69,441],10574:[439,-220,926,38,888],10575:[662,156,511,222,441],10576:[286,-67,926,38,888],10577:[662,156,511,69,288],10578:[448,-58,926,55,871],10579:[448,-58,926,55,871],10580:[662,156,511,60,451],10581:[662,156,511,60,451],10582:[448,-58,926,55,871],10583:[448,-58,926,55,871],10584:[662,156,511,60,451],10585:[662,156,511,60,451],10586:[448,-58,926,55,871],10587:[448,-58,926,55,871],10588:[662,156,511,60,451],10589:[662,156,511,60,451],10590:[448,-58,926,55,871],10591:[448,-58,926,55,871],10592:[662,156,511,59,450],10593:[662,156,511,59,450],10594:[539,33,926,55,871],10595:[662,156,685,57,629],10596:[539,33,926,55,871],10597:[662,156,685,57,629],10598:[539,-120,926,55,871],10599:[386,33,926,55,871],10600:[539,-120,926,55,871],10601:[386,33,926,55,871],10602:[539,-120,926,55,871],10603:[386,33,926,55,871],10604:[539,-120,926,55,871],10605:[386,33,926,55,871],10606:[662,156,685,57,629],10607:[662,156,685,57,629],10608:[386,-120,926,55,871],10609:[565,-57,926,55,871],10610:[508,-57,926,55,871],10611:[449,2,926,55,871],10612:[449,2,926,55,871],10613:[449,141,926,55,871],10614:[607,283,685,64,621],10615:[532,26,926,45,871],10616:[608,282,685,64,621],10617:[627,262,685,64,621],10618:[532,26,926,45,871],10619:[627,262,685,63,620],10620:[511,5,926,135,791],10621:[511,5,926,135,791],10622:[581,75,685,84,600],10623:[581,75,685,84,600]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/SupplementalArrowsB.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/ij.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/ij.js
new file mode 100644
index 0000000..4279ec9
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/ij.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/ij.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXGeneral,{120484:[441,11,278,47,235],120485:[441,207,278,-124,246]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/General/Regular/ij.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsD/Bold/All.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsD/Bold/All.js
new file mode 100644
index 0000000..2603f21
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsD/Bold/All.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsD/Bold/All.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXIntegralsD-bold"],{32:[0,0,250,0,0],160:[0,0,250,0,0],8747:[2000,269,686,56,1136],8748:[2000,269,1084,56,1534],8749:[2000,269,1482,56,1932],8750:[2000,269,736,56,1136],8751:[2000,269,1134,56,1534],8752:[2000,269,1532,56,1932],8753:[2000,269,736,56,1136],8754:[2000,269,736,56,1136],8755:[2000,269,736,56,1136],10764:[2000,269,1880,56,2330],10765:[2000,269,736,56,1136],10766:[2000,269,736,56,1136],10767:[2000,269,736,56,1136],10768:[2000,269,736,56,1136],10769:[2000,269,736,56,1136],10770:[2000,269,836,56,1136],10771:[2000,269,736,56,1136],10772:[2000,269,926,56,1136],10773:[2000,269,736,56,1136],10774:[2000,269,836,56,1136],10775:[2000,269,911,24,1131],10776:[2000,269,736,56,1136],10777:[2000,269,836,56,1136],10778:[2000,269,836,56,1136],10779:[2182,269,746,56,1146],10780:[2000,451,696,56,1146]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/IntegralsD/Bold/All.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsD/Regular/All.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsD/Regular/All.js
new file mode 100644
index 0000000..0e907f0
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsD/Regular/All.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsD/Regular/All.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXIntegralsD,{32:[0,0,250,0,0],160:[0,0,250,0,0],8748:[2000,269,895,56,1345],8749:[2000,269,1205,56,1655],8751:[2000,269,945,56,1345],8752:[2000,269,1255,56,1655],8753:[2000,269,635,56,1035],8754:[2000,269,635,56,1035],8755:[2000,269,635,56,1035],10763:[2000,269,914,56,1035],10764:[2000,269,1515,56,1965],10765:[2000,269,635,56,1035],10766:[2000,269,635,56,1035],10767:[2000,269,635,56,1035],10768:[2000,269,635,56,1035],10769:[2000,269,635,56,1035],10770:[2000,269,735,56,1035],10771:[2000,269,635,56,1035],10772:[2000,269,844,56,1054],10773:[2000,269,635,56,1035],10774:[2000,269,735,56,1035],10775:[2000,269,819,24,1039],10776:[2000,269,635,56,1035],10777:[2000,269,735,56,1035],10778:[2000,269,735,56,1035],10779:[2157,269,636,56,1036],10780:[2000,426,585,56,1035]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/IntegralsD/Regular/All.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsD/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsD/Regular/Main.js
new file mode 100644
index 0000000..f4f9fc3
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsD/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsD/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXIntegralsD={directory:"IntegralsD/Regular",family:"STIXIntegralsD",Ranges:[[32,32,"All"],[160,160,"All"],[8747,8755,"All"],[10763,10780,"All"]],8747:[2000,269,585,56,1035],8750:[2000,269,635,56,1035]};MathJax.OutputJax["HTML-CSS"].initFont("STIXIntegralsD");MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/IntegralsD/Regular/Main.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsSm/Bold/All.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsSm/Bold/All.js
new file mode 100644
index 0000000..43acf9e
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsSm/Bold/All.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsSm/Bold/All.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXIntegralsSm-bold"],{32:[0,0,250,0,0],160:[0,0,250,0,0],8747:[732,193,562,41,618],8748:[732,193,870,41,926],8749:[732,193,1179,41,1235],8750:[732,193,626,41,618],8751:[732,193,934,41,926],8752:[732,193,1243,41,1235],8753:[732,193,626,41,618],8754:[732,193,626,41,618],8755:[732,193,626,41,618],10764:[732,193,1488,41,1544],10765:[732,193,578,41,618],10766:[732,193,578,41,618],10767:[732,193,626,41,618],10768:[732,193,562,41,618],10769:[732,193,626,41,618],10770:[732,193,579,41,618],10771:[732,193,581,41,618],10772:[732,193,688,41,652],10773:[732,193,626,41,618],10774:[732,193,579,41,618],10775:[732,193,646,8,646],10776:[732,193,578,41,618],10777:[732,193,559,41,618],10778:[732,193,559,41,618],10779:[802,193,555,41,611],10780:[732,268,556,41,612]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/IntegralsSm/Bold/All.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsSm/Regular/All.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsSm/Regular/All.js
new file mode 100644
index 0000000..c5089d8
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsSm/Regular/All.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsSm/Regular/All.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXIntegralsSm,{32:[0,0,250,0,0],160:[0,0,250,0,0],8748:[690,189,726,41,782],8749:[690,189,956,41,1012],8751:[690,189,790,41,782],8752:[690,189,1020,41,1012],8753:[690,189,560,41,552],8754:[690,189,560,41,552],8755:[690,189,560,41,552],10763:[694,190,593,41,552],10764:[695,189,1152,41,1242],10765:[694,190,512,41,552],10766:[693,190,512,41,552],10767:[694,190,560,41,552],10768:[694,190,496,41,552],10769:[695,189,560,41,552],10770:[694,191,513,41,552],10771:[694,190,512,41,552],10772:[694,190,635,41,597],10773:[694,190,512,43,552],10774:[695,189,512,41,552],10775:[694,190,613,13,586],10776:[695,189,512,41,552],10777:[694,190,512,40,551],10778:[694,190,512,40,551],10779:[784,190,462,41,552],10780:[694,284,496,41,552]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/IntegralsSm/Regular/All.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsSm/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsSm/Regular/Main.js
new file mode 100644
index 0000000..adeb1b7
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsSm/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsSm/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXIntegralsSm={directory:"IntegralsSm/Regular",family:"STIXIntegralsSm",Ranges:[[32,32,"All"],[160,160,"All"],[8747,8755,"All"],[10763,10780,"All"]],8747:[690,189,496,41,552],8750:[690,189,560,41,552]};MathJax.OutputJax["HTML-CSS"].initFont("STIXIntegralsSm");MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/IntegralsSm/Regular/Main.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUp/Bold/All.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUp/Bold/All.js
new file mode 100644
index 0000000..8b2a29b
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUp/Bold/All.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUp/Bold/All.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXIntegralsUp-bold"],{32:[0,0,250,0,0],160:[0,0,250,0,0],8747:[824,320,425,59,467],8748:[824,320,715,59,757],8749:[824,320,1005,59,1047],8750:[834,310,394,35,483],8751:[824,320,650,35,739],8752:[824,320,951,54,1047],8753:[824,320,484,54,553],8754:[824,320,445,35,534],8755:[824,320,456,35,545],10764:[824,320,1295,59,1337],10765:[824,320,511,59,553],10766:[824,320,511,59,553],10767:[824,320,592,59,634],10768:[824,320,385,35,474],10769:[824,320,484,54,553],10770:[824,320,417,35,486],10771:[824,320,424,54,493],10772:[824,320,535,54,604],10773:[824,320,416,35,505],10774:[824,320,459,35,528],10775:[824,320,824,45,884],10776:[824,320,527,45,587],10777:[824,320,567,45,632],10778:[824,320,567,45,632],10779:[959,320,479,45,521],10780:[824,455,411,35,511]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/IntegralsUp/Bold/All.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUp/Regular/All.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUp/Regular/All.js
new file mode 100644
index 0000000..04c5027
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUp/Regular/All.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUp/Regular/All.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXIntegralsUp,{32:[0,0,250,0,0],160:[0,0,250,0,0],8748:[824,320,596,59,638],8749:[824,320,826,59,868],8751:[824,320,548,35,637],8752:[824,320,876,54,972],8753:[824,320,478,54,547],8754:[824,320,441,35,530],8755:[824,320,475,35,564],10763:[812,332,706,43,661],10764:[812,332,1093,59,1135],10765:[812,332,467,59,509],10766:[812,332,467,59,509],10767:[812,332,529,59,571],10768:[812,332,346,35,435],10769:[812,332,478,54,547],10770:[812,332,365,35,434],10771:[812,332,384,54,453],10772:[812,332,509,54,578],10773:[812,332,396,35,485],10774:[812,332,412,31,481],10775:[812,332,771,45,831],10776:[812,332,455,45,515],10777:[812,332,504,45,569],10778:[812,332,504,45,569],10779:[935,332,453,45,495],10780:[812,455,376,59,509]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/IntegralsUp/Regular/All.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUp/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUp/Regular/Main.js
new file mode 100644
index 0000000..9db529f
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUp/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUp/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXIntegralsUp={directory:"IntegralsUp/Regular",family:"STIXIntegralsUp",Ranges:[[32,32,"All"],[160,160,"All"],[8747,8755,"All"],[10763,10780,"All"]],8747:[824,320,366,59,408],8750:[824,320,397,35,486]};MathJax.OutputJax["HTML-CSS"].initFont("STIXIntegralsUp");MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/IntegralsUp/Regular/Main.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpD/Bold/All.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpD/Bold/All.js
new file mode 100644
index 0000000..aa08519
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpD/Bold/All.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpD/Bold/All.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXIntegralsUpD-bold"],{32:[0,0,250,0,0],160:[0,0,250,0,0],8747:[2000,269,515,58,560],8748:[2000,269,875,58,920],8749:[2000,269,1239,59,1281],8750:[2000,269,626,56,695],8751:[2000,269,1039,39,1039],8752:[2000,269,1384,36,1395],8753:[2000,269,632,47,760],8754:[2000,269,639,56,769],8755:[2000,269,598,56,778],10764:[2000,269,1595,58,1640],10765:[2000,269,552,-35,590],10766:[2000,269,642,35,680],10767:[2000,269,675,25,752],10768:[2000,269,640,56,646],10769:[2000,269,632,47,760],10770:[2000,269,625,58,654],10771:[2000,269,557,58,626],10772:[2000,269,708,58,789],10773:[2000,269,626,56,695],10774:[2000,269,718,56,747],10775:[2000,269,963,24,1057],10776:[2000,269,681,62,692],10777:[2000,269,832,65,898],10778:[2000,269,832,65,898],10779:[2182,269,733,0,773],10780:[2000,451,525,58,831]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/IntegralsUpD/Bold/All.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpD/Regular/All.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpD/Regular/All.js
new file mode 100644
index 0000000..80c3b84
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpD/Regular/All.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpD/Regular/All.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXIntegralsUpD,{32:[0,0,250,0,0],160:[0,0,250,0,0],8748:[2000,269,787,58,832],8749:[2000,269,1107,58,1152],8751:[2000,269,849,39,849],8752:[2000,269,1161,36,1172],8753:[2000,269,608,47,736],8754:[2000,269,616,56,746],8755:[2000,269,605,56,785],10763:[2000,269,914,58,856],10764:[2000,269,1397,58,1442],10765:[2000,269,609,35,647],10766:[1999,270,609,35,647],10767:[1999,270,658,25,734],10768:[2000,269,629,56,635],10769:[2000,269,608,47,736],10770:[2000,269,568,58,597],10771:[2000,269,530,58,599],10772:[2000,269,695,58,776],10773:[2000,269,615,56,684],10774:[2000,269,653,56,682],10775:[2000,269,945,24,1039],10776:[2000,269,597,62,608],10777:[2000,269,735,65,801],10778:[2000,269,735,65,801],10779:[2157,269,701,0,741],10780:[2000,426,467,58,799]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/IntegralsUpD/Regular/All.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpD/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpD/Regular/Main.js
new file mode 100644
index 0000000..3d44584
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpD/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpD/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXIntegralsUpD={directory:"IntegralsUpD/Regular",family:"STIXIntegralsUpD",Ranges:[[32,32,"All"],[160,160,"All"],[8747,8755,"All"],[10763,10780,"All"]],8747:[2000,269,467,58,512],8750:[2000,269,616,56,685]};MathJax.OutputJax["HTML-CSS"].initFont("STIXIntegralsUpD");MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/IntegralsUpD/Regular/Main.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpSm/Bold/All.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpSm/Bold/All.js
new file mode 100644
index 0000000..f3b35bb
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpSm/Bold/All.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpSm/Bold/All.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXIntegralsUpSm-bold"],{32:[0,0,250,0,0],160:[0,0,250,0,0],8747:[732,193,396,52,414],8748:[732,193,666,52,684],8749:[732,193,936,52,954],8750:[732,193,466,52,426],8751:[732,193,736,52,696],8752:[732,193,998,52,965],8753:[732,193,501,52,468],8754:[732,193,501,52,469],8755:[732,193,496,52,486],10764:[732,193,1206,52,1224],10765:[732,193,450,52,420],10766:[732,193,450,52,420],10767:[732,193,550,40,518],10768:[732,193,479,52,447],10769:[732,193,511,52,478],10770:[732,193,489,52,449],10771:[732,193,487,52,447],10772:[732,193,572,52,534],10773:[732,193,520,52,480],10774:[732,193,523,52,483],10775:[732,193,600,8,646],10776:[733,192,505,31,467],10777:[732,193,516,52,476],10778:[732,193,516,52,476],10779:[802,193,403,40,428],10780:[732,268,411,52,440]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/IntegralsUpSm/Bold/All.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpSm/Regular/All.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpSm/Regular/All.js
new file mode 100644
index 0000000..7b62c04
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpSm/Regular/All.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpSm/Regular/All.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXIntegralsUpSm,{32:[0,0,250,0,0],160:[0,0,250,0,0],8748:[690,189,587,52,605],8749:[690,189,817,52,835],8751:[690,189,682,52,642],8752:[690,189,909,52,869],8753:[690,189,480,52,447],8754:[690,189,480,52,448],8755:[690,189,480,52,470],10763:[694,190,556,41,515],10764:[694,190,1044,68,1081],10765:[694,190,420,68,391],10766:[694,190,420,68,391],10767:[694,190,520,39,482],10768:[694,190,324,41,380],10769:[694,190,480,52,447],10770:[694,190,450,68,410],10771:[690,189,450,68,412],10772:[690,189,550,68,512],10773:[690,189,450,50,410],10774:[694,191,450,50,410],10775:[694,190,611,12,585],10776:[694,190,450,48,412],10777:[694,190,450,59,403],10778:[694,190,450,59,403],10779:[784,189,379,68,416],10780:[690,283,357,52,400]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/IntegralsUpSm/Regular/All.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpSm/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpSm/Regular/Main.js
new file mode 100644
index 0000000..6152c8b
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpSm/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpSm/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXIntegralsUpSm={directory:"IntegralsUpSm/Regular",family:"STIXIntegralsUpSm",Ranges:[[32,32,"All"],[160,160,"All"],[8747,8755,"All"],[10763,10780,"All"]],8747:[690,189,357,52,375],8750:[690,189,452,52,412]};MathJax.OutputJax["HTML-CSS"].initFont("STIXIntegralsUpSm");MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/IntegralsUpSm/Regular/Main.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Bold/All.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Bold/All.js
new file mode 100644
index 0000000..3e986aa
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Bold/All.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Bold/All.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXNonUnicode-bold"],{32:[0,0,250,0,0],160:[0,0,250,0,0]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/NonUnicode/Bold/All.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Bold/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Bold/Main.js
new file mode 100644
index 0000000..7ceb2f1
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Bold/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Bold/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXNonUnicode-bold"]={directory:"NonUnicode/Bold",family:"STIXNonUnicode",weight:"bold",Ranges:[[32,32,"All"],[160,160,"All"],[57344,63743,"PrivateUse"]]};MathJax.OutputJax["HTML-CSS"].initFont("STIXNonUnicode-bold");MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/NonUnicode/Bold/Main.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Bold/PrivateUse.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Bold/PrivateUse.js
new file mode 100644
index 0000000..ef54adc
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Bold/PrivateUse.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Bold/PrivateUse.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXNonUnicode-bold"],{57344:[610,25,1184,808,912],57345:[704,-75,1198,808,1224],57358:[819,339,750,80,670],57359:[742,235,750,80,670],57360:[742,235,750,80,670],57361:[819,339,750,80,670],57379:[742,235,750,68,683],57381:[852,345,750,67,683],57384:[672,166,1000,38,961],57385:[672,166,1000,38,961],57399:[672,166,750,67,682],57421:[553,47,750,68,683],57424:[672,166,750,87,663],57425:[672,166,750,87,663],57426:[574,69,750,68,683],57435:[574,-16,750,68,683],57436:[553,31,750,68,683],57438:[762,-565,0,95,425],57440:[-137,322,0,0,330],57441:[-137,437,0,0,330],57442:[-137,552,0,0,330],57444:[837,-565,333,-16,349],57445:[-137,409,0,-16,349],57446:[801,-565,0,91,430],57447:[-137,409,0,-16,349],57453:[835,113,750,82,668],57454:[835,113,750,82,668],57455:[835,113,750,82,668],57456:[835,113,750,82,668],57470:[738,230,750,80,670],57471:[742,234,750,80,670],57472:[819,337,750,80,670],57473:[820,342,750,91,681],57474:[742,235,750,80,670],57475:[742,234,750,80,670],57476:[738,230,750,80,670],57477:[742,234,750,80,670],57505:[691,19,769,27,734],57520:[752,-531,0,100,417],57521:[-50,271,0,100,417],57522:[-50,271,0,99,416],57523:[691,203,556,14,487],57524:[555,-209,282,42,239],57525:[555,-209,282,43,240],57526:[478,-56,0,15,142],57560:[688,13,400,57,343],57561:[663,0,314,54,260],57562:[663,0,425,54,371],57565:[930,0,553,76,483],57566:[926,0,549,67,482],57567:[765,0,773,67,706],57568:[920,0,552,42,510],57569:[765,0,378,55,323],57570:[754,0,481,63,435],57611:[297,-209,315,0,315],57614:[405,-101,714,211,503],57615:[399,-107,315,0,315],57680:[175,302,735,-40,756],57681:[175,302,735,-21,775],57682:[477,0,735,-40,756],57683:[477,0,735,-21,775],57955:[422,10,523,26,496],57959:[425,0,523,111,420],57963:[421,0,523,53,470],57967:[424,198,523,31,478],57971:[420,198,523,42,496],57975:[421,198,523,49,474],57979:[614,8,523,21,502],57983:[421,198,523,8,507],57987:[606,12,523,31,493],57991:[421,202,523,25,499],57997:[734,-484,0,92,498],57999:[175,0,325,-1,326],58000:[175,0,633,-1,634],58109:[775,235,722,9,689],58111:[775,235,667,16,619],58113:[775,207,620,16,593],58115:[775,207,722,33,673],58117:[775,235,667,16,641],58119:[775,235,667,28,634],58121:[775,235,778,21,759],58123:[775,207,778,35,743],58125:[775,235,389,-36,436],58127:[775,235,778,30,769],58129:[775,207,707,9,674],58131:[775,235,944,14,921],58133:[775,235,722,16,701],58135:[775,207,647,40,607],58137:[775,235,778,35,743],58139:[775,207,778,21,759],58141:[775,235,611,16,600],58143:[775,207,671,28,641],58145:[775,235,667,31,636],58147:[775,207,723,14,700],58149:[775,207,836,18,818],58151:[775,235,722,16,699],58153:[775,207,804,11,793],58155:[775,207,768,28,740],58213:[775,235,669,32,665],58217:[775,235,667,-13,670],58221:[793,235,757,-49,758],58225:[775,235,734,27,710],58236:[775,235,667,16,641],58250:[676,0,787,50,737],58251:[676,0,729,75,669],58253:[676,0,650,75,595],58254:[676,0,474,75,595],58255:[691,19,751,45,686],58256:[676,0,380,80,300],58257:[676,19,618,50,548],58258:[676,0,792,75,767],58259:[676,0,662,70,607],58260:[676,0,914,75,839],58261:[691,19,787,45,742],58262:[692,19,702,45,657],58263:[676,0,556,25,645],58264:[676,19,738,70,668],58265:[676,0,627,17,704],58266:[676,0,996,17,1015],58267:[676,0,794,20,769],58268:[676,0,652,23,739],58269:[473,14,623,50,563],58270:[676,14,643,60,593],58271:[473,14,574,50,524],58274:[676,0,474,25,536],58275:[473,205,643,50,583],58276:[676,0,624,60,564],58279:[676,0,646,60,621],58280:[676,0,325,60,265],58281:[473,0,908,60,848],58282:[473,0,624,60,564],58283:[473,14,598,45,553],58284:[473,205,643,60,593],58285:[473,205,643,50,583],58286:[473,0,339,60,445],58287:[473,14,549,52,497],58288:[676,14,446,25,411],58289:[461,16,619,55,559],58290:[461,0,494,6,544],58291:[461,0,786,22,789],58292:[461,0,660,25,635],58293:[461,205,471,-9,537],58294:[461,0,513,40,473],58295:[681,11,525,40,482],58296:[681,0,525,90,450],58297:[681,0,525,52,470],58298:[681,11,525,43,479],58299:[682,0,525,29,493],58300:[670,11,525,52,470],58301:[681,11,525,43,479],58302:[686,11,525,43,479],58303:[681,11,525,43,479],58304:[681,11,525,43,479],58307:[747,243,750,68,683],58308:[747,243,750,68,683]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/NonUnicode/Bold/PrivateUse.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/BoldItalic/All.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/BoldItalic/All.js
new file mode 100644
index 0000000..afea302
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/BoldItalic/All.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/BoldItalic/All.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXNonUnicode-bold-italic"],{32:[0,0,250,0,0],160:[0,0,250,0,0]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/NonUnicode/BoldItalic/All.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/BoldItalic/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/BoldItalic/Main.js
new file mode 100644
index 0000000..102fcae
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/BoldItalic/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/BoldItalic/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXNonUnicode-bold-italic"]={directory:"NonUnicode/BoldItalic",family:"STIXNonUnicode",weight:"bold",style:"italic",Ranges:[[32,32,"All"],[160,160,"All"],[57344,63743,"PrivateUse"]]};MathJax.OutputJax["HTML-CSS"].initFont("STIXNonUnicode-bold-italic");MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/NonUnicode/BoldItalic/Main.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/BoldItalic/PrivateUse.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/BoldItalic/PrivateUse.js
new file mode 100644
index 0000000..42624e1
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/BoldItalic/PrivateUse.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/BoldItalic/PrivateUse.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXNonUnicode-bold-italic"],{57500:[775,235,776,40,765],57501:[775,235,759,44,779],57502:[775,235,658,44,771],57523:[703,205,556,-188,517],57846:[688,13,500,89,578],57847:[688,0,500,204,505],57848:[688,0,500,20,581],57849:[688,13,500,32,586],57850:[688,0,500,55,583],57851:[676,13,500,27,651],57852:[688,13,500,80,638],57853:[676,0,500,120,639],57854:[688,13,500,63,594],57855:[688,13,500,28,588],57856:[669,0,733,7,667],57857:[669,0,729,18,714],57859:[669,0,680,18,703],57860:[669,0,474,18,703],57861:[685,14,718,35,708],57862:[669,0,382,22,411],57863:[669,14,603,19,644],57864:[669,0,766,18,766],57865:[669,0,613,18,568],57866:[669,0,912,26,943],57867:[685,14,749,35,734],57868:[685,14,686,30,711],57869:[669,0,445,30,653],57870:[669,14,709,35,755],57871:[669,0,504,42,705],57872:[669,0,891,81,991],57873:[669,0,759,7,832],57874:[669,0,462,10,714],57875:[462,13,634,45,589],57876:[699,13,661,34,619],57877:[462,13,571,45,545],57879:[462,13,575,45,540],57880:[699,0,438,45,618],57881:[462,205,666,28,642],57882:[699,0,661,34,616],57885:[699,0,641,34,616],57886:[699,0,372,34,413],57887:[462,0,942,35,897],57888:[462,0,661,34,616],57889:[462,13,586,45,551],57890:[462,205,680,3,645],57891:[462,205,662,45,630],57892:[462,0,403,33,538],57893:[462,13,533,33,519],57894:[676,14,403,22,422],57895:[449,13,661,45,627],57896:[449,0,477,32,534],57897:[449,0,733,55,763],57898:[449,0,562,-12,589],57899:[449,205,584,-9,643],57900:[449,0,619,35,594],57927:[711,47,871,38,834],57928:[703,10,755,33,740],57929:[704,12,667,36,669],57930:[696,0,802,30,808],57931:[704,8,609,41,626],57932:[696,0,645,34,738],57933:[704,144,615,43,615],57934:[696,24,849,22,858],57935:[696,0,621,36,623],57936:[695,116,645,36,811],57937:[703,14,856,38,820],57938:[704,8,726,38,688],57939:[705,45,1186,38,1146],57940:[835,39,997,36,1098],57941:[707,10,772,43,782],57942:[696,0,645,36,731],57943:[704,145,778,43,737],57944:[697,13,869,36,831],57945:[705,7,667,36,699],57946:[783,0,547,33,747],57947:[700,14,787,33,936],57948:[711,31,652,36,706],57949:[711,34,956,36,1010],57950:[710,14,720,36,781],57951:[711,144,720,36,773],57952:[702,98,778,36,744],57956:[473,10,600,47,554],57960:[473,0,600,95,450],57964:[473,0,600,54,531],57968:[463,217,600,31,547],57972:[450,217,600,30,564],57976:[450,218,600,25,561],57980:[670,10,600,55,545],57984:[450,217,600,24,582],57988:[670,10,600,41,560],57992:[463,217,600,49,539],58005:[775,235,776,40,739],58007:[775,235,762,44,747],58009:[775,235,711,57,753],58011:[775,235,870,44,840],58013:[775,235,759,44,779],58015:[775,235,658,44,771],58017:[775,235,789,57,787],58019:[775,235,915,44,940],58021:[775,235,502,46,525],58023:[775,235,648,68,688],58025:[775,207,814,44,838],58027:[775,235,764,44,718],58029:[775,235,1044,44,1069],58031:[775,235,857,44,882],58033:[775,235,802,57,777],58035:[775,207,626,19,790],58037:[775,245,834,57,777],58039:[775,235,783,44,757],58041:[775,235,589,57,621],58043:[775,235,562,30,696],58045:[775,235,745,74,813],58047:[775,235,597,66,774],58049:[775,235,980,66,1131],58051:[775,235,803,34,819],58053:[775,235,569,25,706],58055:[775,235,720,42,701],58057:[775,235,630,46,595],58059:[775,235,585,57,564],58061:[775,235,511,33,506],58063:[775,235,646,31,638],58065:[775,235,512,44,516],58067:[775,235,654,-29,762],58069:[775,235,601,24,599],58071:[775,235,611,35,577],58073:[775,207,373,34,488],58075:[775,235,600,-29,763],58077:[775,235,622,35,660],58079:[775,207,381,30,484],58081:[775,235,873,35,838],58083:[775,235,611,35,581],58085:[775,235,571,46,548],58087:[775,235,636,-25,649],58089:[775,207,580,46,568],58091:[775,235,437,35,567],58093:[775,235,512,42,515],58095:[775,207,411,32,486],58097:[775,235,632,60,597],58099:[775,207,554,52,558],58101:[775,207,814,17,799],58103:[775,235,647,35,622],58105:[775,207,599,20,640],58107:[775,235,531,35,555],58157:[775,207,671,46,675],58159:[775,207,664,-65,706],58161:[775,207,588,-100,671],58163:[775,207,571,46,547],58165:[775,207,508,44,515],58167:[775,207,505,-54,629],58169:[775,207,579,20,583],58171:[775,207,615,46,602],58173:[775,207,355,29,483],58175:[775,207,594,35,656],58177:[775,207,598,18,642],58179:[775,207,697,-34,737],58181:[775,207,571,35,584],58183:[775,207,504,-54,629],58185:[775,235,500,32,506],58187:[775,207,652,1,772],58189:[775,207,636,27,652],58191:[775,207,504,23,514],58193:[775,207,595,46,641],58195:[775,207,474,20,521],58197:[775,207,582,20,584],58199:[775,207,726,1,772],58201:[775,207,622,-41,730],58203:[775,207,720,37,808],58205:[775,207,782,24,795],58207:[775,207,608,20,681],58209:[775,207,727,0,771],58211:[775,207,925,6,978],58215:[775,235,475,-35,509],58219:[775,235,525,-68,651],58223:[775,235,485,16,466],58227:[775,235,530,12,731],58229:[775,235,569,-50,592],58231:[775,207,571,46,547],58233:[775,207,601,46,579],58235:[775,207,525,46,543],58238:[775,235,792,-40,777],58240:[707,14,670,10,662],58242:[707,14,622,14,598],58244:[628,14,411,18,390],58246:[473,14,355,15,338],58248:[707,14,598,18,563],58249:[666,0,480,16,472],58309:[462,207,514,47,475],58310:[462,9,357,55,274]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/NonUnicode/BoldItalic/PrivateUse.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Italic/All.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Italic/All.js
new file mode 100644
index 0000000..604889f
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Italic/All.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Italic/All.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXNonUnicode-italic"],{32:[0,0,250,0,0],160:[0,0,250,0,0]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/NonUnicode/Italic/All.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Italic/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Italic/Main.js
new file mode 100644
index 0000000..f62469e
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Italic/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Italic/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXNonUnicode-italic"]={directory:"NonUnicode/Italic",family:"STIXNonUnicode",style:"italic",Ranges:[[32,32,"All"],[160,160,"All"],[57344,63743,"PrivateUse"]],57901:[677,45,852,43,812],57902:[670,3,724,35,709],57903:[671,11,569,43,586],57904:[662,0,801,34,788],57905:[670,4,553,40,599],57906:[662,0,652,43,710],57907:[671,131,580,40,580],57908:[664,21,831,41,845],57909:[662,0,575,38,591],57910:[662,120,632,31,785],57911:[670,13,809,30,783],57912:[670,7,693,30,653],57913:[671,45,1166,40,1128],57914:[795,37,957,40,1064],57915:[669,10,737,38,729],57916:[662,0,667,38,709],57917:[671,131,744,43,704],57918:[662,3,854,38,816],57919:[671,0,634,38,671],57920:[721,0,509,41,730],57921:[672,13,817,37,950],57922:[677,33,638,33,680],57923:[685,32,956,33,998],57924:[672,13,692,38,739],57925:[675,131,719,34,763],57926:[664,94,752,38,714]};MathJax.OutputJax["HTML-CSS"].initFont("STIXNonUnicode-italic");MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/NonUnicode/Italic/Main.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Italic/PrivateUse.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Italic/PrivateUse.js
new file mode 100644
index 0000000..ab7782f
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Italic/PrivateUse.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Italic/PrivateUse.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXNonUnicode-italic"],{57500:[756,218,753,37,787],57501:[756,218,706,42,732],57502:[756,218,624,42,724],57523:[681,207,500,-141,504],57684:[653,0,671,3,606],57685:[653,0,686,17,676],57686:[653,0,639,17,664],57687:[653,0,469,18,664],57688:[666,18,702,35,702],57689:[653,0,320,21,350],57690:[653,18,562,16,595],57691:[653,0,700,17,730],57692:[653,0,608,18,524],57693:[653,0,858,25,892],57694:[666,18,723,35,713],57695:[666,18,624,24,669],57696:[653,0,463,30,682],57697:[653,14,648,33,716],57698:[653,0,492,75,678],57699:[653,0,810,100,963],57700:[653,0,650,-24,770],57701:[653,0,458,42,658],57702:[441,11,566,40,521],57703:[683,11,598,27,558],57704:[441,11,504,40,480],57705:[683,0,331,28,519],57706:[441,220,599,9,572],57707:[683,0,588,27,543],57708:[683,0,545,25,530],57709:[683,0,306,27,356],57710:[441,0,857,27,812],57711:[441,0,588,27,543],57712:[441,11,534,40,494],57713:[441,218,628,5,588],57714:[441,218,604,40,574],57715:[442,0,332,27,467],57716:[441,11,502,34,468],57717:[633,10,323,20,328],57718:[428,13,588,40,556],57719:[428,0,395,45,462],57720:[428,0,639,56,690],57721:[428,0,557,14,554],57722:[428,218,471,5,538],57723:[428,0,540,21,530],57780:[676,14,500,86,578],57781:[677,0,500,223,469],57782:[676,0,500,35,574],57783:[676,14,500,44,544],57784:[676,0,500,52,547],57785:[676,14,500,49,626],57786:[684,14,500,83,617],57787:[662,8,500,146,616],57788:[676,14,500,81,560],57789:[676,21,500,51,579],57790:[683,10,536,45,527],57791:[674,0,660,28,632],57792:[662,0,662,60,627],57793:[662,0,562,60,665],57794:[674,0,660,28,632],57795:[662,0,639,60,664],57796:[662,0,698,25,760],57797:[662,0,700,60,735],57798:[676,14,780,75,755],57799:[662,0,433,50,503],57800:[662,0,631,60,715],57801:[674,0,664,20,624],57802:[662,0,890,60,918],57803:[662,14,724,60,752],57804:[662,0,722,47,754],57805:[676,14,780,75,755],57806:[662,0,700,60,735],57807:[662,0,538,60,624],57808:[676,14,780,75,755],57809:[662,0,654,21,706],57810:[662,0,585,72,659],57811:[676,0,593,83,725],57812:[662,0,736,52,736],57813:[662,0,722,20,795],57814:[681,0,712,105,805],57815:[676,0,795,39,795],57816:[463,10,586,47,616],57817:[683,215,535,-12,559],57818:[463,216,503,84,527],57819:[683,10,497,30,537],57820:[463,10,494,35,484],57821:[683,213,429,32,454],57822:[463,215,493,38,486],57823:[683,10,518,65,511],57824:[464,10,296,56,268],57825:[464,0,472,38,517],57826:[683,11,536,18,502],57827:[453,215,561,-9,536],57828:[464,14,376,41,416],57829:[683,215,434,43,464],57830:[463,10,533,45,505],57831:[453,10,565,45,589],57832:[462,216,534,-33,510],57833:[463,212,436,52,500],57834:[453,10,607,45,625],57835:[453,10,468,42,486],57836:[463,10,514,61,490],57837:[464,216,665,55,641],57838:[463,215,514,-72,552],57839:[461,216,654,75,705],57840:[454,10,630,50,636],57841:[463,10,462,45,467],57842:[683,12,534,45,525],57843:[684,216,648,48,630],57844:[463,216,536,38,518],57845:[453,10,795,40,811],57954:[460,11,570,56,514],57958:[460,0,570,100,415],57962:[460,0,570,59,487],57966:[461,217,570,40,513],57970:[450,217,570,17,542],57974:[450,218,570,23,536],57978:[668,10,570,28,553],57982:[450,217,570,40,543],57986:[668,10,570,50,519],57990:[460,217,570,23,526],58004:[756,218,753,37,754],58006:[756,218,698,42,686],58008:[756,218,678,52,716],58010:[756,218,830,42,793],58012:[756,218,706,42,724],58014:[756,217,624,42,724],58016:[756,217,768,52,766],58018:[756,218,825,42,863],58020:[756,218,429,-7,467],58022:[756,218,530,60,568],58024:[756,218,766,42,804],58026:[756,218,696,42,654],58028:[756,218,969,42,1007],58030:[756,218,799,42,837],58032:[756,218,764,52,739],58034:[756,217,581,14,710],58036:[756,217,764,52,739],58038:[756,218,699,42,682],58040:[756,218,557,52,576],58042:[756,218,532,19,647],58044:[756,218,706,67,771],58046:[756,218,605,56,730],58048:[756,218,831,62,956],58050:[756,218,737,27,755],58052:[756,218,492,1,647],58054:[756,218,686,62,714],58056:[756,240,565,42,533],58058:[756,240,530,47,530],58060:[756,240,477,33,501],58062:[756,240,586,14,581],58064:[756,240,490,8,475],58066:[756,240,582,-4,704],58068:[756,240,515,22,513],58070:[756,240,577,47,545],58072:[756,217,326,-9,454],58074:[755,240,550,-54,653],58076:[756,240,554,57,591],58078:[756,217,335,-14,449],58080:[756,240,823,32,791],58082:[756,240,565,32,545],58084:[756,240,533,42,519],58086:[756,217,581,-24,613],58088:[756,240,521,40,523],58090:[756,240,436,32,507],58092:[756,240,466,26,494],58094:[756,217,353,-22,441],58096:[756,240,537,21,505],58098:[756,218,506,72,545],58100:[756,217,775,72,793],58102:[756,240,566,32,584],58104:[756,218,530,32,575],58106:[756,240,499,40,507],58156:[756,218,613,42,612],58158:[756,218,595,-47,644],58160:[756,218,514,-58,634],58162:[756,218,536,40,522],58164:[756,218,478,29,491],58166:[756,218,440,11,482],58168:[756,218,512,32,536],58170:[756,218,529,20,519],58172:[756,217,326,-10,453],58174:[756,218,546,57,558],58176:[756,218,557,52,619],58178:[756,217,630,0,696],58180:[756,218,466,32,495],58182:[756,218,454,9,468],58184:[756,240,533,27,498],58186:[756,217,591,14,710],58188:[756,218,584,32,591],58190:[756,218,468,1,460],58192:[756,218,534,42,560],58194:[756,218,448,32,537],58196:[756,218,514,32,545],58198:[756,218,663,-2,690],58200:[756,218,632,4,700],58202:[756,218,668,32,736],58204:[756,217,733,42,758],58206:[756,218,602,32,590],58208:[756,218,666,42,778],58210:[756,217,889,32,897],58214:[756,240,444,7,482],58218:[756,240,528,-57,648],58222:[756,240,457,31,445],58226:[756,240,528,8,715],58228:[756,240,533,-16,559],58230:[756,218,533,42,525],58232:[756,218,533,35,506],58234:[756,218,477,42,539],58237:[756,218,710,-50,694],58239:[683,10,606,10,601],58241:[683,10,554,39,540],58243:[579,10,353,6,323],58245:[460,10,326,15,278],58247:[683,10,557,52,526],58249:[668,0,490,30,478]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/NonUnicode/Italic/PrivateUse.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Regular/All.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Regular/All.js
new file mode 100644
index 0000000..1ecbae2
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Regular/All.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Regular/All.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXNonUnicode,{32:[0,0,250,0,0],160:[0,0,250,0,0]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/NonUnicode/Regular/All.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Regular/Main.js
new file mode 100644
index 0000000..969e7e6
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXNonUnicode={directory:"NonUnicode/Regular",family:"STIXNonUnicode",Ranges:[[32,32,"All"],[160,160,"All"],[57344,63743,"PrivateUse"]],57344:[610,25,1184,829,895],57345:[667,-41,1184,829,1211],57656:[634,-584,480,-10,490],57657:[-127,177,480,-10,490],57659:[955,-512,897,-25,908],57660:[955,-512,897,-11,922],57661:[182,261,897,-25,908],57662:[182,261,897,-11,922],57664:[1218,-820,1844,-10,1854],57665:[-126,524,1844,-10,1854],57674:[955,-820,633,-1,634],57675:[-126,261,633,-1,634],57953:[422,10,523,41,481],57957:[421,0,523,127,405],57961:[421,0,523,68,455],57965:[424,198,523,47,463],57969:[420,198,523,58,480],57973:[421,198,523,66,457],57977:[612,8,523,37,486],57981:[421,198,523,25,490],57985:[606,12,523,47,477],57989:[421,200,523,41,483],57999:[135,0,325,-1,326],58000:[135,0,633,-1,634]};MathJax.OutputJax["HTML-CSS"].initFont("STIXNonUnicode");MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/NonUnicode/Regular/Main.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Regular/PrivateUse.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Regular/PrivateUse.js
new file mode 100644
index 0000000..74a86d7
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Regular/PrivateUse.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Regular/PrivateUse.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXNonUnicode,{57346:[1022,0,1192,30,1162],57347:[1450,0,1311,55,1256],57348:[450,-59,926,55,871],57349:[530,-57,926,55,871],57354:[538,-55,685,48,637],57355:[543,37,685,48,637],57358:[846,340,685,60,626],57359:[730,229,685,56,621],57360:[730,229,685,56,621],57361:[846,340,685,61,626],57366:[818,311,685,53,618],57368:[818,311,685,67,632],57374:[607,110,685,48,638],57379:[695,189,685,48,637],57381:[724,236,685,48,637],57382:[662,156,685,47,612],57383:[662,156,685,73,638],57384:[663,155,933,25,908],57385:[662,156,933,25,908],57386:[662,156,1240,43,1184],57387:[662,156,1240,56,1197],57391:[662,156,685,23,662],57397:[602,98,486,64,422],57399:[662,156,685,48,637],57400:[690,189,732,50,682],57401:[662,156,685,47,636],57402:[811,156,471,40,525],57403:[736,156,685,60,625],57404:[662,156,685,60,625],57405:[602,98,486,64,422],57408:[415,-92,685,48,637],57409:[911,-433,480,64,398],57410:[755,-425,441,57,387],57411:[818,311,685,60,625],57412:[818,311,685,60,625],57413:[818,311,685,60,625],57414:[818,311,685,60,625],57419:[745,242,685,60,625],57420:[845,341,685,60,625],57421:[534,19,685,48,637],57422:[845,341,685,60,625],57423:[745,242,685,60,625],57424:[662,156,685,65,620],57425:[662,156,685,65,620],57426:[561,55,685,48,637],57427:[450,0,632,26,604],57428:[516,10,688,37,679],57429:[475,14,571,20,563],57430:[459,11,632,10,624],57431:[459,12,624,29,595],57433:[730,224,685,48,637],57434:[730,224,685,48,637],57435:[561,-30,685,48,637],57436:[534,19,685,48,637],57437:[459,10,452,16,436],57438:[698,-547,0,95,406],57440:[-140,292,1,11,323],57441:[-141,390,0,11,322],57442:[-141,486,0,11,322],57443:[734,-508,0,94,485],57444:[777,-547,0,95,425],57445:[-141,371,0,1,331],57446:[770,-547,0,101,412],57447:[-141,371,0,1,331],57448:[683,287,524,9,487],57451:[602,98,486,64,422],57452:[602,98,486,64,422],57453:[785,157,685,60,625],57454:[785,157,685,60,625],57455:[785,129,685,60,625],57456:[785,129,685,60,625],57461:[626,119,685,48,637],57462:[626,119,685,48,637],57463:[725,236,685,48,637],57468:[758,252,685,48,637],57469:[758,252,685,48,637],57470:[732,227,685,56,621],57471:[732,227,685,56,621],57472:[818,311,685,57,622],57473:[818,311,685,57,622],57474:[730,229,685,56,621],57475:[730,229,685,56,621],57476:[709,201,685,56,621],57477:[709,201,685,56,621],57478:[818,311,685,56,621],57479:[818,311,685,55,621],57480:[818,311,685,56,621],57481:[818,311,685,55,620],57490:[719,296,685,62,627],57491:[719,296,685,61,626],57492:[719,240,685,62,627],57493:[719,240,685,61,626],57494:[818,311,685,55,620],57495:[818,311,685,65,630],57496:[690,189,685,23,662],57497:[567,183,612,25,587],57498:[719,213,708,18,690],57499:[719,213,708,18,690],57503:[662,156,902,0,863],57504:[662,156,902,0,863],57505:[676,14,734,18,700],57506:[460,218,561,24,539],57508:[470,233,378,10,358],57509:[669,-426,397,75,338],57510:[216,144,444,38,429],57511:[702,-506,376,30,346],57512:[662,156,496,114,371],57513:[497,-167,647,49,619],57514:[702,-506,376,30,346],57515:[662,156,496,114,371],57516:[702,-506,470,30,440],57517:[662,156,638,35,513],57518:[662,0,423,55,345],57519:[662,0,423,55,345],57520:[735,-531,0,100,400],57521:[-50,254,0,0,300],57522:[-50,254,0,0,300],57523:[683,218,541,32,457],57524:[556,-220,313,55,258],57525:[556,-220,313,55,258],57526:[449,-57,0,30,124],57527:[324,-183,281,70,211],57528:[943,11,1344,67,1302],57529:[943,11,1344,67,1302],57531:[622,101,685,48,637],57532:[547,41,685,47,635],57533:[662,218,710,15,660],57534:[757,218,1102,15,1073],57535:[836,236,636,50,586],57536:[836,236,636,50,586],57537:[836,236,636,50,586],57538:[836,236,636,50,586],57539:[386,-120,750,50,700],57540:[478,-28,750,50,700],57541:[478,-28,750,50,700],57542:[286,-220,750,50,700],57543:[402,-120,750,50,700],57544:[386,-120,1000,50,950],57545:[478,-28,1000,50,950],57546:[544,38,1000,50,950],57547:[386,-120,750,50,700],57548:[478,-28,750,50,700],57549:[544,38,750,50,700],57550:[836,236,636,50,586],57551:[836,236,636,50,586],57552:[836,236,636,50,586],57553:[836,236,636,50,586],57554:[692,186,926,83,843],57555:[633,127,926,24,902],57556:[633,127,926,24,902],57557:[286,-220,1000,50,950],57558:[386,-120,750,50,700],57559:[583,79,762,50,712],57560:[584,0,400,57,343],57561:[665,0,255,56,199],57562:[665,0,388,56,332],57563:[610,104,1472,86,1402],57564:[354,-152,1134,65,1069],57565:[933,0,516,73,445],57566:[933,0,500,57,439],57567:[754,0,778,92,699],57568:[920,0,500,40,444],57569:[757,0,389,81,318],57570:[754,0,500,60,429],57571:[638,134,842,35,807],57572:[773,80,700,94,606],57573:[690,189,523,72,450],57574:[690,189,523,72,450],57575:[811,127,772,35,737],57576:[532,26,1077,55,1022],57577:[547,41,685,48,636],57578:[661,158,910,45,865],57579:[567,58,716,45,671],57580:[862,-120,685,48,637],57581:[819,312,511,192,319],57582:[751,156,926,85,841],57583:[547,41,686,49,637],57585:[66,0,390,48,342],57586:[936,157,1059,38,1033],57587:[662,156,1059,196,862],57588:[694,168,773,55,718],57589:[672,146,926,55,872],57590:[747,114,909,23,886],57591:[727,102,956,22,934],57592:[474,89,500,163,336],57593:[680,0,767,88,679],57594:[474,89,297,62,235],57595:[680,0,1750,88,1662],57596:[680,0,1625,88,1537],57597:[680,0,1625,88,1537],57598:[680,0,1625,88,1537],57599:[680,0,1625,88,1537],57600:[680,0,2032,88,1944],57601:[680,0,1625,88,1537],57602:[680,0,1608,88,1520],57603:[680,0,2296,88,2208],57604:[409,-253,100,-64,164],57605:[680,0,2032,88,1944],57606:[680,0,2032,88,1944],57607:[680,0,1625,88,1537],57608:[680,0,1625,88,1537],57609:[781,279,327,10,286],57610:[781,279,250,41,178],57612:[384,-122,400,69,330],57613:[384,-122,400,69,330],57614:[405,-101,652,193,459],57615:[386,-120,315,0,315],57616:[432,-28,652,124,528],57617:[432,-28,652,124,528],57618:[662,156,926,55,872],57619:[662,156,926,55,872],57620:[662,156,926,54,871],57621:[662,156,926,54,871],57622:[214,-107,511,223,289],57623:[286,-220,229,61,168],57624:[271,-134,277,70,207],57625:[271,-134,277,70,207],57626:[662,156,511,59,451],57627:[662,156,511,59,451],57628:[662,156,926,54,872],57629:[662,156,926,54,872],57630:[662,156,926,54,872],57631:[662,156,926,54,872],57632:[411,-94,511,220,293],57633:[290,-217,311,-3,314],57634:[382,-123,367,54,313],57635:[383,-124,367,54,313],57636:[662,156,511,59,451],57637:[662,156,511,59,451],57638:[449,-57,926,54,872],57639:[449,-57,926,54,872],57640:[662,155,926,54,872],57641:[662,156,926,55,872],57642:[662,156,926,54,871],57643:[661,156,926,54,872],57644:[404,-101,511,220,293],57645:[403,-100,511,220,293],57646:[290,-217,371,14,317],57647:[290,-217,371,54,357],57648:[373,-134,379,70,309],57649:[373,-134,379,70,309],57650:[373,-134,379,70,309],57651:[373,-134,379,70,309],57652:[486,-20,315,0,315],57653:[405,-101,926,230,696],57654:[541,35,315,0,315],57655:[405,-101,1033,229,805],57658:[943,11,735,67,1302],57663:[-126,261,325,-1,326],57666:[955,-342,1820,-25,1830],57667:[955,-342,1820,-10,1845],57668:[352,261,1820,-25,1830],57669:[352,261,1820,-10,1845],57670:[955,-554,1820,-25,1830],57671:[955,-554,1820,-10,1845],57672:[140,261,1820,-25,1830],57673:[140,261,1820,-10,1845],57676:[660,158,857,48,777],57677:[660,158,857,80,809],57678:[661,157,685,44,609],57679:[661,157,685,76,641],57680:[135,308,735,-25,746],57681:[135,308,735,-11,760],57682:[444,0,735,-25,746],57683:[444,0,735,-11,760],57724:[683,10,499,28,471],57725:[674,0,666,31,635],57726:[662,0,604,74,547],57727:[662,0,535,74,523],57728:[674,0,666,31,635],57729:[662,0,583,74,540],57730:[662,0,637,28,603],57731:[662,0,658,74,584],57732:[676,14,714,30,684],57733:[662,0,401,45,356],57734:[662,0,634,74,630],57735:[674,0,666,31,635],57736:[662,0,843,75,768],57737:[662,14,675,74,601],57738:[662,0,643,28,615],57739:[676,14,714,30,684],57740:[662,0,658,74,584],57741:[662,0,525,74,512],57742:[676,14,714,30,684],57743:[662,0,624,26,594],57744:[662,0,608,15,593],57745:[676,0,690,24,666],57746:[662,0,716,23,693],57747:[662,0,700,31,669],57748:[681,0,724,12,712],57749:[676,0,744,29,715],57750:[463,10,537,28,532],57751:[683,215,498,41,471],57752:[463,216,474,27,455],57753:[683,10,499,28,471],57754:[463,10,438,22,419],57755:[683,213,416,33,408],57756:[463,215,494,41,443],57757:[683,10,446,21,425],57758:[464,10,270,57,269],57759:[464,0,472,82,472],57760:[683,11,489,8,478],57761:[453,215,487,44,482],57762:[464,14,460,30,427],57763:[683,215,418,33,410],57764:[463,10,499,28,471],57765:[453,10,507,7,487],57766:[462,216,498,48,470],57767:[463,212,416,33,414],57768:[453,10,526,28,542],57769:[453,10,426,2,410],57770:[463,10,503,41,463],57771:[464,216,632,34,600],57772:[463,215,399,-20,440],57773:[461,216,654,12,642],57774:[454,10,624,29,595],57775:[463,10,456,23,432],57776:[683,12,489,42,491],57777:[684,216,622,28,594],57778:[463,216,491,28,463],57779:[453,10,762,7,739],57996:[474,-227,0,53,397],57997:[734,-484,0,94,460],57998:[622,101,685,48,637],58001:[955,-820,325,-1,326],58002:[662,0,1388,38,1350],58003:[763,260,1797,58,1739],58108:[756,218,722,15,707],58110:[756,217,667,17,593],58112:[756,217,587,11,577],58114:[756,218,722,48,675],58116:[756,217,611,12,597],58118:[756,217,612,10,598],58120:[756,217,722,18,703],58122:[756,218,722,34,688],58124:[756,218,333,-24,438],58126:[756,217,731,33,723],58128:[756,218,702,15,687],58130:[756,217,889,12,864],58132:[756,218,722,12,707],58134:[756,217,643,29,614],58136:[756,218,722,34,688],58138:[756,217,722,18,703],58140:[756,218,557,16,565],58142:[756,217,624,30,600],58144:[756,218,611,17,593],58146:[756,218,722,29,703],58148:[756,217,763,35,728],58150:[756,217,722,10,704],58152:[756,217,743,22,724],58154:[756,217,744,29,715],58212:[756,240,673,55,665],58216:[756,218,557,8,645],58220:[773,218,645,-72,675],58224:[756,218,708,7,668],58306:[662,156,685,48,637],58307:[627,135,685,48,637],58308:[627,135,685,48,637],58311:[662,156,902,0,863],58312:[662,156,902,0,863]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/NonUnicode/Regular/PrivateUse.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFiveSym/Regular/All.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFiveSym/Regular/All.js
new file mode 100644
index 0000000..2d3825b
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFiveSym/Regular/All.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFiveSym/Regular/All.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXSizeFiveSym,{710:[816,-572,2328,0,2328],711:[816,-572,2328,0,2328],732:[780,-617,2328,0,2328],759:[-117,280,2328,0,2328],773:[820,-770,0,-3000,0],780:[816,-572,0,-2485,-157],816:[-117,280,0,-2485,-157],818:[-127,177,0,-3000,0],824:[960,454,0,-561,-123],8254:[820,-770,3000,0,3000],8400:[749,-584,0,-3000,0],8401:[749,-584,0,-3000,0],8406:[735,-482,0,-3000,0],8407:[735,-482,0,-3000,0],8428:[-123,288,0,-3000,0],8429:[-123,288,0,-3000,0],8430:[-26,279,0,-3000,0],8431:[-26,279,0,-3000,0],9140:[766,-544,3237,90,3147],9141:[139,83,3237,90,3147],9180:[80,189,3237,0,3237],9181:[842,-573,3237,0,3237],9184:[66,212,3164,0,3164],9185:[842,-564,3164,0,3164]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/SizeFiveSym/Regular/All.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFiveSym/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFiveSym/Regular/Main.js
new file mode 100644
index 0000000..c2263c6
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFiveSym/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFiveSym/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXSizeFiveSym={directory:"SizeFiveSym/Regular",family:"STIXSizeFiveSym",Ranges:[[688,767,"All"],[768,824,"All"],[8254,8254,"All"],[8400,8431,"All"],[9115,9145,"All"],[9180,9185,"All"]],32:[0,0,250,0,0],95:[-127,177,3000,0,3000],160:[0,0,250,0,0],770:[816,-572,0,-2485,-157],771:[780,-617,0,-2485,-157],9182:[181,90,3238,0,3238],9183:[844,-573,3238,0,3238]};MathJax.OutputJax["HTML-CSS"].initFont("STIXSizeFiveSym");MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/SizeFiveSym/Regular/Main.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFourSym/Bold/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFourSym/Bold/Main.js
new file mode 100644
index 0000000..f72cb2f
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFourSym/Bold/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFourSym/Bold/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXSizeFourSym-bold"]={directory:"SizeFourSym/Bold",family:"STIXSizeFourSym",weight:"bold",32:[0,0,250,0,0],40:[2604,471,818,115,761],41:[2604,471,818,57,703],47:[2604,471,1321,3,1318],91:[2604,471,699,314,691],92:[2604,471,1321,3,1318],93:[2604,471,699,8,385],123:[2604,471,1119,197,944],125:[2604,471,1119,175,922],160:[0,0,250,0,0],8730:[1510,345,1184,101,915],8968:[2604,471,720,314,712],8969:[2604,471,720,8,406],8970:[2604,471,720,314,712],8971:[2604,471,720,8,406],10216:[2604,471,908,120,841],10217:[2604,471,908,67,788]};MathJax.OutputJax["HTML-CSS"].initFont("STIXSizeFourSym-bold");MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/SizeFourSym/Bold/Main.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFourSym/Regular/All.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFourSym/Regular/All.js
new file mode 100644
index 0000000..7aaec35
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFourSym/Regular/All.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFourSym/Regular/All.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXSizeFourSym,{710:[796,-573,1886,0,1886],711:[796,-573,1886,0,1886],732:[771,-608,1886,0,1886],759:[-117,280,1886,0,1886],773:[820,-770,0,-2500,0],780:[796,-573,0,-2040,-154],816:[-117,280,0,-2040,-154],818:[-127,177,0,-2500,0],824:[731,228,0,-490,-169],8254:[820,-770,2500,0,2500],8400:[749,-584,0,-2193,-13],8401:[749,-584,0,-2193,-13],8406:[735,-482,0,-2193,-13],8407:[735,-482,0,-2193,-13],8428:[-123,288,0,-2193,-13],8429:[-123,288,0,-2193,-13],8430:[-26,279,0,-2193,-13],8431:[-26,279,0,-2193,-13],8731:[1795,345,1184,112,895],8732:[1790,345,1184,112,895],9140:[766,-544,2692,84,2608],9141:[139,83,2692,84,2608],9180:[76,168,2328,0,2328],9181:[817,-573,2328,0,2328],9184:[66,212,2738,0,2738],9185:[842,-564,2738,0,2738],10098:[2566,509,1031,320,959],10099:[2566,509,1031,72,711],10214:[2566,509,778,295,708],10215:[2566,509,778,70,483],10218:[2566,509,1273,126,1133],10219:[2566,509,1273,140,1147],10627:[2566,509,1225,182,1052],10628:[2566,509,1225,173,1043],10629:[2566,509,1175,195,1050],10630:[2566,509,1175,194,1049]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/SizeFourSym/Regular/All.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFourSym/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFourSym/Regular/Main.js
new file mode 100644
index 0000000..3eef670
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFourSym/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFourSym/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXSizeFourSym={directory:"SizeFourSym/Regular",family:"STIXSizeFourSym",Ranges:[[688,767,"All"],[768,824,"All"],[8254,8254,"All"],[8400,8431,"All"],[8730,8732,"All"],[9115,9145,"All"],[9180,9185,"All"],[10098,10099,"All"],[10214,10219,"All"],[10627,10630,"All"]],32:[0,0,250,0,0],40:[2566,509,808,124,732],41:[2566,509,808,76,684],47:[2566,509,1309,16,1293],91:[2566,509,661,295,634],92:[2566,509,1309,16,1293],93:[2566,509,661,27,366],95:[-127,177,2500,0,2500],123:[2566,509,1076,173,882],125:[2566,509,1076,194,903],160:[0,0,250,0,0],770:[796,-573,0,-2040,-154],771:[771,-608,0,-2040,-154],8730:[1510,345,1184,112,895],8968:[2566,509,682,295,655],8969:[2566,509,682,27,387],8970:[2566,509,682,295,655],8971:[2566,509,682,27,387],9182:[175,90,2328,0,2328],9183:[837,-572,2328,0,2328],10216:[2566,509,908,113,796],10217:[2566,509,908,112,795]};MathJax.OutputJax["HTML-CSS"].initFont("STIXSizeFourSym");MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/SizeFourSym/Regular/Main.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Bold/All.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Bold/All.js
new file mode 100644
index 0000000..2b5be64
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Bold/All.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Bold/All.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXSizeOneSym-bold"],{8512:[1500,-22,1341,60,1281]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/SizeOneSym/Bold/All.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Bold/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Bold/Main.js
new file mode 100644
index 0000000..a0df420
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Bold/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Bold/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXSizeOneSym-bold"]={directory:"SizeOneSym/Bold",family:"STIXSizeOneSym",weight:"bold",Ranges:[[8512,8512,"All"]],32:[0,0,250,0,0],40:[1104,126,468,158,439],41:[1104,126,468,29,310],47:[1104,126,579,14,564],91:[1104,126,408,186,407],92:[1104,126,579,14,564],93:[1104,126,408,1,222],123:[1104,126,595,115,503],125:[1104,126,595,92,480],160:[0,0,250,0,0],8719:[1500,-49,1355,35,1321],8720:[1500,-49,1355,34,1320],8721:[1500,-49,1292,60,1215],8730:[1588,241,1061,109,1119],8968:[1104,126,476,186,470],8969:[1104,126,476,6,292],8970:[1104,126,476,184,470],8971:[1104,126,476,6,290],10216:[1104,126,579,99,481],10217:[1104,126,579,98,480]};MathJax.OutputJax["HTML-CSS"].initFont("STIXSizeOneSym-bold");MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/SizeOneSym/Bold/Main.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Regular/All.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Regular/All.js
new file mode 100644
index 0000000..9399da6
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Regular/All.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Regular/All.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXSizeOneSym,{710:[767,-554,560,0,560],711:[767,-554,560,0,560],732:[750,-598,558,-2,558],759:[-117,269,558,-2,558],773:[820,-770,0,-1000,0],780:[767,-554,0,-720,-160],816:[-117,269,0,-722,-162],818:[-127,177,0,-1000,0],824:[532,21,0,-720,-157],8254:[820,-770,1000,0,1000],8400:[749,-584,0,-892,-21],8401:[749,-584,0,-893,-22],8406:[735,-482,0,-893,-21],8407:[736,-482,0,-893,-21],8428:[-123,288,0,-893,-22],8429:[-123,288,0,-892,-21],8430:[-26,279,0,-893,-21],8431:[-25,279,0,-893,-21],8512:[1500,-50,1259,55,1204],8731:[1552,295,1057,112,1089],8732:[1552,295,1057,112,1089],8992:[1066,79,688,294,574],8993:[1086,59,688,115,394],9138:[1500,5,1482,92,1292],9139:[1500,5,1482,92,1366],9140:[766,-544,1063,69,994],9141:[139,83,1063,68,993],9180:[60,153,926,0,926],9181:[777,-564,926,0,926],9184:[66,212,1460,0,1460],9185:[842,-564,1460,0,1460],10098:[1066,164,566,205,539],10099:[1066,164,566,27,361],10214:[1066,164,515,180,486],10215:[1066,164,515,29,335],10218:[1066,164,798,116,670],10219:[1066,164,798,128,682],10627:[1066,164,712,114,587],10628:[1066,164,712,114,587],10629:[1066,164,632,135,546],10630:[1066,164,632,86,497],10744:[1566,279,806,25,781],10745:[1566,279,806,25,781],10755:[1500,-39,1265,118,1147],10759:[1500,-49,1530,60,1470],10760:[1500,-49,1530,60,1470],10761:[1500,-49,1482,60,1422],10762:[1500,-50,1292,90,1202],11004:[867,363,690,133,557],11007:[867,363,410,100,310]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/SizeOneSym/Regular/All.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Regular/Main.js
new file mode 100644
index 0000000..295d467
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXSizeOneSym={directory:"SizeOneSym/Regular",family:"STIXSizeOneSym",Ranges:[[688,767,"All"],[768,824,"All"],[8254,8254,"All"],[8400,8431,"All"],[8512,8512,"All"],[8730,8732,"All"],[8992,8993,"All"],[9115,9145,"All"],[9180,9185,"All"],[10098,10099,"All"],[10214,10219,"All"],[10627,10630,"All"],[10744,10745,"All"],[10752,10762,"All"],[11004,11007,"All"]],32:[0,0,250,0,0],40:[1066,164,468,139,382],41:[1066,164,468,86,329],47:[1066,164,579,25,552],91:[1066,164,383,180,363],92:[1066,164,579,27,552],93:[1066,164,383,20,203],95:[-127,177,1000,0,1000],123:[1066,164,575,114,466],125:[1066,164,575,109,461],160:[0,0,250,0,0],770:[767,-554,0,-720,-160],771:[750,-598,0,-722,-162],8719:[1500,-49,1355,50,1305],8720:[1500,-49,1355,50,1305],8721:[1499,-49,1292,90,1202],8730:[1552,295,1057,112,1089],8896:[1500,-49,1265,60,1205],8897:[1500,-49,1265,60,1205],8898:[1510,-49,1265,118,1147],8899:[1500,-39,1265,118,1147],8968:[1066,164,453,180,426],8969:[1066,164,453,25,273],8970:[1066,164,453,180,428],8971:[1066,164,453,27,273],9115:[700,305,450,50,400],9116:[705,305,450,50,174],9117:[705,300,450,50,400],9118:[700,305,450,50,400],9119:[705,305,450,276,400],9120:[705,300,450,50,400],9121:[682,323,450,50,415],9122:[687,323,450,50,150],9123:[687,318,450,50,415],9124:[682,323,450,35,400],9125:[687,323,450,300,400],9126:[687,318,450,35,400],9127:[700,305,640,260,600],9128:[705,305,640,40,380],9129:[705,300,640,260,600],9130:[705,305,640,260,380],9131:[700,305,640,40,380],9132:[705,305,640,260,600],9133:[705,300,640,40,380],9134:[610,25,688,294,394],9136:[700,301,600,35,566],9137:[700,301,600,35,566],9143:[1510,345,1184,112,895],9144:[1566,289,721,0,66],9145:[1566,289,721,655,721],9182:[136,89,926,0,925],9183:[789,-564,926,0,925],10216:[1066,164,578,116,462],10217:[1066,164,578,116,462],10752:[1500,-49,1555,52,1503],10753:[1500,-49,1555,52,1503],10754:[1500,-49,1555,52,1503],10756:[1500,-39,1265,118,1147],10757:[1500,-49,1153,82,1071],10758:[1500,-49,1153,82,1071]};MathJax.OutputJax["HTML-CSS"].initFont("STIXSizeOneSym");MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/SizeOneSym/Regular/Main.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeThreeSym/Bold/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeThreeSym/Bold/Main.js
new file mode 100644
index 0000000..7220824
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeThreeSym/Bold/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/SizeThreeSym/Bold/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXSizeThreeSym-bold"]={directory:"SizeThreeSym/Bold",family:"STIXSizeThreeSym",weight:"bold",32:[0,0,250,0,0],40:[2104,355,750,163,686],41:[2104,355,750,64,587],47:[2104,355,1102,11,1091],91:[2104,355,538,236,540],92:[2104,355,1102,11,1091],93:[2104,355,538,-2,302],123:[2104,355,906,124,736],125:[2104,355,906,170,782],160:[0,0,250,0,0],8730:[2604,471,1076,104,1139],8968:[2104,355,595,236,599],8969:[2104,355,595,-4,359],8970:[2104,355,595,236,599],8971:[2104,355,595,-4,359],10216:[2104,355,765,108,720],10217:[2104,355,765,45,657]};MathJax.OutputJax["HTML-CSS"].initFont("STIXSizeThreeSym-bold");MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/SizeThreeSym/Bold/Main.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeThreeSym/Regular/All.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeThreeSym/Regular/All.js
new file mode 100644
index 0000000..fb315eb
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeThreeSym/Regular/All.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/SizeThreeSym/Regular/All.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXSizeThreeSym,{710:[777,-564,1460,0,1460],711:[777,-564,1460,0,1460],732:[774,-608,1458,-2,1458],759:[-117,283,1458,-2,1458],773:[820,-770,0,-2000,0],780:[777,-564,0,-1610,-150],816:[-117,283,0,-1612,-152],818:[-127,177,0,-2000,0],824:[662,156,0,-543,-132],8254:[820,-770,2000,0,2000],8400:[749,-584,0,-1773,-29],8401:[749,-584,0,-1773,-29],8406:[735,-482,0,-1773,-29],8407:[735,-482,0,-1773,-29],8428:[-123,288,0,-1773,-29],8429:[-123,288,0,-1773,-29],8430:[-26,279,0,-1773,-29],8431:[-26,279,0,-1773,-29],8731:[2565,510,1076,112,1110],8732:[2565,510,1076,112,1110],9140:[766,-544,2147,78,2069],9141:[139,83,2147,78,2069],9180:[70,161,1886,0,1886],9181:[803,-572,1886,0,1886],9184:[66,212,2312,0,2312],9185:[842,-564,2312,0,2312],10098:[2066,393,842,265,790],10099:[2066,393,842,52,577],10214:[2066,394,647,225,597],10215:[2066,394,647,50,422],10218:[2067,394,1091,104,955],10219:[2067,394,1091,136,987],10627:[2066,394,1031,143,867],10628:[2066,394,1031,164,888],10629:[2066,393,1029,180,914],10630:[2066,393,1029,115,849]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/SizeThreeSym/Regular/All.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeThreeSym/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeThreeSym/Regular/Main.js
new file mode 100644
index 0000000..04af3be
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeThreeSym/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/SizeThreeSym/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXSizeThreeSym={directory:"SizeThreeSym/Regular",family:"STIXSizeThreeSym",Ranges:[[688,767,"All"],[768,824,"All"],[8254,8254,"All"],[8400,8431,"All"],[8730,8732,"All"],[9115,9145,"All"],[9180,9185,"All"],[10098,10099,"All"],[10214,10219,"All"],[10627,10630,"All"]],32:[0,0,250,0,0],40:[2066,394,750,182,667],41:[2066,394,750,83,568],47:[2066,394,1101,30,1071],91:[2066,394,508,225,491],92:[2066,394,1101,30,1071],93:[2066,394,508,17,283],95:[-127,177,2000,0,2000],123:[2066,394,906,143,717],125:[2066,394,906,189,763],160:[0,0,250,0,0],770:[777,-564,0,-1610,-150],771:[774,-608,0,-1612,-152],8730:[2565,510,1076,112,1110],8968:[2066,394,565,225,550],8969:[2066,394,565,15,340],8970:[2066,394,565,225,550],8971:[2066,394,565,15,340],9182:[157,86,1886,0,1886],9183:[815,-572,1886,0,1886],10216:[2066,394,765,96,670],10217:[2066,394,765,95,669]};MathJax.OutputJax["HTML-CSS"].initFont("STIXSizeThreeSym");MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/SizeThreeSym/Regular/Main.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeTwoSym/Bold/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeTwoSym/Bold/Main.js
new file mode 100644
index 0000000..32c2da4
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeTwoSym/Bold/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/SizeTwoSym/Bold/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXSizeTwoSym-bold"]={directory:"SizeTwoSym/Bold",family:"STIXSizeTwoSym",weight:"bold",32:[0,0,250,0,0],40:[1604,241,608,110,512],41:[1604,241,608,96,498],47:[1604,241,802,4,798],91:[1604,241,485,197,467],92:[1604,241,802,4,798],93:[1604,241,485,18,288],123:[1604,241,681,69,514],125:[1604,241,681,167,612],160:[0,0,250,0,0],8730:[2095,355,1130,106,1185],8968:[1604,241,538,185,510],8969:[1604,241,538,28,355],8970:[1604,241,538,185,512],8971:[1604,241,538,28,353],10216:[1604,241,622,98,572],10217:[1604,241,622,50,524]};MathJax.OutputJax["HTML-CSS"].initFont("STIXSizeTwoSym-bold");MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/SizeTwoSym/Bold/Main.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeTwoSym/Regular/All.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeTwoSym/Regular/All.js
new file mode 100644
index 0000000..deff59d
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeTwoSym/Regular/All.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/SizeTwoSym/Regular/All.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXSizeTwoSym,{710:[777,-564,979,0,979],711:[777,-564,979,0,979],732:[760,-608,977,-2,977],759:[-117,269,977,-2,977],773:[820,-770,0,-1500,0],780:[777,-564,0,-1150,-171],816:[-117,269,0,-1152,-173],818:[-127,177,0,-1500,0],824:[662,0,0,-720,-6],8254:[820,-770,1500,0,1500],8400:[749,-584,0,-1323,-15],8401:[749,-584,0,-1323,-15],8406:[735,-482,0,-1323,-15],8407:[735,-482,0,-1323,-15],8428:[-123,288,0,-1323,-15],8429:[-123,288,0,-1323,-15],8430:[-26,279,0,-1323,-15],8431:[-26,279,0,-1323,-15],8731:[2056,404,1124,110,1157],8732:[2056,404,1124,110,1157],9140:[766,-544,1606,74,1532],9141:[139,83,1606,74,1532],9180:[66,147,1460,0,1460],9181:[785,-572,1460,0,1460],9184:[66,212,1886,0,1886],9185:[842,-564,1886,0,1886],10098:[1566,279,688,230,651],10099:[1566,279,688,37,458],10214:[1566,279,555,190,517],10215:[1566,279,555,38,365],10218:[1566,279,901,93,793],10219:[1566,279,901,108,808],10627:[1566,279,827,122,692],10628:[1565,280,827,135,705],10629:[1566,282,793,155,693],10630:[1566,282,793,100,638],11004:[1586,289,906,133,773]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/SizeTwoSym/Regular/All.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeTwoSym/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeTwoSym/Regular/Main.js
new file mode 100644
index 0000000..62c47c1
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeTwoSym/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/SizeTwoSym/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXSizeTwoSym={directory:"SizeTwoSym/Regular",family:"STIXSizeTwoSym",Ranges:[[688,767,"All"],[768,824,"All"],[8254,8254,"All"],[8400,8431,"All"],[8730,8732,"All"],[9115,9145,"All"],[9180,9185,"All"],[10098,10099,"All"],[10214,10219,"All"],[10627,10630,"All"],[11004,11007,"All"]],32:[0,0,250,0,0],40:[1566,279,589,139,503],41:[1566,279,608,114,478],47:[1566,279,806,25,781],91:[1566,279,459,190,422],92:[1566,279,806,25,781],93:[1566,279,459,37,269],95:[-127,177,1500,0,1500],123:[1566,279,717,124,531],125:[1566,279,717,186,593],160:[0,0,250,0,0],770:[777,-564,0,-1150,-171],771:[760,-608,0,-1152,-173],8730:[2056,404,1124,110,1157],8968:[1566,279,524,190,479],8969:[1566,279,526,47,336],8970:[1566,279,524,190,479],8971:[1566,279,526,47,336],9182:[143,81,1460,0,1460],9183:[797,-573,1460,0,1460],10216:[1566,279,622,95,531],10217:[1566,279,622,91,527]};MathJax.OutputJax["HTML-CSS"].initFont("STIXSizeTwoSym");MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/SizeTwoSym/Regular/Main.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Bold/All.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Bold/All.js
new file mode 100644
index 0000000..9eace76
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Bold/All.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Bold/All.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXVariants-bold"],{32:[0,0,250,0,0],124:[691,189,340,126,214],160:[0,0,250,0,0],411:[666,0,536,60,526],8243:[586,-12,713,44,669],8244:[586,-12,1032,44,988],8245:[586,-12,394,44,350],8246:[586,-12,713,44,669],8247:[586,-12,1032,44,988],8279:[586,-12,1351,43,1306],8512:[691,0,780,55,725],8592:[451,-55,428,68,428],8593:[680,15,556,80,476],8594:[451,-55,428,0,360],8595:[680,15,556,80,476],8657:[600,15,714,40,674],8659:[600,15,714,40,674],8719:[676,0,734,27,707],8720:[676,0,734,27,707],8721:[676,0,690,39,649],8733:[431,0,750,56,687],8739:[451,19,290,89,201],8772:[543,45,750,68,683],8775:[648,144,750,68,683],8777:[598,64,750,68,683],8800:[687,183,750,68,682],8802:[747,243,750,68,682],8808:[728,293,750,80,670],8809:[728,293,750,80,670],8814:[672,166,750,80,670],8815:[672,166,750,80,670],8816:[742,236,750,80,670],8817:[742,236,750,80,670]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Variants/Bold/All.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Bold/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Bold/Main.js
new file mode 100644
index 0000000..3cb69a7
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Bold/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Bold/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["STIXVariants-bold"]={directory:"Variants/Bold",family:"STIXVariants",weight:"bold",Ranges:[[32,32,"All"],[119,124,"All"],[160,160,"All"],[411,411,"All"],[8242,8279,"All"],[8512,8512,"All"],[8592,8595,"All"],[8657,8674,"All"],[8709,8941,"All"]],8242:[586,-12,394,44,350],8709:[729,74,584,36,548],8726:[732,193,518,45,473],8730:[943,-28,800,112,844]};MathJax.OutputJax["HTML-CSS"].initFont("STIXVariants-bold");MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Variants/Bold/Main.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Regular/All.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Regular/All.js
new file mode 100644
index 0000000..79bf4ab
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Regular/All.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Regular/All.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXVariants,{32:[0,0,250,0,0],119:[80,244,515,22,493],124:[690,189,320,127,193],160:[0,0,250,0,0],411:[668,0,520,55,516],612:[450,10,460,18,441],8243:[565,-28,605,43,561],8244:[565,-28,873,43,829],8245:[565,-28,340,45,296],8246:[565,-28,605,44,561],8247:[565,-28,873,43,829],8279:[565,-28,1139,43,1096],8512:[662,0,718,50,668],8592:[449,-57,415,55,415],8593:[600,15,598,82,518],8594:[449,-57,415,0,360],8595:[600,15,598,80,516],8657:[600,15,794,63,729],8659:[600,15,794,65,731],8672:[449,-58,463,70,393],8674:[449,-58,463,70,393],8712:[516,13,402,64,338],8713:[662,156,685,60,625],8715:[516,13,402,64,338],8716:[662,156,685,60,625],8719:[662,0,694,30,664],8720:[662,0,694,30,664],8721:[662,0,694,38,656],8731:[946,-55,737,72,767],8732:[943,-55,737,72,767],8733:[428,0,685,41,646],8739:[451,19,266,100,166],8740:[451,19,404,23,381],8741:[451,11,446,90,356],8742:[451,19,609,23,586],8745:[602,31,620,10,610],8746:[602,31,620,10,610],8764:[362,-148,685,48,637],8766:[344,-130,1086,55,1031],8767:[461,-43,520,0,586],8769:[462,-48,685,48,637],8772:[529,35,685,48,637],8775:[606,117,685,48,637],8776:[475,-25,685,48,637],8777:[549,49,685,48,637],8780:[586,82,685,48,637],8800:[662,156,685,48,637],8802:[662,156,685,48,637],8808:[718,275,685,56,621],8809:[718,275,685,56,621],8813:[572,66,685,48,637],8814:[662,156,685,47,612],8815:[662,156,685,73,638],8816:[695,189,685,56,621],8817:[695,189,685,64,629],8818:[673,103,685,10,632],8819:[673,144,685,58,624],8820:[730,227,685,48,637],8821:[730,227,685,48,650],8824:[818,311,685,56,621],8825:[818,311,685,55,620],8832:[662,156,685,64,621],8833:[662,156,685,64,621],8836:[662,156,685,55,620],8837:[662,156,685,65,630],8840:[707,203,695,65,630],8841:[707,203,695,65,630],8842:[607,229,685,51,616],8843:[607,229,685,69,634],8851:[536,31,620,10,610],8852:[536,31,620,10,610],8853:[623,119,842,50,792],8855:[623,119,842,50,792],8860:[623,119,842,50,792],8922:[768,262,685,60,625],8923:[768,262,685,60,625],8928:[803,212,685,60,625],8929:[803,212,685,60,625],8940:[695,189,685,54,611],8941:[695,189,685,74,631],8994:[386,-120,685,48,637],8995:[386,-120,685,48,637],9251:[22,119,500,48,453],9641:[662,158,910,45,865],10812:[633,129,463,51,411],10813:[633,129,463,51,411],10909:[647,166,685,49,627],10910:[615,166,685,54,676],10924:[625,137,685,60,625],10925:[625,137,685,60,625],10955:[718,321,685,64,629],10956:[718,321,685,74,639],10990:[451,19,404,23,381]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Variants/Regular/All.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Regular/Main.js
new file mode 100644
index 0000000..07d971b
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.STIXVariants={directory:"Variants/Regular",family:"STIXVariants",Ranges:[[32,32,"All"],[119,124,"All"],[160,160,"All"],[411,411,"All"],[612,612,"All"],[8242,8279,"All"],[8512,8512,"All"],[8592,8595,"All"],[8657,8674,"All"],[8709,8941,"All"],[8994,8995,"All"],[9251,9251,"All"],[9641,9641,"All"],[10812,10990,"All"]],8242:[565,-28,340,44,295],8463:[683,10,579,47,547],8709:[729,74,523,28,502],8726:[710,222,523,46,478],8730:[943,11,737,67,767]};MathJax.OutputJax["HTML-CSS"].initFont("STIXVariants");MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Variants/Regular/Main.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/fontdata-beta.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/fontdata-beta.js
new file mode 100644
index 0000000..10f2ac6
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/fontdata-beta.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/fontdata-beta.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(e,k){var p="STIXGeneral",n="STIXGeneral-bold",l="STIXGeneral-italic",q="STIXNonUnicode",d="STIXSizeOneSym",c="STIXSizeTwoSym",b="STIXSizeThreeSym",a="STIXSizeFourSym",r="STIXSizeFiveSym";var m=function(i,s){var j=e.FONTDATA.FONTS[i];for(var t in s){if(s.hasOwnProperty(t)){j[t]=s[t]}}};m(p,{768:[678,-507,0,109,333],769:[678,-507,0,109,333],770:[674,-507,0,94,405],771:[638,-532,0,85,415],772:[601,-547,0,95,406],773:[820,-770,0,0,500],774:[664,-507,0,107,388],775:[622,-523,0,200,299],776:[622,-523,0,101,399],777:[751,-492,0,173,362],778:[711,-512,0,151,350],779:[678,-507,0,79,458],780:[674,-507,0,95,406],781:[700,-500,0,230,285],782:[700,-500,0,154,347],783:[678,-507,0,79,458],784:[767,-507,0,107,388],785:[664,-507,0,107,388],786:[745,-502,0,181,320],787:[745,-502,0,181,320],788:[745,-502,0,181,320],789:[745,-502,0,395,534],790:[-53,224,0,109,333],791:[-53,224,0,109,333],792:[-53,283,0,83,270],793:[-53,283,0,83,270],794:[735,-531,0,100,400],795:[474,-345,0,436,531],796:[-71,266,0,120,248],797:[-53,240,0,135,365],798:[-53,240,0,135,365],799:[-53,250,0,154,346],800:[-124,168,0,154,346],801:[75,287,0,245,481],802:[75,287,0,426,662],803:[-118,217,0,200,299],804:[-119,218,0,101,399],805:[-69,268,0,151,350],806:[-110,353,0,181,320],807:[0,215,0,146,355],808:[0,165,0,158,343],809:[-102,234,0,230,270],810:[-98,235,0,95,407],811:[-110,227,0,100,405],812:[-73,240,0,95,406],813:[-73,240,0,95,406],814:[-68,225,0,110,391],815:[-59,216,0,110,391],816:[-113,219,0,85,415],817:[-141,195,0,95,406],818:[-141,191,0,0,500],819:[-141,300,0,0,500],820:[320,-214,0,79,409],821:[274,-230,0,96,402],822:[274,-230,0,0,500],823:[580,74,0,100,439],824:[662,156,0,100,511],825:[-71,266,0,120,248],826:[-53,190,0,95,407],827:[-53,227,0,167,333],828:[-65,189,0,100,401],829:[715,-525,0,154,345],830:[829,-499,0,197,303],831:[928,-770,0,0,500],838:[681,-538,0,0,282],844:[777,-532,0,94,424],857:[-65,367,0,123,393],860:[-76,233,0,107,775],864:[633,-517,0,85,845],865:[664,-507,0,107,775],866:[-65,270,0,85,835],8400:[760,-627,0,27,463],8401:[760,-627,0,27,463],8402:[662,156,0,238,288],8406:[760,-548,0,27,463],8407:[760,-548,0,27,463],8411:[622,-523,0,18,515],8412:[622,-523,0,0,696],8413:[725,221,1000,27,973],8414:[780,180,0,0,960],8415:[843,341,0,0,1184],8417:[760,-548,0,27,505],8420:[1023,155,1510,25,1485],8421:[662,156,0,50,440],8422:[662,156,0,145,378],8423:[725,178,0,0,816],8424:[-119,218,0,18,515],8425:[681,-538,0,0,533],8426:[419,-87,0,-178,598],8427:[756,217,0,32,673],8428:[-119,252,0,27,463],8429:[-119,252,0,27,463],8430:[-40,252,0,27,463],8431:[-40,252,0,27,463],8432:[819,-517,0,123,393]});m(n,{768:[713,-528,0,141,379],769:[713,-528,0,141,379],770:[704,-528,0,92,429],771:[674,-547,0,78,443],772:[637,-565,0,95,425],773:[838,-788,0,10,510],774:[691,-528,0,109,412],775:[666,-537,0,196,325],776:[666,-537,0,91,430],777:[751,-491,0,174,379],778:[750,-537,0,154,367],779:[713,-528,0,41,479],780:[704,-528,0,92,429],781:[730,-530,0,233,299],782:[730,-530,0,152,368],783:[713,-528,0,41,479],784:[828,-528,0,109,412],785:[691,-528,0,109,412],786:[867,-532,0,168,352],787:[867,-532,0,168,352],788:[867,-532,0,168,352],789:[867,-532,0,394,578],790:[-70,255,0,141,379],791:[-70,255,0,141,379],792:[-58,288,0,85,287],793:[-58,288,0,232,434],794:[752,-531,0,100,417],795:[505,-352,0,448,576],796:[-33,313,0,135,320],797:[-70,272,0,145,375],798:[-70,272,0,145,375],799:[-70,287,0,154,366],800:[-140,206,0,154,366],801:[75,287,0,269,488],802:[75,287,0,416,635],803:[-109,238,0,196,325],804:[-109,238,0,91,430],805:[-66,279,0,154,367],806:[-88,423,0,168,352],807:[0,218,0,147,373],808:[44,173,0,146,375],809:[-107,239,0,233,288],810:[-86,260,0,85,417],811:[-104,242,0,90,415],812:[-83,259,0,92,429],813:[-85,261,0,92,429],814:[-78,241,0,109,412],815:[-78,241,0,109,412],816:[-108,235,0,78,443],817:[-137,209,0,95,425],818:[-137,187,0,10,510],819:[-137,287,0,10,510],820:[316,-189,0,78,443],821:[282,-224,0,96,402],822:[282,-224,0,0,500],823:[580,74,0,100,467],824:[662,156,0,100,541],825:[-33,313,0,135,320],826:[-71,245,0,85,417],827:[-70,264,0,157,343],828:[-89,234,0,100,401],829:[719,-520,0,160,360],830:[881,-516,0,196,323],831:[938,-788,0,10,510],838:[717,-544,0,0,303],844:[837,-547,333,-16,349],857:[-66,368,0,151,421],860:[-79,242,0,109,810],864:[674,-529,0,78,908],865:[691,-534,0,107,775],866:[-54,293,0,78,887],8400:[846,-637,0,40,524],8401:[846,-637,0,40,524],8402:[662,156,0,232,307],8406:[846,-508,0,40,524],8407:[846,-508,0,40,524],8411:[666,-537,0,-2,547],8412:[666,-537,0,-2,757],8413:[760,254,1073,32,1041],8417:[846,-508,0,35,629],8420:[1055,169,1581,32,1549],8421:[662,155,0,40,522],8422:[662,156,0,130,409],8423:[760,172,0,67,910],8424:[-109,238,0,-2,547],8425:[717,-544,0,0,564],8426:[441,-65,1073,-178,658],8427:[775,235,0,25,738],8428:[-166,375,0,40,524],8429:[-166,375,0,40,524],8430:[-35,373,0,40,524],8431:[-35,373,0,40,524],8432:[845,-543,0,125,395]});m(l,{8400:[760,-627,0,27,463],8401:[760,-627,0,54,490],8402:[662,156,266,100,166],8406:[760,-548,0,27,463],8407:[760,-548,0,27,463],8411:[622,-523,0,27,524],8412:[622,-523,0,18,714],8413:[725,221,1000,27,973],8417:[760,-548,0,27,505],8420:[1023,155,1510,25,1485],8421:[662,156,506,50,456],8422:[662,156,523,129,394],8423:[725,178,926,55,871],8424:[-119,218,0,18,515],8425:[681,-538,0,2,535],8426:[419,-87,1000,27,973],8428:[681,-548,0,27,463],8429:[681,-548,0,27,463],8430:[-40,252,490,27,463],8431:[-40,252,490,27,463]});m(d,{770:[767,-554,0,0,560],771:[750,-598,0,-2,558],773:[820,-770,0,0,1000],780:[767,-554,0,0,560],816:[-117,269,0,-2,558],818:[-127,177,0,0,1000],824:[532,21,0,0,563],8400:[749,-584,0,28,899],8401:[749,-584,0,27,898],8406:[735,-482,0,27,899],8407:[736,-482,0,27,899],8428:[-123,288,0,27,898],8429:[-123,288,0,28,899],8430:[-26,279,0,27,899],8431:[-25,279,0,27,899]});m(c,{770:[777,-564,0,0,979],771:[760,-608,0,-2,977],773:[820,-770,0,0,1500],780:[777,-564,0,0,979],816:[-117,269,0,-2,977],818:[-127,177,0,0,1000],824:[662,0,0,0,714],8400:[749,-584,0,27,1335],8401:[749,-584,0,27,1335],8406:[735,-482,0,27,1335],8407:[735,-482,0,27,1335],8428:[-123,288,0,27,1335],8429:[-123,288,0,27,1335],8430:[-26,279,0,27,1335],8431:[-26,279,0,27,1335]});m(b,{770:[777,-564,0,0,1460],771:[774,-608,0,-2,1458],773:[820,-770,0,0,2000],780:[777,-564,0,0,1460],816:[-117,283,0,-2,1458],818:[-127,177,0,0,2000],824:[662,156,0,137,548],8400:[749,-584,0,27,1771],8401:[749,-584,0,27,1771],8406:[735,-482,0,27,1771],8407:[735,-482,0,27,1771],8428:[-123,288,0,27,1771],8429:[-123,288,0,27,1771],8430:[-26,279,0,27,1771],8431:[-26,279,0,27,1771]});m(a,{770:[796,-573,0,0,1886],771:[771,-608,0,0,1886],773:[820,-770,0,0,2500],780:[796,-573,0,0,1886],816:[-117,280,0,0,1886],818:[-127,177,0,0,2500],824:[731,228,0,170,491],8400:[749,-584,0,27,2207],8401:[749,-584,0,27,2207],8406:[735,-482,0,27,2207],8407:[735,-482,0,27,2207],8428:[-123,288,0,27,2207],8429:[-123,288,0,27,2207],8430:[-26,279,0,27,2207],8431:[-26,279,0,27,2207]});m(r,{770:[816,-572,0,0,2328],771:[780,-617,0,0,2328],773:[820,-770,0,0,3000],780:[816,-572,0,0,2328],816:[-117,280,0,0,2328],818:[-127,177,0,0,3000],824:[960,454,0,119,557],8400:[749,-584,0,0,3000],8401:[749,-584,0,0,3000],8406:[735,-482,0,0,3000],8407:[735,-482,0,0,3000],8428:[-123,288,0,0,3000],8429:[-123,288,0,0,3000],8430:[-26,279,0,0,3000],8431:[-26,279,0,0,3000]});MathJax.Hub.Register.LoadHook(e.fontDir+"/General/BoldItalic/CombDiactForSymbols.js",function(){m("STIXGeneral-bold-italic",{8413:[760,254,1073,32,1041]})});var o=[d,c,b,a];var g=[710,711,732,743];for(var h=0;h<o.length;h++){for(var f=0;f<g.length;f++){delete e.FONTDATA.FONTS[o[h]][f]}}MathJax.Ajax.loadComplete(e.fontDir+"/fontdata-beta.js")})(MathJax.OutputJax["HTML-CSS"],MathJax.InputJax.TeX);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/STIX/fontdata.js b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/fontdata.js
new file mode 100644
index 0000000..d4faa17
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/STIX/fontdata.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/STIX/fontdata.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(f){var m="1.1";f.allowWebFonts=false;var i="STIXGeneral",h="STIXGeneral-bold",g="STIXGeneral-italic",k="STIXNonUnicode",d="STIXSizeOneSym",c="STIXSizeTwoSym",b="STIXSizeThreeSym",a="STIXSizeFourSym",l="STIXSizeFiveSym";var j="H",e="V";f.Augment({FONTDATA:{version:m,TeX_factor:1.125,baselineskip:1.2,lineH:0.8,lineD:0.2,FONTS:{STIXGeneral:"General/Regular/Main.js","STIXGeneral-italic":"General/Italic/Main.js","STIXGeneral-bold":"General/Bold/Main.js","STIXGeneral-bold-italic":"General/BoldItalic/Main.js",STIXNonUnicode:"NonUnicode/Regular/Main.js","STIXNonUnicode-italic":"NonUnicode/Italic/Main.js","STIXNonUnicode-bold":"NonUnicode/Bold/Main.js","STIXNonUnicode-bold-italic":"NonUnicode/BoldItalic/Main.js",STIXVariants:"Variants/Regular/All.js",STIXSizeOneSym:"SizeOneSym/Regular/All.js",STIXSizeTwoSym:"SizeTwoSym/Regular/All.js",STIXSizeThreeSym:"SizeThreeSym/Regular/All.js",STIXSizeFourSym:"SizeFourSym/Regular/All.js",STIXSizeFiveSym:"SizeFiveSym/Regular/All.js",STIXIntegralsD:"IntegralsD/Regular/All.js"},VARIANT:{normal:{fonts:[i,k,d]},bold:{fonts:[h,"STIXNonUnicode-bold","STIXSizeOneSym-bold"],bold:true},italic:{fonts:[g,"STIXNonUnicode-italic",i,k,d],italic:true},"bold-italic":{fonts:["STIXGeneral-bold-italic","STIXNonUnicode-bold-italic"],bold:true,italic:true},"double-struck":{offsetA:120120,offsetN:120792,remap:{120122:8450,120127:8461,120133:8469,120135:8473,120136:8474,120137:8477,120145:8484}},fraktur:{offsetA:120068,remap:{120070:8493,120075:8460,120076:8465,120085:8476,120093:8488}},"bold-fraktur":{fonts:[h],offsetA:120172,bold:true},script:{fonts:[g],offsetA:119964,remap:{119965:8492,119968:8496,119969:8497,119971:8459,119972:8464,119975:8466,119976:8499,119981:8475,119994:8495,119996:8458,120004:8500}},"bold-script":{fonts:[g],offsetA:120016,bold:true},"sans-serif":{offsetA:120224,offsetN:120802,offsetG:57725},"bold-sans-serif":{offsetA:120276,offsetG:120662,offsetN:120812,bold:true},"sans-serif-italic":{fonts:[g],offsetA:120328,offsetN:57780,offsetG:57791,italic:true},"sans-serif-bold-italic":{fonts:["STIXGeneral-bold-italic"],offsetA:120380,offsetN:57846,offsetG:120720,bold:true,italic:true},monospace:{offsetA:120432,offsetN:120822},"-STIX-variant":{fonts:["STIXVariants",k,i]},"-tex-caligraphic":{fonts:[g,"STIXNonUnicode-italic",k,d],offsetA:57901,noLowerCase:1},"-tex-oldstyle":{offsetN:57953,remap:{57954:57957,57955:57961,57956:57965,57957:57969,57958:57973,57959:57977,57960:57981,57961:57985,57962:57989}},"-largeOp":{fonts:[d,"STIXIntegralsD",k,i]},"-smallOp":{}},RANGES:[{name:"alpha",low:97,high:122,offset:"A",add:26},{name:"Alpha",low:65,high:90,offset:"A"},{name:"number",low:48,high:57,offset:"N"},{name:"greek",low:945,high:969,offset:"G",add:25},{name:"Greek",low:913,high:1014,offset:"G",remap:{1013:53,977:54,1008:55,981:56,1009:57,982:58,1012:17}}],RULECHAR:8254,REMAP:{755:730,756:714,65079:9182,65080:9183,12296:10216,12297:10217,10072:8739},DELIMITERS:{40:{dir:e,HW:[[0.844,i],[1.23,d],[1.353,d,1.1],[1.845,c],[2.048,c,1.11],[2.46,b],[2.472,b,1.005],[3.075,a]],stretch:{top:[9115,d],ext:[9116,d],bot:[9117,d]}},41:{dir:e,HW:[[0.844,i],[1.23,d],[1.353,d,1.1],[1.845,c],[2.048,c,1.11],[2.46,b],[2.472,b,1.005],[3.075,a]],stretch:{top:[9118,d],ext:[9119,d],bot:[9120,d]}},47:{dir:e,HW:[[0.69,i],[1.23,d],[1.353,d,1.1],[1.845,c],[2.048,c,1.11],[2.46,b],[2.472,b,1.005],[3.075,a]]},91:{dir:e,HW:[[0.818,i],[1.23,d],[1.353,d,1.1],[1.845,c],[2.048,c,1.11],[2.46,b],[2.472,b,1.005],[3.075,a]],stretch:{top:[9121,d],ext:[9122,d],bot:[9123,d]}},92:{dir:e,HW:[[0.69,i],[1.23,d],[1.353,d,1.1],[1.845,c],[2.048,c,1.11],[2.46,b],[2.472,b,1.005],[3.075,a]]},93:{dir:e,HW:[[0.818,i],[1.23,d],[1.353,d,1.1],[1.845,c],[2.048,c,1.11],[2.46,b],[2.472,b,1.005],[3.075,a]],stretch:{top:[9124,d],ext:[9125,d],bot:[9126,d]}},123:{dir:e,HW:[[0.861,i],[1.23,d],[1.353,d,1.1],[1.845,c],[2.048,c,1.11],[2.46,b],[2.472,b,1.005],[3.075,a]],stretch:{top:[9127,d],mid:[9128,d],bot:[9129,d],ext:[9130,d]}},124:{dir:e,HW:[[0.69,i]],stretch:{ext:[8739,i]}},125:{dir:e,HW:[[0.861,i],[1.23,d],[1.353,d,1.1],[1.845,c],[2.048,c,1.11],[2.46,b],[2.472,b,1.005],[3.075,a]],stretch:{top:[9131,d],mid:[9132,d],bot:[9133,d],ext:[9130,d]}},710:{dir:j,HW:[[0.333,i],[0.56,d],[0.979,c],[1.46,b],[1.886,a],[2.328,l]]},711:{dir:j,HW:[[0.333,i],[0.56,d],[0.979,c],[1.46,b],[1.886,a],[2.328,l]]},732:{dir:j,HW:[[0.333,i],[0.558,d],[0.978,c],[1.458,b],[1.886,a],[2.328,l]]},8214:{dir:e,HW:[[0.879,i]],stretch:{ext:[8214,i]}},8254:{dir:j,HW:[[0.5,i]],stretch:{rep:[8254,i]}},8592:{dir:j,HW:[[0.926,i]],stretch:{left:[8592,i],rep:[8722,i]}},8593:{dir:e,HW:[[0.818,i]],stretch:{top:[8593,i],ext:[9168,i]}},8594:{dir:j,HW:[[0.926,i]],stretch:{rep:[8722,i],right:[8594,i]}},8595:{dir:e,HW:[[0.818,i]],stretch:{ext:[9168,i],bot:[8595,i]}},8596:{dir:j,HW:[[0.926,i]],stretch:{left:[8592,i],rep:[8722,i],right:[8594,i]}},8597:{dir:e,HW:[[0.818,i]],stretch:{top:[8593,i],ext:[9168,i],bot:[8595,i]}},8656:{dir:j,HW:[[0.926,i]],stretch:{left:[8656,i],rep:[61,i]}},8657:{dir:e,HW:[[0.818,i]],stretch:{top:[8657,i],ext:[8741,i,0.1]}},8658:{dir:j,HW:[[0.926,i]],stretch:{rep:[61,i],right:[8658,i]}},8659:{dir:e,HW:[[0.818,i]],stretch:{ext:[8741,i,0.1],bot:[8659,i]}},8660:{dir:j,HW:[[0.926,i]],stretch:{left:[8656,i],rep:[61,i],right:[8658,i]}},8661:{dir:e,HW:[[0.818,i]],stretch:{top:[8657,i],ext:[8741,i,0.1],bot:[8659,i]}},8730:{dir:e,HW:[[0.954,"STIXVariants"],[1.232,i],[1.847,d],[2.46,c],[3.075,b]],stretch:{top:[57345,k],ext:[57344,k],bot:[9143,d],fullExtenders:true}},8739:{dir:e,HW:[[0.879,i]],stretch:{ext:[8739,i]}},8741:{dir:e,HW:[[0.879,i]],stretch:{ext:[8741,i]}},8968:{dir:e,HW:[[0.926,i],[1.23,d],[1.353,d,1.1],[1.845,c],[2.048,c,1.11],[2.46,b],[2.472,b,1.005],[3.075,a]],stretch:{top:[9121,d],ext:[9122,d]}},8969:{dir:e,HW:[[0.926,i],[1.23,d],[1.353,d,1.1],[1.845,c],[2.048,c,1.11],[2.46,b],[2.472,b,1.005],[3.075,a]],streth:{top:[9124,d],ext:[9125,d]}},8970:{dir:e,HW:[[0.926,i],[1.23,d],[1.353,d,1.1],[1.845,c],[2.048,c,1.11],[2.46,b],[2.472,b,1.005],[3.075,a]],stretch:{ext:[9122,d],bot:[9123,d]}},8971:{dir:e,HW:[[0.926,i],[1.23,d],[1.353,d,1.1],[1.845,c],[2.048,c,1.11],[2.46,b],[2.472,b,1.005],[3.075,a]],stretch:{ext:[9125,d],bot:[9126,d]}},9130:{dir:e,HW:[[1.01,d]],stretch:{top:[9130,d],ext:[9130,d],bot:[9130,d]}},9135:{dir:j,HW:[[0.315,i]],stretch:{rep:[9135,i]}},9136:{dir:e,HW:[[1,d]],stretch:{top:[9127,d],ext:[9130,d],bot:[9133,d]}},9137:{dir:e,HW:[[1,d]],stretch:{top:[9131,d],ext:[9130,d],bot:[9129,d]}},9168:{dir:e,HW:[[0.304,i],[0.69,i,null,124],[0.879,i,null,8739]],stretch:{ext:[8739,i]}},9182:{dir:j,HW:[[0.556,i],[0.926,d],[1.46,c],[1.886,b],[2.328,a],[3.238,l]],stretch:{left:[57659,k],mid:[57664,k],right:[57660,k],rep:[57674,k]}},9183:{dir:j,HW:[[0.556,i],[0.926,d],[1.46,c],[1.886,b],[2.328,a],[3.238,l]],stretch:{left:[57661,k],mid:[57665,k],right:[57662,k],rep:[57675,k]}},10216:{dir:e,HW:[[0.926,i],[1.23,d],[1.353,d,1.1],[1.845,c],[2.048,c,1.11],[2.46,b],[2.472,b,1.005],[3.075,a]]},10217:{dir:e,HW:[[0.926,i],[1.23,d],[1.353,d,1.1],[1.845,c],[2.048,c,1.11],[2.46,b],[2.472,b,1.005],[3.075,a]]},10222:{dir:e,HW:[[0.853,i]],stretch:{top:[9127,d],ext:[9130,d],bot:[9129,d]}},10223:{dir:e,HW:[[0.853,i]],stretch:{top:[9131,d],ext:[9130,d],bot:[9133,d]}},45:{alias:9135,dir:j},94:{alias:726,dir:j},95:{alias:9135,dir:j},126:{alias:732,dir:j},175:{alias:9135,dir:j},770:{alias:710,dir:j},771:{alias:732,dir:j},780:{alias:711,dir:j},818:{alias:9135,dir:j},8213:{alias:9135,dir:j},8215:{alias:9135,dir:j},8722:{alias:9135,dir:j},9001:{alias:10216,dir:e},9002:{alias:10217,dir:e},9472:{alias:8722,dir:j},10072:{alias:8739,dir:e},12296:{alias:10216,dir:e},12297:{alias:10217,dir:e},65079:{alias:9182,dir:j},65080:{alias:9183,dir:j}}}});MathJax.Hub.Register.StartupHook("TeX Jax Ready",function(){var n=MathJax.InputJax.TeX;n.isSTIX=true;n.Definitions.mathchar0mi.hbar=["210F",{variantForm:true}];n.Definitions.mathchar0mi.prime[1].variantForm=true;n.Definitions.mathchar0mi.emptyset[1].variantForm=true;n.Definitions.mathchar0mi.backslash[1].variantForm=true;n.Definitions.mathchar0mi.triangle[1].mathsize="71%";n.Definitions.mathchar0mo.setminus=["2216",{variantForm:true}]});f.FONTDATA.FONTS.STIXGeneral={directory:"General/Regular",family:"STIXGeneral",Ranges:[[160,255,"Latin1Supplement"],[256,383,"LatinExtendedA"],[384,591,"LatinExtendedB"],[592,687,"IPAExtensions"],[688,767,"SpacingModLetters"],[768,879,"CombDiacritMarks"],[880,1023,"GreekAndCoptic"],[1024,1279,"Cyrillic"],[7424,7615,"PhoneticExtensions"],[7680,7935,"LatinExtendedAdditional"],[8192,8303,"GeneralPunctuation"],[8304,8351,"SuperAndSubscripts"],[8352,8399,"CurrencySymbols"],[8400,8447,"CombDiactForSymbols"],[8448,8527,"LetterlikeSymbols"],[8528,8591,"NumberForms"],[8592,8703,"Arrows"],[8704,8959,"MathOperators"],[8960,9215,"MiscTechnical"],[9216,9279,"ControlPictures"],[9312,9471,"EnclosedAlphanum"],[9472,9599,"BoxDrawing"],[9600,9631,"BlockElements"],[9632,9727,"GeometricShapes"],[9728,9983,"MiscSymbols"],[9984,10175,"Dingbats"],[10176,10223,"MiscMathSymbolsA"],[10224,10239,"SupplementalArrowsA"],[10496,10623,"SupplementalArrowsB"],[10624,10751,"MiscMathSymbolsB"],[10752,11007,"SuppMathOperators"],[11008,11263,"MiscSymbolsAndArrows"],[12288,12351,"CJK"],[12352,12447,"Hiragana"],[42784,43007,"LatinExtendedD"],[64256,64335,"AlphaPresentForms"],[65520,65535,"Specials"],[119808,119859,"MathBold"],[119860,119911,"MathItalic"],[119912,119963,"MathBoldItalic"],[119964,120015,"MathScript"],[120016,120067,"MathBoldScript"],[120068,120119,"Fraktur"],[120120,120171,"BBBold"],[120172,120223,"BoldFraktur"],[120224,120275,"MathSS"],[120276,120327,"MathSSBold"],[120328,120379,"MathSSItalic"],[120380,120431,"MathSSItalicBold"],[120432,120483,"MathTT"],[120484,120485,"ij"],[120488,120545,"GreekBold"],[120546,120603,"GreekItalic"],[120604,120661,"GreekBoldItalic"],[120662,120719,"GreekSSBold"],[120720,120777,"GreekSSBoldItalic"],[120782,120791,"MathBold"],[120792,120801,"BBBold"],[120802,120811,"MathSS"],[120812,120822,"MathSSBold"],[120822,120831,"MathTT"]],32:[0,0,250,0,0],33:[676,9,333,130,236],34:[676,-431,408,77,331],35:[662,0,500,6,495],36:[727,87,500,44,458],37:[706,19,747,61,686],38:[676,13,778,42,750],39:[676,-431,180,48,133],40:[676,177,333,48,304],41:[676,177,333,29,285],42:[676,-265,500,68,433],43:[547,41,685,48,636],44:[102,141,250,55,195],45:[257,-194,333,39,285],46:[100,11,250,70,181],47:[676,14,278,-9,287],48:[676,14,500,24,476],49:[676,0,500,111,394],50:[676,0,500,29,474],51:[676,14,500,41,431],52:[676,0,500,12,473],53:[688,14,500,31,438],54:[684,14,500,34,468],55:[662,8,500,20,449],56:[676,14,500,56,445],57:[676,22,500,30,459],58:[459,11,278,81,192],59:[459,141,278,80,219],60:[534,24,685,56,621],61:[386,-120,685,48,637],62:[534,24,685,56,621],63:[676,8,444,68,414],64:[676,14,921,116,809],65:[674,0,722,15,707],66:[662,0,667,17,593],67:[676,14,667,28,633],68:[662,0,722,16,685],69:[662,0,611,12,597],70:[662,0,556,11,546],71:[676,14,722,32,709],72:[662,0,722,18,703],73:[662,0,333,18,315],74:[662,14,373,-6,354],75:[662,0,722,33,723],76:[662,0,611,12,598],77:[662,0,889,12,864],78:[662,11,722,12,707],79:[676,14,722,34,688],80:[662,0,557,16,542],81:[676,177,722,34,701],82:[662,0,667,17,660],83:[676,14,556,43,491],84:[662,0,611,17,593],85:[662,14,722,14,705],86:[662,11,722,16,697],87:[662,11,944,5,932],88:[662,0,722,10,704],89:[662,0,722,22,703],90:[662,0,612,10,598],91:[662,156,333,88,299],92:[676,14,278,-9,287],93:[662,156,333,34,245],94:[662,-297,469,24,446],95:[-75,125,500,0,500],96:[678,-507,333,18,242],97:[460,10,444,37,442],98:[683,10,500,3,468],99:[460,10,444,25,412],100:[683,10,500,27,491],101:[460,10,444,25,424],102:[683,0,333,20,383],103:[460,218,500,28,470],104:[683,0,500,9,487],105:[683,0,278,16,253],106:[683,218,278,-70,194],107:[683,0,500,7,505],108:[683,0,278,19,257],109:[460,0,778,16,775],110:[460,0,500,16,485],111:[460,10,500,29,470],112:[460,217,500,5,470],113:[460,217,500,24,488],114:[460,0,333,5,335],115:[459,10,389,51,348],116:[579,10,278,13,279],117:[450,10,500,9,480],118:[450,14,500,19,477],119:[450,14,722,21,694],120:[450,0,500,17,479],121:[450,218,500,14,475],122:[450,0,444,27,418],123:[680,181,480,100,350],124:[676,14,200,67,133],125:[680,181,480,130,380],126:[325,-183,541,40,502],160:[0,0,250,0,0],168:[622,-523,333,18,316],172:[393,-115,600,48,552],175:[601,-547,333,11,322],177:[502,87,685,48,637],183:[310,-199,250,70,181],215:[529,25,640,43,597],247:[516,10,564,30,534],305:[460,0,278,16,253],567:[460,218,278,-70,193],710:[674,-507,333,11,322],711:[674,-507,333,11,322],713:[601,-547,334,11,322],714:[679,-509,333,93,320],715:[679,-509,333,22,249],728:[664,-507,335,27,308],729:[622,-523,333,118,217],732:[638,-532,333,1,331],768:[678,-507,0,-371,-147],769:[678,-507,0,-371,-147],770:[674,-507,0,-386,-75],771:[638,-532,0,-395,-65],772:[601,-547,0,-385,-74],774:[664,-507,0,-373,-92],775:[622,-523,0,-280,-181],776:[622,-523,0,-379,-81],778:[711,-512,0,-329,-130],779:[678,-507,0,-401,-22],780:[674,-507,0,-385,-74],824:[662,156,0,-380,31],915:[662,0,587,11,577],916:[674,0,722,48,675],920:[676,14,722,34,688],923:[674,0,702,15,687],926:[662,0,643,29,614],928:[662,0,722,18,703],931:[662,0,624,30,600],933:[674,0,722,29,703],934:[662,0,763,35,728],936:[690,0,746,22,724],937:[676,0,744,29,715],8224:[676,149,500,59,442],8225:[676,153,500,58,442],8230:[100,11,1000,111,888],8242:[678,-402,289,75,214],8254:[820,-770,500,0,500],8407:[760,-548,0,-453,-17],8465:[695,34,762,45,711],8472:[547,217,826,52,799],8476:[704,22,874,50,829],8501:[677,13,682,43,634],8592:[449,-58,926,71,857],8593:[662,156,511,60,451],8594:[448,-57,926,70,856],8595:[662,156,511,60,451],8596:[449,-57,926,38,888],8597:[730,224,511,60,451],8598:[662,156,926,70,856],8599:[662,156,926,70,856],8600:[662,156,926,70,856],8601:[662,156,926,70,856],8614:[450,-57,926,70,857],8617:[553,-57,926,70,856],8618:[553,-57,926,70,856],8636:[494,-220,955,54,901],8637:[286,-12,955,54,901],8640:[494,-220,955,54,901],8641:[286,-12,955,54,901],8652:[539,33,926,70,856],8656:[551,45,926,60,866],8657:[662,156,685,45,641],8658:[551,45,926,60,866],8659:[662,156,685,45,641],8660:[517,10,926,20,906],8661:[730,224,685,45,641],8704:[662,0,560,2,558],8706:[668,11,471,40,471],8707:[662,0,560,73,487],8709:[583,79,762,50,712],8711:[662,12,731,63,667],8712:[531,27,685,60,625],8713:[662,157,685,60,625],8715:[531,27,685,60,625],8719:[763,259,1000,52,948],8720:[763,259,1000,52,948],8721:[763,259,914,58,856],8722:[286,-220,685,64,621],8723:[502,87,685,48,637],8725:[710,222,523,46,478],8726:[411,-93,428,25,403],8727:[471,-33,523,67,457],8728:[387,-117,350,40,310],8729:[387,-117,350,40,310],8730:[973,259,928,112,963],8733:[430,0,685,41,643],8734:[430,0,926,70,854],8736:[547,0,685,23,643],8739:[690,189,266,100,166],8741:[690,189,523,129,394],8743:[536,29,620,31,589],8744:[536,29,620,31,589],8745:[536,31,620,48,572],8746:[536,31,620,48,572],8747:[824,320,459,32,639],8764:[362,-148,685,48,637],8768:[547,42,286,35,249],8771:[445,-55,685,48,637],8773:[532,27,685,48,637],8776:[475,-25,685,48,637],8781:[498,-8,685,48,637],8784:[611,-120,685,48,637],8800:[662,156,685,48,637],8801:[478,-28,685,48,637],8804:[609,103,685,64,629],8805:[609,103,685,64,629],8810:[532,26,933,25,908],8811:[532,26,933,25,908],8826:[532,26,685,64,621],8827:[532,26,685,64,621],8828:[628,120,685,64,621],8829:[629,119,685,64,621],8834:[531,25,685,64,621],8835:[531,25,685,64,621],8838:[607,103,685,64,621],8839:[607,103,685,64,621],8846:[536,31,620,48,572],8849:[607,103,685,64,621],8850:[607,103,685,64,621],8851:[536,31,620,48,572],8852:[536,31,620,48,572],8853:[623,119,842,50,792],8854:[623,119,842,50,792],8855:[623,119,842,50,792],8856:[623,119,842,50,792],8857:[583,79,762,50,712],8866:[662,0,685,64,621],8867:[662,0,685,64,621],8868:[662,0,685,48,637],8869:[662,0,685,48,637],8872:[662,0,685,64,621],8896:[763,259,924,54,870],8897:[763,259,924,54,870],8898:[778,254,924,94,830],8899:[768,264,924,94,830],8900:[488,-16,523,26,497],8901:[313,-193,286,83,203],8902:[597,13,700,35,665],8904:[582,80,810,54,756],8942:[606,104,511,192,319],8943:[316,-189,926,108,818],8945:[520,18,926,194,732],8968:[713,213,469,188,447],8969:[713,213,469,27,286],8970:[713,213,469,188,447],8971:[713,213,469,27,286],8994:[360,-147,1019,54,965],8995:[360,-147,1019,54,965],9135:[286,-220,315,0,315],9168:[405,-101,511,222,288],9651:[811,127,1145,35,1110],9657:[555,50,660,80,605],9661:[811,127,1145,35,1110],9667:[554,51,660,55,580],9711:[785,282,1207,70,1137],9824:[609,99,685,34,651],9825:[603,105,685,34,651],9826:[609,105,685,41,643],9827:[603,99,685,34,651],9837:[768,10,426,57,346],9838:[768,181,426,75,350],9839:[768,181,426,41,386],10216:[713,213,400,77,335],10217:[713,213,400,65,323],10222:[676,177,233,56,211],10223:[676,177,233,22,177],10229:[449,-58,1574,55,1519],10230:[449,-57,1574,55,1519],10231:[449,-57,1574,55,1519],10232:[551,45,1574,55,1519],10233:[551,45,1574,55,1519],10234:[517,10,1574,55,1519],10235:[450,-57,1574,55,1519],10236:[450,-57,1574,55,1519],10741:[710,222,523,46,478],10752:[763,259,1126,53,1073],10753:[763,259,1126,53,1073],10754:[763,259,1126,53,1073],10755:[768,264,924,94,830],10756:[768,264,924,94,830],10757:[763,259,924,94,830],10758:[763,259,924,94,830],10815:[662,0,694,30,664],10927:[609,103,685,64,621],10928:[609,103,685,64,621]};f.FONTDATA.FONTS["STIXGeneral-bold"]={directory:"General/Bold",family:"STIXGeneral",weight:"bold",Ranges:[[160,255,"Latin1Supplement"],[256,383,"LatinExtendedA"],[384,591,"LatinExtendedB"],[592,687,"IPAExtensions"],[688,767,"SpacingModLetters"],[768,879,"CombDiacritMarks"],[880,1023,"GreekAndCoptic"],[1024,1279,"Cyrillic"],[7424,7615,"PhoneticExtensions"],[7680,7935,"LatinExtendedAdditional"],[8192,8303,"GeneralPunctuation"],[8304,8351,"SuperAndSubscripts"],[8352,8399,"CurrencySymbols"],[8400,8447,"CombDiactForSymbols"],[8448,8527,"LetterlikeSymbols"],[8528,8591,"NumberForms"],[8592,8703,"Arrows"],[8704,8959,"MathOperators"],[8960,9215,"MiscTechnical"],[9216,9279,"ControlPictures"],[9312,9471,"EnclosedAlphanum"],[9472,9599,"BoxDrawing"],[9632,9727,"GeometricShapes"],[9728,9983,"MiscSymbols"],[10176,10223,"MiscMathSymbolsA"],[10624,10751,"MiscMathSymbolsB"],[10752,11007,"SuppMathOperators"],[64256,64335,"AlphaPresentForms"],[119808,119859,"MathBold"],[120172,120223,"BoldFraktur"],[120276,120327,"MathSSBold"],[120488,120545,"GreekBold"],[120662,120719,"GreekSSBold"],[120782,120791,"MathBold"],[120812,120822,"MathSSBold"]],32:[0,0,250,0,0],33:[691,13,333,81,251],34:[691,-404,555,83,472],35:[700,0,500,5,495],36:[750,99,500,29,472],37:[706,29,749,61,688],38:[691,16,833,62,789],39:[691,-404,278,75,204],40:[694,168,333,46,306],41:[694,168,333,27,287],42:[691,-255,500,56,448],43:[563,57,750,65,685],44:[155,180,250,39,223],45:[287,-171,333,44,287],46:[156,13,250,41,210],47:[691,19,278,-24,302],48:[688,13,500,24,476],49:[688,0,500,65,441],50:[688,0,500,17,478],51:[688,14,500,16,468],52:[688,0,500,19,476],53:[676,8,500,22,470],54:[688,13,500,28,475],55:[676,0,500,17,477],56:[688,13,500,28,472],57:[688,13,500,26,473],58:[472,13,333,82,251],59:[472,180,333,82,266],60:[534,24,750,80,670],61:[399,-107,750,68,682],62:[534,24,750,80,670],63:[689,13,500,57,445],64:[691,19,930,108,822],65:[690,0,722,9,689],66:[676,0,667,16,619],67:[691,19,722,49,687],68:[676,0,722,14,690],69:[676,0,667,16,641],70:[676,0,611,16,583],71:[691,19,778,37,755],72:[676,0,778,21,759],73:[676,0,389,20,370],74:[676,96,500,3,478],75:[676,0,778,30,769],76:[677,0,667,19,638],77:[676,0,944,14,921],78:[676,18,722,16,701],79:[691,19,778,35,743],80:[676,0,611,16,600],81:[691,176,778,35,743],82:[676,0,722,26,716],83:[692,19,556,35,513],84:[676,0,667,31,636],85:[676,19,722,16,701],86:[676,18,722,16,701],87:[676,15,1000,19,981],88:[676,0,722,16,699],89:[676,0,722,15,699],90:[676,0,667,28,634],91:[678,149,333,67,301],92:[691,19,278,-25,303],93:[678,149,333,32,266],94:[676,-311,581,73,509],95:[-75,125,500,0,500],96:[713,-528,333,8,246],97:[473,14,500,25,488],98:[676,14,556,17,521],99:[473,14,444,25,430],100:[676,14,556,25,534],101:[473,14,444,25,427],102:[691,0,333,14,389],103:[473,206,500,28,483],104:[676,0,556,15,534],105:[691,0,278,15,256],106:[691,203,333,-57,263],107:[676,0,556,22,543],108:[676,0,278,15,256],109:[473,0,833,15,814],110:[473,0,556,21,539],111:[473,14,500,25,476],112:[473,205,556,19,524],113:[473,205,556,34,536],114:[473,0,444,28,434],115:[473,14,389,25,361],116:[630,12,333,19,332],117:[461,14,556,16,538],118:[461,14,500,21,485],119:[461,14,722,23,707],120:[461,0,500,12,484],121:[461,205,500,16,482],122:[461,0,444,21,420],123:[698,175,394,22,340],124:[691,19,220,66,154],125:[698,175,394,54,372],126:[333,-173,520,29,491],915:[676,0,620,16,593],916:[690,0,722,33,673],920:[692,18,778,35,743],923:[690,0,707,9,674],926:[676,0,647,40,607],928:[676,0,778,21,759],931:[676,0,671,28,641],933:[692,0,703,7,693],934:[676,0,836,18,818],936:[692,0,808,15,797],937:[692,0,768,28,740]};f.FONTDATA.FONTS["STIXGeneral-italic"]={directory:"General/Italic",family:"STIXGeneral",style:"italic",Ranges:[[160,255,"Latin1Supplement"],[256,383,"LatinExtendedA"],[384,591,"LatinExtendedB"],[592,687,"IPAExtensions"],[688,767,"SpacingModLetters"],[880,1023,"GreekAndCoptic"],[1024,1279,"Cyrillic"],[7680,7935,"LatinExtendedAdditional"],[8192,8303,"GeneralPunctuation"],[8352,8399,"CurrencySymbols"],[8400,8447,"CombDiactForSymbols"],[8448,8527,"LetterlikeSymbols"],[8704,8959,"MathOperators"],[9216,9279,"ControlPictures"],[9312,9471,"EnclosedAlphanum"],[9472,9599,"BoxDrawing"],[64256,64335,"AlphaPresentForms"],[119860,119911,"MathItalic"],[119964,120015,"MathScript"],[120328,120379,"MathSSItalic"],[120484,120485,"ij"],[120546,120603,"GreekItalic"]],32:[0,0,250,0,0],33:[667,11,333,39,304],34:[666,-421,420,144,432],35:[676,0,501,2,540],36:[731,89,500,32,497],37:[706,19,755,80,705],38:[666,18,778,76,723],39:[666,-421,214,132,241],40:[669,181,333,42,315],41:[669,180,333,16,289],42:[666,-255,500,128,492],43:[506,0,675,86,590],44:[101,129,250,-5,135],45:[255,-192,333,49,282],46:[100,11,250,27,138],47:[666,18,278,-65,386],48:[676,7,500,32,497],49:[676,0,500,50,409],50:[676,0,500,12,452],51:[676,7,500,16,465],52:[676,0,500,1,479],53:[666,7,500,15,491],54:[686,7,500,30,521],55:[666,8,500,75,537],56:[676,7,500,30,493],57:[676,17,500,23,492],58:[441,11,333,50,261],59:[441,129,333,26,261],60:[516,10,675,84,592],61:[386,-120,675,86,590],62:[516,10,675,84,592],63:[664,12,500,132,472],64:[666,18,920,118,806],65:[668,0,611,-51,564],66:[653,0,611,-8,588],67:[666,18,667,66,689],68:[653,0,722,-8,700],69:[653,0,611,-1,634],70:[653,0,611,8,645],71:[666,18,722,52,722],72:[653,0,722,-8,769],73:[653,0,333,-8,384],74:[653,18,444,-6,491],75:[653,0,667,7,722],76:[653,0,556,-8,559],77:[653,0,833,-18,872],78:[653,15,667,-20,727],79:[667,18,722,60,699],80:[653,0,611,0,605],81:[666,182,722,59,699],82:[653,0,611,-13,588],83:[667,18,500,17,508],84:[653,0,556,59,633],85:[653,18,722,102,765],86:[653,18,611,76,688],87:[653,18,833,71,906],88:[653,0,611,-29,655],89:[653,0,556,78,633],90:[653,0,556,-6,606],91:[663,153,389,21,391],92:[666,18,278,-41,319],93:[663,153,389,12,382],94:[666,-301,422,0,422],95:[-75,125,500,0,500],96:[664,-492,333,120,311],97:[441,11,501,17,476],98:[683,11,500,23,473],99:[441,11,444,30,425],100:[683,13,500,15,527],101:[441,11,444,31,412],102:[678,207,278,-147,424],103:[441,206,500,8,471],104:[683,9,500,19,478],105:[654,11,278,49,264],106:[652,207,278,-124,279],107:[683,11,444,14,461],108:[683,11,278,41,279],109:[441,9,722,12,704],110:[441,9,500,14,474],111:[441,11,500,27,468],112:[441,205,504,-75,472],113:[441,209,500,25,484],114:[441,0,389,45,412],115:[442,13,389,16,366],116:[546,11,278,38,296],117:[441,11,500,42,475],118:[441,18,444,20,426],119:[441,18,667,15,648],120:[441,11,444,-27,447],121:[441,206,444,-24,426],122:[428,81,389,-2,380],123:[687,177,400,51,407],124:[666,18,275,105,171],125:[687,177,400,-7,349],126:[323,-183,541,40,502],305:[441,11,278,47,235],567:[441,207,278,-124,246],915:[653,0,611,8,645],916:[668,0,611,-32,526],920:[667,18,722,60,699],923:[668,0,611,-51,564],926:[653,0,651,-6,680],928:[653,0,722,-8,769],931:[653,0,620,-6,659],933:[668,0,556,78,648],934:[653,0,741,50,731],936:[667,0,675,77,778],937:[666,0,762,-6,739],945:[441,11,552,27,549],946:[678,205,506,-40,514],947:[435,206,410,19,438],948:[668,11,460,24,460],949:[441,11,444,30,425],950:[683,185,454,30,475],951:[441,205,474,14,442],952:[678,11,480,27,494],953:[441,11,278,49,235],954:[441,13,444,14,465],955:[678,16,458,-12,431],956:[428,205,526,-33,483],957:[441,18,470,20,459],958:[683,185,454,30,446],959:[441,11,500,27,468],960:[428,18,504,19,536],961:[441,205,504,-40,471],962:[441,185,454,30,453],963:[428,11,498,27,531],964:[428,11,410,12,426],965:[441,10,478,19,446],966:[441,205,622,27,590],967:[441,207,457,-108,498],968:[441,205,584,15,668],969:[439,11,686,27,654],977:[678,10,556,19,526],981:[683,205,627,27,595],982:[428,11,792,17,832],1009:[441,205,516,27,484],1013:[441,11,444,30,420],8467:[687,11,579,48,571]};f.FONTDATA.FONTS.STIXIntegralsD={directory:"IntegralsD/Regular",family:"STIXIntegralsD",Ranges:[[32,32,"All"],[160,160,"All"],[8747,8755,"All"],[10763,10780,"All"]],8747:[2000,269,585,56,1035],8750:[2000,269,635,56,1035]};f.FONTDATA.FONTS.STIXNonUnicode={directory:"NonUnicode/Regular",family:"STIXNonUnicode",Ranges:[[32,32,"All"],[160,160,"All"],[57344,63743,"PrivateUse"]],57344:[610,25,1184,829,895],57345:[667,-41,1184,829,1211],57656:[634,-584,480,-10,490],57657:[-127,177,480,-10,490],57659:[955,-512,897,-25,908],57660:[955,-512,897,-11,922],57661:[182,261,897,-25,908],57662:[182,261,897,-11,922],57664:[1218,-820,1844,-10,1854],57665:[-126,524,1844,-10,1854],57674:[955,-820,633,-1,634],57675:[-126,261,633,-1,634],57953:[422,10,523,41,481],57957:[421,0,523,127,405],57961:[421,0,523,68,455],57965:[424,198,523,47,463],57969:[420,198,523,58,480],57973:[421,198,523,66,457],57977:[612,8,523,37,486],57981:[421,198,523,25,490],57985:[606,12,523,47,477],57989:[421,200,523,41,483],57999:[135,0,325,-1,326],58000:[135,0,633,-1,634]};f.FONTDATA.FONTS["STIXNonUnicode-bold"]={directory:"NonUnicode/Bold",family:"STIXNonUnicode",weight:"bold",Ranges:[[32,32,"All"],[160,160,"All"],[57344,63743,"PrivateUse"]]};f.FONTDATA.FONTS["STIXNonUnicode-italic"]={directory:"NonUnicode/Italic",family:"STIXNonUnicode",style:"italic",Ranges:[[32,32,"All"],[160,160,"All"],[57344,63743,"PrivateUse"]],57901:[677,45,852,43,812],57902:[670,3,724,35,709],57903:[671,11,569,43,586],57904:[662,0,801,34,788],57905:[670,4,553,40,599],57906:[662,0,652,43,710],57907:[671,131,580,40,580],57908:[664,21,831,41,845],57909:[662,0,575,38,591],57910:[662,120,632,31,785],57911:[670,13,809,30,783],57912:[670,7,693,30,653],57913:[671,45,1166,40,1128],57914:[795,37,957,40,1064],57915:[669,10,737,38,729],57916:[662,0,667,38,709],57917:[671,131,744,43,704],57918:[662,3,854,38,816],57919:[671,0,634,38,671],57920:[721,0,509,41,730],57921:[672,13,817,37,950],57922:[677,33,638,33,680],57923:[685,32,956,33,998],57924:[672,13,692,38,739],57925:[675,131,719,34,763],57926:[664,94,752,38,714]};f.FONTDATA.FONTS.STIXSizeOneSym={directory:"SizeOneSym/Regular",family:"STIXSizeOneSym",Ranges:[[688,767,"All"],[768,824,"All"],[8254,8254,"All"],[8400,8431,"All"],[8512,8512,"All"],[8730,8732,"All"],[8992,8993,"All"],[9115,9145,"All"],[9180,9185,"All"],[10098,10099,"All"],[10214,10219,"All"],[10627,10630,"All"],[10744,10745,"All"],[10752,10762,"All"],[11004,11007,"All"]],32:[0,0,250,0,0],40:[1066,164,468,139,382],41:[1066,164,468,86,329],47:[1066,164,579,25,552],91:[1066,164,383,180,363],92:[1066,164,579,27,552],93:[1066,164,383,20,203],95:[-127,177,1000,0,1000],123:[1066,164,575,114,466],125:[1066,164,575,109,461],160:[0,0,250,0,0],770:[767,-554,0,-720,-160],771:[750,-598,0,-722,-162],8719:[1500,-49,1355,50,1305],8720:[1500,-49,1355,50,1305],8721:[1499,-49,1292,90,1202],8730:[1552,295,1057,112,1089],8896:[1500,-49,1265,60,1205],8897:[1500,-49,1265,60,1205],8898:[1510,-49,1265,118,1147],8899:[1500,-39,1265,118,1147],8968:[1066,164,453,180,426],8969:[1066,164,453,25,273],8970:[1066,164,453,180,428],8971:[1066,164,453,27,273],9115:[700,305,450,50,400],9116:[705,305,450,50,174],9117:[705,300,450,50,400],9118:[700,305,450,50,400],9119:[705,305,450,276,400],9120:[705,300,450,50,400],9121:[682,323,450,50,415],9122:[687,323,450,50,150],9123:[687,318,450,50,415],9124:[682,323,450,35,400],9125:[687,323,450,300,400],9126:[687,318,450,35,400],9127:[700,305,640,260,600],9128:[705,305,640,40,380],9129:[705,300,640,260,600],9130:[705,305,640,260,380],9131:[700,305,640,40,380],9132:[705,305,640,260,600],9133:[705,300,640,40,380],9134:[610,25,688,294,394],9136:[700,301,600,35,566],9137:[700,301,600,35,566],9143:[1510,345,1184,112,895],9144:[1566,289,721,0,66],9145:[1566,289,721,655,721],9182:[136,89,926,0,925],9183:[789,-564,926,0,925],10216:[1066,164,578,116,462],10217:[1066,164,578,116,462],10752:[1500,-49,1555,52,1503],10753:[1500,-49,1555,52,1503],10754:[1500,-49,1555,52,1503],10756:[1500,-39,1265,118,1147],10757:[1500,-49,1153,82,1071],10758:[1500,-49,1153,82,1071]};f.FONTDATA.FONTS.STIXSizeTwoSym={directory:"SizeTwoSym/Regular",family:"STIXSizeTwoSym",Ranges:[[688,767,"All"],[768,824,"All"],[8254,8254,"All"],[8400,8431,"All"],[8730,8732,"All"],[9115,9145,"All"],[9180,9185,"All"],[10098,10099,"All"],[10214,10219,"All"],[10627,10630,"All"],[11004,11007,"All"]],32:[0,0,250,0,0],40:[1566,279,589,139,503],41:[1566,279,608,114,478],47:[1566,279,806,25,781],91:[1566,279,459,190,422],92:[1566,279,806,25,781],93:[1566,279,459,37,269],95:[-127,177,1500,0,1500],123:[1566,279,717,124,531],125:[1566,279,717,186,593],160:[0,0,250,0,0],770:[777,-564,0,-1150,-171],771:[760,-608,0,-1152,-173],8730:[2056,404,1124,110,1157],8968:[1566,279,524,190,479],8969:[1566,279,526,47,336],8970:[1566,279,524,190,479],8971:[1566,279,526,47,336],9182:[143,81,1460,0,1460],9183:[797,-573,1460,0,1460],10216:[1566,279,622,95,531],10217:[1566,279,622,91,527]};f.FONTDATA.FONTS.STIXSizeThreeSym={directory:"SizeThreeSym/Regular",family:"STIXSizeThreeSym",Ranges:[[688,767,"All"],[768,824,"All"],[8254,8254,"All"],[8400,8431,"All"],[8730,8732,"All"],[9115,9145,"All"],[9180,9185,"All"],[10098,10099,"All"],[10214,10219,"All"],[10627,10630,"All"]],32:[0,0,250,0,0],40:[2066,394,750,182,667],41:[2066,394,750,83,568],47:[2066,394,1101,30,1071],91:[2066,394,508,225,491],92:[2066,394,1101,30,1071],93:[2066,394,508,17,283],95:[-127,177,2000,0,2000],123:[2066,394,906,143,717],125:[2066,394,906,189,763],160:[0,0,250,0,0],770:[777,-564,0,-1610,-150],771:[774,-608,0,-1612,-152],8730:[2565,510,1076,112,1110],8968:[2066,394,565,225,550],8969:[2066,394,565,15,340],8970:[2066,394,565,225,550],8971:[2066,394,565,15,340],9182:[157,86,1886,0,1886],9183:[815,-572,1886,0,1886],10216:[2066,394,765,96,670],10217:[2066,394,765,95,669]};f.FONTDATA.FONTS.STIXSizeFourSym={directory:"SizeFourSym/Regular",family:"STIXSizeFourSym",Ranges:[[688,767,"All"],[768,824,"All"],[8254,8254,"All"],[8400,8431,"All"],[8730,8732,"All"],[9115,9145,"All"],[9180,9185,"All"],[10098,10099,"All"],[10214,10219,"All"],[10627,10630,"All"]],32:[0,0,250,0,0],40:[2566,509,808,124,732],41:[2566,509,808,76,684],47:[2566,509,1309,16,1293],91:[2566,509,661,295,634],92:[2566,509,1309,16,1293],93:[2566,509,661,27,366],95:[-127,177,2500,0,2500],123:[2566,509,1076,173,882],125:[2566,509,1076,194,903],160:[0,0,250,0,0],770:[796,-573,0,-2040,-154],771:[771,-608,0,-2040,-154],8730:[1510,345,1184,112,895],8968:[2566,509,682,295,655],8969:[2566,509,682,27,387],8970:[2566,509,682,295,655],8971:[2566,509,682,27,387],9182:[175,90,2328,0,2328],9183:[837,-572,2328,0,2328],10216:[2566,509,908,113,796],10217:[2566,509,908,112,795]};f.FONTDATA.FONTS.STIXSizeFiveSym={directory:"SizeFiveSym/Regular",family:"STIXSizeFiveSym",Ranges:[[688,767,"All"],[768,824,"All"],[8254,8254,"All"],[8400,8431,"All"],[9115,9145,"All"],[9180,9185,"All"]],32:[0,0,250,0,0],95:[-127,177,3000,0,3000],160:[0,0,250,0,0],770:[816,-572,0,-2485,-157],771:[780,-617,0,-2485,-157],9182:[181,90,3238,0,3238],9183:[844,-573,3238,0,3238]};f.FONTDATA.FONTS.STIXVariants={directory:"Variants/Regular",family:"STIXVariants",Ranges:[[32,32,"All"],[119,124,"All"],[160,160,"All"],[411,411,"All"],[612,612,"All"],[8242,8279,"All"],[8512,8512,"All"],[8592,8595,"All"],[8657,8674,"All"],[8709,8941,"All"],[8994,8995,"All"],[9251,9251,"All"],[9641,9641,"All"],[10812,10990,"All"]],8242:[565,-28,340,44,295],8463:[683,10,579,47,547],8709:[729,74,523,28,502],8726:[710,222,523,46,478],8730:[943,11,737,67,767]};f.FONTDATA.FONTS.STIXGeneral[8942][0]+=400;f.FONTDATA.FONTS.STIXGeneral[8945][0]+=500;f.FONTDATA.FONTS.STIXNonUnicode[57674][0]+=200;f.FONTDATA.FONTS.STIXNonUnicode[57674][1]+=200;f.FONTDATA.FONTS.STIXNonUnicode[57675][0]+=200;f.FONTDATA.FONTS.STIXNonUnicode[57675][1]+=200;MathJax.Hub.Browser.Select({MSIE:function(n){if(!n.versionAtLeast("8.0")||document.documentMode<8){var o=f.FONTDATA;o.REMAP[713]=175;o.REMAP[714]=180;o.REMAP[715]=96;o.REMAP[730]=176;o.RANGES[5]=o.RANGES[4];o.RANGES[4]=o.RANGES[3];o.RANGES[3]={name:"greek",low:945,high:1014,offset:"GG",remap:{1013:26,977:27,1008:28,981:29,1009:30,982:31}};o.VARIANT.bold.offsetGG=120514;o.VARIANT.bold.offsetG=120488;o.VARIANT.italic.offsetGG=120572;o.VARIANT.italic.offsetG=120546;o.VARIANT["bold-italic"].offsetGG=120630;o.VARIANT["bold-italic"].offsetG=120604}}});if(f.Font.testFont({family:"STIXSizeOneSym",testString:String.fromCharCode(710)})){MathJax.Ajax.loadComplete(f.fontDir+"/fontdata.js")}else{MathJax.Callback.Queue(["Require",MathJax.Ajax,f.fontDir+"/fontdata-beta.js"],["loadComplete",MathJax.Ajax,f.fontDir+"/fontdata.js"])}})(MathJax.OutputJax["HTML-CSS"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Arrows.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Arrows.js
new file mode 100644
index 0000000..81c39cc
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Arrows.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Arrows.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_AMS,{8592:[438,-63,500,64,422],8594:[438,-63,500,57,417],8602:[437,-60,1000,56,942],8603:[437,-60,1000,54,942],8606:[417,-83,1000,56,944],8608:[417,-83,1000,55,943],8610:[417,-83,1111,56,1031],8611:[417,-83,1111,79,1054],8619:[575,42,1000,56,964],8620:[575,42,1000,35,943],8621:[417,-83,1389,57,1331],8622:[437,-60,1000,56,942],8624:[722,0,500,56,444],8625:[722,0,500,55,443],8630:[462,1,1000,17,950],8631:[460,1,1000,46,982],8634:[650,83,778,55,722],8635:[650,83,778,56,721],8638:[694,194,417,188,375],8639:[694,194,417,41,228],8642:[694,194,417,188,375],8643:[694,194,417,41,228],8644:[667,0,1000,55,944],8646:[667,0,1000,55,944],8647:[583,83,1000,55,944],8648:[694,194,833,83,749],8649:[583,83,1000,55,944],8650:[694,194,833,83,749],8651:[514,14,1000,55,944],8652:[514,14,1000,55,944],8653:[534,35,1000,54,942],8654:[534,37,1000,32,965],8655:[534,35,1000,54,943],8666:[611,111,1000,76,944],8667:[611,111,1000,55,923],8669:[417,-83,1000,56,943],8672:[438,-63,1334,64,1252],8674:[438,-63,1334,83,1251]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/AMS/Regular/Arrows.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/BBBold.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/BBBold.js
new file mode 100644
index 0000000..560158f
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/BBBold.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/BBBold.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_AMS,{32:[0,0,250,0,0],65:[701,2,722,16,703],66:[683,1,667,11,620],67:[702,19,722,39,684],68:[683,1,722,16,688],69:[683,1,667,12,640],70:[683,1,611,12,585],71:[702,19,778,39,749],72:[683,1,778,14,762],73:[683,1,389,20,369],74:[683,77,500,6,478],75:[684,1,778,22,768],76:[683,1,667,12,640],77:[684,1,944,17,926],78:[684,20,722,20,702],79:[701,19,778,34,742],80:[683,1,611,16,597],81:[701,181,778,34,742],82:[683,1,722,16,705],83:[702,12,556,28,528],84:[683,1,667,33,635],85:[683,19,722,16,709],86:[684,20,722,0,719],87:[684,19,1000,5,994],88:[684,1,722,16,705],89:[683,1,722,16,704],90:[683,1,667,29,635],107:[684,2,556,17,535]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/AMS/Regular/BBBold.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/BoxDrawing.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/BoxDrawing.js
new file mode 100644
index 0000000..548aa6d
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/BoxDrawing.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/BoxDrawing.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_AMS,{9484:[694,-306,500,54,444],9488:[695,-306,500,55,444],9492:[367,23,500,54,444],9496:[366,22,500,55,445],9585:[694,195,889,0,860],9586:[694,195,889,0,860]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/AMS/Regular/BoxDrawing.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/CombDiacritMarks.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/CombDiacritMarks.js
new file mode 100644
index 0000000..0b127ec
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/CombDiacritMarks.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/CombDiacritMarks.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_AMS,{770:[845,-561,0,-2347,13],771:[899,-628,0,-2332,-3]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/AMS/Regular/CombDiacritMarks.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Dingbats.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Dingbats.js
new file mode 100644
index 0000000..bd72d85
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Dingbats.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Dingbats.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_AMS,{10003:[707,35,833,84,749],10016:[716,22,833,48,786]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/AMS/Regular/Dingbats.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/EnclosedAlphanum.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/EnclosedAlphanum.js
new file mode 100644
index 0000000..54f3cd0
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/EnclosedAlphanum.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/EnclosedAlphanum.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_AMS,{9416:[709,175,902,8,894]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/AMS/Regular/EnclosedAlphanum.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GeneralPunctuation.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GeneralPunctuation.js
new file mode 100644
index 0000000..69359bd
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GeneralPunctuation.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GeneralPunctuation.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_AMS,{8245:[560,-43,275,12,244]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/AMS/Regular/GeneralPunctuation.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GeometricShapes.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GeometricShapes.js
new file mode 100644
index 0000000..4b641a5
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GeometricShapes.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GeometricShapes.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_AMS,{9632:[689,0,778,55,722],9633:[689,0,778,55,722],9650:[575,20,722,84,637],9651:[575,20,722,84,637],9654:[539,41,778,83,694],9660:[576,20,722,84,638],9661:[576,20,722,84,638],9664:[539,41,778,83,694],9674:[716,132,667,56,612]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/AMS/Regular/GeometricShapes.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GreekAndCoptic.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GreekAndCoptic.js
new file mode 100644
index 0000000..32eb667
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GreekAndCoptic.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GreekAndCoptic.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_AMS,{989:[605,85,778,55,719],1008:[434,6,667,37,734]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/AMS/Regular/GreekAndCoptic.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Latin1Supplement.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Latin1Supplement.js
new file mode 100644
index 0000000..9919e56
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Latin1Supplement.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Latin1Supplement.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_AMS,{160:[0,0,250,0,0],165:[684,0,750,11,738],174:[709,175,947,32,915],240:[749,21,556,42,510]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/AMS/Regular/Latin1Supplement.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/LatinExtendedA.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/LatinExtendedA.js
new file mode 100644
index 0000000..3fc444d
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/LatinExtendedA.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/LatinExtendedA.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_AMS,{295:[695,13,540,42,562]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/AMS/Regular/LatinExtendedA.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/LetterlikeSymbols.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/LetterlikeSymbols.js
new file mode 100644
index 0000000..ce84c05
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/LetterlikeSymbols.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/LetterlikeSymbols.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_AMS,{8463:[695,13,540,42,562],8487:[685,22,722,44,675],8498:[695,1,556,55,497],8502:[763,21,667,-22,687],8503:[764,43,444,-22,422],8504:[764,43,667,54,640],8513:[706,23,639,37,577]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/AMS/Regular/LetterlikeSymbols.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Main.js
new file mode 100644
index 0000000..50c90a5
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_AMS={directory:"AMS/Regular",family:"MathJax_AMS",testString:"MATHJAX AMS",Ranges:[[0,127,"BBBold"],[128,255,"Latin1Supplement"],[256,383,"LatinExtendedA"],[688,767,"SpacingModLetters"],[768,879,"CombDiacritMarks"],[880,1023,"GreekAndCoptic"],[8192,8303,"GeneralPunctuation"],[8448,8527,"LetterlikeSymbols"],[8592,8703,"Arrows"],[8704,8959,"MathOperators"],[8960,9215,"MiscTechnical"],[9312,9471,"EnclosedAlphanum"],[9472,9599,"BoxDrawing"],[9632,9727,"GeometricShapes"],[9728,9983,"MiscSymbols"],[9984,10175,"Dingbats"],[10624,10751,"MiscMathSymbolsB"],[10752,11007,"SuppMathOperators"],[57344,63743,"PUA"]]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_AMS"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/AMS/Regular/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MathOperators.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MathOperators.js
new file mode 100644
index 0000000..276b8b1
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MathOperators.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MathOperators.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_AMS,{8705:[846,21,500,56,444],8708:[860,166,556,55,498],8709:[587,3,778,54,720],8717:[440,1,429,102,457],8722:[270,-230,500,83,417],8724:[766,94,778,56,722],8726:[430,23,778,91,685],8733:[472,-28,778,56,722],8736:[694,0,722,55,666],8737:[714,20,722,55,667],8738:[551,51,722,55,666],8739:[430,23,222,91,131],8740:[750,252,278,-21,297],8741:[431,23,389,55,331],8742:[750,250,500,-20,518],8756:[471,82,667,24,643],8757:[471,82,667,23,643],8764:[365,-132,778,55,719],8765:[367,-133,778,56,722],8769:[468,-32,778,55,719],8770:[463,-34,778,55,720],8774:[652,155,778,54,720],8776:[482,-50,778,54,719],8778:[579,39,778,51,725],8782:[492,-8,778,55,722],8783:[492,-133,778,55,722],8785:[609,108,778,55,722],8786:[601,101,778,15,762],8787:[601,102,778,14,762],8790:[367,-133,778,55,722],8791:[721,-133,778,55,722],8796:[859,-133,778,55,723],8806:[753,175,778,83,694],8807:[753,175,778,82,694],8808:[752,286,778,82,693],8809:[752,286,778,82,693],8812:[750,250,500,74,425],8814:[708,209,778,82,693],8815:[708,209,778,82,694],8816:[801,303,778,82,694],8817:[801,303,778,82,695],8818:[732,228,778,56,722],8819:[732,229,778,56,722],8822:[681,253,778,43,735],8823:[681,253,778,83,694],8828:[580,154,778,83,695],8829:[580,154,778,82,694],8830:[732,228,778,56,722],8831:[732,228,778,56,722],8832:[705,208,778,82,693],8833:[705,208,778,82,693],8840:[801,303,778,83,693],8841:[801,303,778,82,691],8842:[635,241,778,84,693],8843:[635,241,778,82,691],8847:[539,41,778,83,694],8848:[539,41,778,63,714],8858:[583,82,778,57,721],8859:[583,82,778,57,721],8861:[583,82,778,57,721],8862:[689,0,778,55,722],8863:[689,0,778,55,722],8864:[689,0,778,55,722],8865:[689,0,778,55,722],8872:[694,0,611,55,555],8873:[694,0,722,55,666],8874:[694,0,889,55,833],8876:[695,1,611,-55,555],8877:[695,1,611,-55,554],8878:[695,1,722,-55,665],8879:[695,1,722,-55,665],8882:[539,41,778,83,694],8883:[539,41,778,83,694],8884:[636,138,778,83,694],8885:[636,138,778,83,694],8888:[408,-92,1111,55,1055],8890:[431,213,556,56,500],8891:[716,0,611,54,555],8892:[716,1,611,55,555],8901:[189,0,278,55,222],8903:[545,44,778,55,720],8905:[492,-8,778,146,628],8906:[492,-8,778,146,628],8907:[695,22,778,55,722],8908:[694,23,778,54,722],8909:[464,-36,778,56,722],8910:[579,21,760,83,676],8911:[578,22,760,83,676],8912:[540,41,778,84,695],8913:[541,40,778,82,693],8914:[598,22,667,55,611],8915:[599,22,667,55,611],8916:[736,22,667,56,611],8918:[541,41,778,82,693],8919:[541,41,778,81,693],8920:[568,68,1333,56,1277],8921:[568,67,1333,55,1278],8922:[886,386,778,83,675],8923:[886,386,778,82,674],8926:[734,0,778,83,695],8927:[735,0,778,82,695],8928:[801,303,778,82,693],8929:[801,303,778,81,694],8934:[730,359,778,55,719],8935:[730,359,778,55,719],8936:[730,360,778,55,719],8937:[730,359,778,55,719],8938:[706,208,778,82,693],8939:[706,208,778,82,693],8940:[802,303,778,81,693],8941:[801,303,778,82,694]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/AMS/Regular/MathOperators.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscMathSymbolsB.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscMathSymbolsB.js
new file mode 100644
index 0000000..e781fb8
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscMathSymbolsB.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscMathSymbolsB.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_AMS,{10731:[716,132,667,56,612]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/AMS/Regular/MiscMathSymbolsB.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscSymbols.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscSymbols.js
new file mode 100644
index 0000000..7a63291
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscSymbols.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscSymbols.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_AMS,{9733:[695,111,944,49,896]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/AMS/Regular/MiscSymbols.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscTechnical.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscTechnical.js
new file mode 100644
index 0000000..d5fa92d
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscTechnical.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscTechnical.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_AMS,{8994:[378,-122,778,55,722],8995:[378,-143,778,55,722]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/AMS/Regular/MiscTechnical.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/PUA.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/PUA.js
new file mode 100644
index 0000000..067c299
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/PUA.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/PUA.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_AMS,{57350:[430,23,222,-20,240],57351:[431,24,389,-20,407],57352:[605,85,778,55,719],57353:[434,6,667,37,734],57356:[752,284,778,81,693],57357:[752,284,778,81,693],57358:[919,421,778,82,694],57359:[801,303,778,81,695],57360:[801,303,778,82,694],57361:[919,421,778,82,694],57366:[828,330,778,82,694],57367:[752,332,778,82,694],57368:[829,330,778,82,695],57369:[752,333,778,81,693],57370:[635,256,778,84,693],57371:[634,254,778,82,691]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/AMS/Regular/PUA.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/SpacingModLetters.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/SpacingModLetters.js
new file mode 100644
index 0000000..d633938
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/SpacingModLetters.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/SpacingModLetters.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_AMS,{710:[845,-561,2333,-14,2346],732:[899,-628,2333,1,2330]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/AMS/Regular/SpacingModLetters.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/SuppMathOperators.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/SuppMathOperators.js
new file mode 100644
index 0000000..6b260d2
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/SuppMathOperators.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/SuppMathOperators.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_AMS,{10846:[813,97,611,55,555],10877:[636,138,778,83,694],10878:[636,138,778,82,694],10885:[762,291,778,54,722],10886:[763,290,778,54,722],10887:[635,241,778,82,693],10888:[635,241,778,81,693],10889:[761,387,778,57,718],10890:[761,388,778,57,719],10891:[1003,463,778,83,695],10892:[1003,463,778,83,694],10901:[636,138,778,83,694],10902:[636,138,778,83,694],10933:[752,287,778,82,693],10934:[752,286,778,82,694],10935:[761,294,778,57,717],10936:[761,294,778,57,717],10937:[761,337,778,57,719],10938:[761,337,778,57,719],10949:[753,216,778,83,695],10950:[754,215,778,82,694],10955:[783,385,778,82,693],10956:[783,385,778,82,693]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/AMS/Regular/SuppMathOperators.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Caligraphic/Bold/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Caligraphic/Bold/Main.js
new file mode 100644
index 0000000..2ec138c
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Caligraphic/Bold/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Caligraphic/Bold/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Caligraphic-bold"]={directory:"Caligraphic/Bold",family:"MathJax_Caligraphic",weight:"bold",testString:"MATHJAX CALIGRAPHIC",skew:{65:0.224,66:0.16,67:0.16,68:0.0958,69:0.128,70:0.128,71:0.128,72:0.128,73:0.0319,74:0.192,75:0.0639,76:0.16,77:0.16,78:0.0958,79:0.128,80:0.0958,81:0.128,82:0.0958,83:0.16,84:0.0319,85:0.0958,86:0.0319,87:0.0958,88:0.16,89:0.0958,90:0.16},32:[0,0,250,0,0],48:[460,17,575,46,528],49:[462,0,575,80,495],50:[460,1,575,51,518],51:[462,211,575,48,525],52:[469,194,575,31,543],53:[461,211,575,57,517],54:[660,17,575,48,526],55:[477,211,575,64,559],56:[661,17,575,48,526],57:[461,210,575,48,526],65:[752,49,921,39,989],66:[705,18,748,40,740],67:[703,20,613,20,599],68:[687,0,892,19,885],69:[703,16,607,37,627],70:[686,30,814,17,930],71:[703,114,682,50,671],72:[686,49,987,19,946],73:[686,0,642,-27,746],74:[687,114,779,53,937],75:[703,18,871,40,834],76:[703,17,788,40,751],77:[703,49,1378,38,1353],78:[841,49,937,-24,1105],79:[704,17,906,63,882],80:[687,67,810,20,846],81:[703,147,939,120,905],82:[687,18,990,20,981],83:[704,16,696,25,722],84:[720,69,644,38,947],85:[687,24,715,-11,771],86:[686,77,737,25,774],87:[686,77,1169,25,1206],88:[687,-1,817,56,906],89:[686,164,759,36,797],90:[687,1,818,46,853],160:[0,0,250,0,0]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_Caligraphic-bold"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/Caligraphic/Bold/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Caligraphic/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Caligraphic/Regular/Main.js
new file mode 100644
index 0000000..d41d743
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Caligraphic/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Caligraphic/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_Caligraphic={directory:"Caligraphic/Regular",family:"MathJax_Caligraphic",testString:"MATHJAX CALIGRAPHIC",skew:{65:0.194,66:0.139,67:0.139,68:0.0833,69:0.111,70:0.111,71:0.111,72:0.111,73:0.0278,74:0.167,75:0.0556,76:0.139,77:0.139,78:0.0833,79:0.111,80:0.0833,81:0.111,82:0.0833,83:0.139,84:0.0278,85:0.0833,86:0.0278,87:0.0833,88:0.139,89:0.0833,90:0.139},32:[0,0,250,0,0],48:[452,22,500,39,460],49:[454,0,500,86,426],50:[453,0,500,44,449],51:[452,216,500,41,456],52:[464,194,500,27,471],53:[453,217,500,50,448],54:[666,22,500,42,456],55:[463,216,500,54,485],56:[666,21,500,43,457],57:[453,216,500,42,457],65:[728,50,798,30,819],66:[705,22,657,31,664],67:[705,25,527,12,533],68:[684,1,771,19,767],69:[706,22,528,30,565],70:[683,32,719,18,829],71:[704,119,595,43,599],72:[683,48,845,18,803],73:[683,1,545,-31,642],74:[683,119,678,47,839],75:[705,23,762,32,733],76:[706,22,690,32,656],77:[705,50,1201,28,1137],78:[790,50,820,-27,979],79:[705,22,796,58,777],80:[684,57,696,19,733],81:[706,131,817,114,787],82:[683,22,848,19,837],83:[705,23,606,17,642],84:[717,69,545,34,834],85:[684,28,626,-17,687],86:[683,52,613,25,658],87:[683,53,988,25,1034],88:[684,1,713,52,807],89:[683,143,668,31,714],90:[683,0,725,37,767],160:[0,0,250,0,0]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_Caligraphic"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/Caligraphic/Regular/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/BasicLatin.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/BasicLatin.js
new file mode 100644
index 0000000..da547b0
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/BasicLatin.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/BasicLatin.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Fraktur-bold"],{32:[0,0,250,0,0],33:[689,12,349,107,241],34:[695,-432,254,10,232],38:[696,16,871,44,839],39:[695,-436,250,80,158],40:[737,186,459,134,347],41:[735,187,459,105,326],42:[692,-449,328,40,277],43:[598,82,893,56,837],44:[107,191,328,118,253],45:[275,-236,893,54,833],46:[102,15,328,103,237],47:[721,182,593,41,550],48:[501,12,593,42,533],49:[489,0,593,54,548],50:[491,-2,593,44,563],51:[488,193,593,31,523],52:[495,196,593,13,565],53:[481,190,593,19,518],54:[704,12,593,48,547],55:[479,197,593,54,591],56:[714,5,593,45,542],57:[487,195,593,29,549],58:[457,12,255,57,197],59:[458,190,255,56,211],61:[343,-168,582,22,559],63:[698,14,428,39,422],65:[686,31,847,28,827],66:[684,31,1044,57,965],67:[676,32,723,72,726],68:[684,29,982,31,896],69:[686,29,783,74,728],70:[684,147,722,17,727],71:[687,29,927,74,844],72:[684,126,851,6,752],73:[681,25,655,32,623],74:[681,141,652,-8,617],75:[682,26,789,20,806],76:[683,28,786,30,764],77:[684,33,1239,26,1232],78:[679,30,983,26,973],79:[726,30,976,12,881],80:[688,223,977,32,943],81:[726,83,976,12,918],82:[688,28,978,31,978],83:[685,31,978,82,905],84:[686,30,790,31,802],85:[688,39,851,18,871],86:[685,29,982,24,966],87:[683,30,1235,25,1240],88:[681,35,849,32,835],89:[688,214,984,33,878],90:[677,148,711,-4,624],91:[740,130,257,36,226],93:[738,132,257,14,208],94:[734,-452,590,1,584],97:[472,32,603,79,586],98:[690,32,590,85,504],99:[473,26,464,87,424],100:[632,28,589,-1,511],101:[471,27,472,81,428],102:[687,222,388,35,372],103:[472,208,595,17,541],104:[687,207,615,89,507],105:[686,25,331,3,327],106:[682,203,332,-19,238],107:[682,25,464,34,432],108:[681,24,337,100,312],109:[477,31,921,16,900],110:[474,28,654,5,608],111:[482,34,609,107,515],112:[558,207,604,-1,520],113:[485,211,596,87,515],114:[472,26,460,13,453],115:[479,34,523,-23,482],116:[648,27,393,43,407],117:[472,32,589,9,603],118:[546,27,604,56,507],119:[549,32,918,55,815],120:[471,188,459,8,441],121:[557,221,589,60,512],122:[471,214,461,-7,378]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Fraktur/Bold/BasicLatin.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/Main.js
new file mode 100644
index 0000000..5b67baa
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Fraktur-bold"]={directory:"Fraktur/Bold",family:"MathJax_Fraktur",weight:"bold",testString:"MathJax Fraktur",Ranges:[[0,127,"BasicLatin"],[128,57343,"Other"],[58112,58128,"PUA"]]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_Fraktur-bold"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/Fraktur/Bold/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/Other.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/Other.js
new file mode 100644
index 0000000..7e5a3dc
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/Other.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/Other.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Fraktur-bold"],{160:[0,0,250,0,0],8216:[708,-411,254,53,187],8217:[692,-394,254,58,193]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Fraktur/Bold/Other.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/PUA.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/PUA.js
new file mode 100644
index 0000000..9430cc2
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/PUA.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/PUA.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Fraktur-bold"],{58113:[630,27,587,64,512],58114:[693,212,394,37,408],58115:[681,219,387,36,384],58116:[473,212,593,67,531],58117:[684,27,393,33,387],58120:[679,220,981,32,875],58121:[717,137,727,17,633]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Fraktur/Bold/PUA.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/BasicLatin.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/BasicLatin.js
new file mode 100644
index 0000000..3d5f066
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/BasicLatin.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/BasicLatin.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_Fraktur,{32:[0,0,250,0,0],33:[689,12,296,91,204],34:[695,-432,215,8,196],38:[698,11,738,49,733],39:[695,-436,212,69,134],40:[737,186,389,114,293],41:[735,187,389,89,276],42:[693,-449,278,33,234],43:[598,82,756,47,709],44:[107,191,278,99,213],45:[275,-236,756,46,706],46:[102,15,278,87,200],47:[721,182,502,34,466],48:[492,13,502,42,456],49:[468,2,502,47,460],50:[474,-1,502,60,484],51:[473,182,502,39,429],52:[476,191,502,10,481],53:[458,185,502,47,440],54:[700,13,502,45,471],55:[468,181,502,37,498],56:[705,10,502,40,461],57:[469,182,502,28,466],58:[457,12,216,50,168],59:[458,189,216,47,179],61:[368,-132,756,54,725],63:[693,11,362,46,357],65:[696,26,718,22,708],66:[691,28,884,48,821],67:[685,24,613,59,607],68:[685,27,832,27,745],69:[685,24,663,86,634],70:[686,154,611,11,612],71:[690,26,785,66,711],72:[666,133,720,1,645],73:[686,26,554,30,532],74:[686,139,552,-11,522],75:[681,27,668,17,682],76:[686,26,666,33,644],77:[692,28,1050,27,1048],78:[686,25,832,27,825],79:[729,27,827,12,744],80:[692,218,828,28,804],81:[729,69,827,11,783],82:[686,26,828,27,824],83:[692,27,829,65,756],84:[701,27,669,34,677],85:[697,27,646,-25,665],86:[686,26,831,26,825],87:[686,27,1046,32,1055],88:[688,27,719,28,709],89:[686,218,833,27,741],90:[729,139,602,11,532],91:[740,130,278,117,278],93:[738,131,278,-4,160],94:[734,-452,500,0,495],97:[470,35,500,66,497],98:[685,31,513,87,442],99:[466,29,389,72,359],100:[609,33,499,13,428],101:[467,30,401,70,364],102:[681,221,326,30,323],103:[470,209,504,17,455],104:[689,205,521,77,434],105:[673,20,279,14,267],106:[672,208,281,-9,196],107:[689,25,389,24,362],108:[685,20,280,98,276],109:[476,26,767,8,753],110:[475,22,527,20,514],111:[480,28,489,67,412],112:[541,212,500,12,430],113:[479,219,489,60,419],114:[474,21,389,17,387],115:[478,29,443,-18,406],116:[640,20,333,27,348],117:[474,24,517,9,513],118:[531,28,512,55,435],119:[532,28,774,45,688],120:[472,188,389,10,363],121:[528,218,499,45,431],122:[471,214,391,-7,314]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Fraktur/Regular/BasicLatin.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/Main.js
new file mode 100644
index 0000000..8a5ae64
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_Fraktur={directory:"Fraktur/Regular",family:"MathJax_Fraktur",testString:"MathJax Fraktur",Ranges:[[0,127,"BasicLatin"],[128,57343,"Other"],[58112,58128,"PUA"]]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_Fraktur"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/Fraktur/Regular/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/Other.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/Other.js
new file mode 100644
index 0000000..55e0a28
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/Other.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/Other.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_Fraktur,{160:[0,0,250,0,0],8216:[708,-410,215,45,158],8217:[692,-395,215,49,163]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Fraktur/Regular/Other.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/PUA.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/PUA.js
new file mode 100644
index 0000000..10281ae
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/PUA.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/PUA.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_Fraktur,{58112:[683,32,497,75,430],58113:[616,30,498,35,432],58114:[680,215,333,29,339],58115:[679,224,329,28,318],58116:[471,214,503,52,449],58117:[686,20,333,26,315],58118:[577,22,334,29,347],58119:[475,22,501,10,514]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Fraktur/Regular/PUA.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/Bold/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/Bold/Main.js
new file mode 100644
index 0000000..444139f
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/Bold/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/Bold/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Greek-bold"]={directory:"Greek/Bold",family:"MathJax_Greek",weight:"bold",testString:String.fromCharCode(915)+" "+String.fromCharCode(933)+" "+String.fromCharCode(923),32:[0,0,250,0,0],160:[0,0,250,0,0],915:[680,0,692,39,643],916:[698,0,958,56,901],920:[696,10,894,64,829],923:[698,0,806,40,765],926:[675,0,767,48,718],928:[680,0,900,39,860],931:[686,0,831,64,766],933:[697,0,894,64,829],934:[686,0,831,64,766],936:[686,0,894,64,829],937:[696,1,831,51,779]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_Greek-bold"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/Greek/Bold/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/BoldItalic/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/BoldItalic/Main.js
new file mode 100644
index 0000000..fad826e
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/BoldItalic/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/BoldItalic/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Greek-bold-italic"]={directory:"Greek/BoldItalic",family:"MathJax_Greek",weight:"bold",style:"italic",testString:String.fromCharCode(915)+" "+String.fromCharCode(933)+" "+String.fromCharCode(923),skew:{915:0.0958,916:0.192,920:0.0958,923:0.192,926:0.0958,928:0.0639,931:0.0958,933:0.0639,934:0.0958,936:0.0639,937:0.0958,945:0.0319,946:0.0958,948:0.0639,949:0.0958,950:0.0958,951:0.0639,952:0.0958,953:0.0639,956:0.0319,957:0.0319,958:0.128,959:0.0639,961:0.0958,962:0.0958,964:0.0319,965:0.0319,966:0.0958,967:0.0639,968:0.128,977:0.0958,981:0.0958,1009:0.0958,1013:0.0639},32:[0,0,250,0,0],160:[0,0,250,0,0],915:[680,0,657,43,777],916:[711,0,958,59,904],920:[702,17,867,54,844],923:[711,0,806,44,776],926:[675,0,841,62,867],928:[680,0,982,43,1026],931:[686,0,885,69,902],933:[703,0,671,32,802],934:[686,0,767,29,737],936:[686,0,714,22,790],937:[703,0,879,93,886],945:[452,8,761,39,712],946:[701,194,660,28,637],947:[451,211,590,5,617],948:[725,8,522,39,513],949:[461,17,529,36,481],950:[711,202,508,48,521],951:[452,211,600,24,600],952:[702,8,562,40,554],953:[452,8,412,38,386],954:[452,8,668,45,642],955:[694,13,671,40,652],956:[452,211,708,33,682],957:[452,2,577,38,608],958:[711,201,508,23,490],959:[452,8,585,39,576],960:[444,8,682,23,674],961:[451,211,612,34,603],962:[451,105,424,33,457],963:[444,8,686,35,677],964:[444,13,521,23,610],965:[453,8,631,24,604],966:[452,216,747,53,703],967:[452,201,718,32,685],968:[694,202,758,24,732],969:[453,8,718,24,691],977:[701,8,692,24,656],981:[694,202,712,51,693],982:[444,8,975,23,961],1009:[451,194,612,75,603],1013:[444,7,483,44,450]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_Greek-bold-italic"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/Greek/BoldItalic/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/Italic/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/Italic/Main.js
new file mode 100644
index 0000000..32de379
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/Italic/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/Italic/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Greek-italic"]={directory:"Greek/Italic",family:"MathJax_Greek",style:"italic",testString:String.fromCharCode(915)+" "+String.fromCharCode(933)+" "+String.fromCharCode(923),skew:{915:0.0833,916:0.167,920:0.0833,923:0.167,926:0.0833,928:0.0556,931:0.0833,933:0.0556,934:0.0833,936:0.0556,937:0.0833,945:0.0278,946:0.0833,948:0.0556,949:0.0833,950:0.0833,951:0.0556,952:0.0833,953:0.0556,956:0.0278,957:0.0278,958:0.111,959:0.0556,961:0.0833,962:0.0833,964:0.0278,965:0.0278,966:0.0833,967:0.0556,968:0.111,977:0.0833,981:0.0833,1009:0.0833,1013:0.0556},32:[0,0,250,0,0],160:[0,0,250,0,0],915:[680,-1,615,31,721],916:[716,0,833,48,788],920:[704,22,763,50,740],923:[716,0,694,35,670],926:[678,0,742,53,777],928:[681,0,831,31,887],931:[683,0,780,58,806],933:[705,0,583,28,700],934:[683,0,667,24,642],936:[683,0,612,21,692],937:[704,0,772,80,786],945:[442,11,640,34,603],946:[705,194,566,23,573],947:[441,216,518,11,543],948:[717,10,444,36,451],949:[452,22,466,27,428],950:[704,204,438,44,471],951:[442,216,497,21,503],952:[705,10,469,35,462],953:[442,10,354,48,332],954:[442,11,576,49,554],955:[694,12,583,47,556],956:[442,216,603,23,580],957:[442,2,494,45,530],958:[704,205,438,21,443],959:[441,11,485,34,476],960:[431,11,570,19,573],961:[442,216,517,23,510],962:[442,107,363,31,405],963:[431,11,571,31,572],964:[431,13,437,18,517],965:[443,10,540,21,523],966:[442,218,654,50,618],967:[442,204,626,25,600],968:[694,205,651,21,634],969:[443,11,622,15,604],977:[705,11,591,21,563],981:[694,205,596,43,579],982:[431,10,828,19,823],1009:[442,194,517,67,510],1013:[431,11,406,40,382]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_Greek-italic"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/Greek/Italic/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/Regular/Main.js
new file mode 100644
index 0000000..957aae8
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_Greek={directory:"Greek/Regular",family:"MathJax_Greek",testString:String.fromCharCode(915)+" "+String.fromCharCode(933)+" "+String.fromCharCode(923),32:[0,0,250,0,0],160:[0,0,250,0,0],915:[680,0,625,25,582],916:[716,0,833,46,786],920:[705,22,778,56,722],923:[716,0,694,32,661],926:[677,0,667,42,624],928:[680,0,750,25,724],931:[683,0,722,55,666],933:[705,0,778,55,722],934:[683,0,722,56,665],936:[683,0,778,55,722],937:[704,0,722,44,677]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_Greek"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/Greek/Regular/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/Arrows.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/Arrows.js
new file mode 100644
index 0000000..9413a57
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/Arrows.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/Arrows.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Main-bold"],{8592:[519,18,1150,64,1085],8593:[694,193,575,13,562],8594:[519,18,1150,65,1085],8595:[694,194,575,13,562],8596:[519,18,1150,64,1085],8597:[767,267,575,13,562],8598:[724,195,1150,64,1084],8599:[724,193,1150,64,1086],8600:[695,224,1150,65,1085],8601:[694,224,1150,64,1085],8614:[519,18,1150,65,1085],8617:[519,18,1282,64,1219],8618:[519,18,1282,65,1217],8636:[518,-220,1150,64,1084],8637:[281,17,1150,64,1084],8640:[518,-220,1150,65,1085],8641:[281,17,1150,64,1085],8652:[718,17,1150,64,1085],8656:[548,46,1150,63,1085],8657:[694,194,703,29,672],8658:[548,47,1150,64,1084],8659:[694,194,703,30,673],8660:[548,46,1150,47,1102],8661:[768,267,703,29,673]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Bold/Arrows.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/CombDiacritMarks.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/CombDiacritMarks.js
new file mode 100644
index 0000000..e46f642
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/CombDiacritMarks.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/CombDiacritMarks.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Main-bold"],{768:[706,-503,0,-461,-237],769:[706,-503,0,-339,-115],770:[694,-520,0,-449,-127],771:[694,-551,0,-479,-97],772:[607,-540,0,-495,-81],774:[694,-500,0,-473,-103],775:[695,-525,0,-373,-203],776:[695,-535,0,-479,-97],778:[703,-536,0,-415,-161],779:[714,-511,0,-442,-82],780:[660,-515,0,-445,-131],824:[711,210,0,-734,-161]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Bold/CombDiacritMarks.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/CombDiactForSymbols.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/CombDiactForSymbols.js
new file mode 100644
index 0000000..528a74d
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/CombDiactForSymbols.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/CombDiactForSymbols.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Main-bold"],{8407:[723,-513,0,-542,-33]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Bold/CombDiactForSymbols.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/GeneralPunctuation.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/GeneralPunctuation.js
new file mode 100644
index 0000000..9db5be7
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/GeneralPunctuation.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/GeneralPunctuation.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Main-bold"],{8194:[0,0,500,0,0],8195:[0,0,999,0,0],8196:[0,0,333,0,0],8197:[0,0,250,0,0],8198:[0,0,167,0,0],8201:[0,0,167,0,0],8202:[0,0,83,0,0],8211:[300,-249,575,0,574],8212:[300,-249,1150,0,1149],8216:[694,-329,319,58,245],8217:[694,-329,319,74,261],8220:[694,-329,603,110,564],8221:[694,-329,603,38,492],8224:[702,211,511,64,446],8225:[702,203,511,64,446],8230:[171,-1,1295,74,1221],8242:[563,-33,344,35,332]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Bold/GeneralPunctuation.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/GeometricShapes.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/GeometricShapes.js
new file mode 100644
index 0000000..9dc64c8
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/GeometricShapes.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/GeometricShapes.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Main-bold"],{9651:[711,-1,1022,68,953],9657:[541,39,575,33,542],9661:[500,210,1022,68,953],9667:[539,39,575,33,542],9711:[711,211,1150,65,1084]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Bold/GeometricShapes.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/Latin1Supplement.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/Latin1Supplement.js
new file mode 100644
index 0000000..be4d31c
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/Latin1Supplement.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/Latin1Supplement.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Main-bold"],{160:[0,0,250,0,0],168:[695,-535,575,96,478],172:[371,-61,767,64,703],175:[607,-540,575,80,494],176:[703,-536,575,160,414],177:[728,35,894,64,829],180:[706,-503,575,236,460],215:[531,29,894,167,727],247:[597,96,894,64,828]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Bold/Latin1Supplement.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/LatinExtendedA.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/LatinExtendedA.js
new file mode 100644
index 0000000..420b20a
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/LatinExtendedA.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/LatinExtendedA.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Main-bold"],{305:[453,8,394,24,367]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Bold/LatinExtendedA.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/LatinExtendedB.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/LatinExtendedB.js
new file mode 100644
index 0000000..b219d60
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/LatinExtendedB.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/LatinExtendedB.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Main-bold"],{567:[451,201,439,-12,420]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Bold/LatinExtendedB.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/LetterlikeSymbols.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/LetterlikeSymbols.js
new file mode 100644
index 0000000..3b38fb3
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/LetterlikeSymbols.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/LetterlikeSymbols.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Main-bold"],{8463:[694,8,668,45,642],8465:[702,9,831,64,798],8467:[702,19,474,-1,447],8472:[462,211,740,72,727],8476:[711,17,831,41,824],8501:[694,1,703,64,639]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Bold/LetterlikeSymbols.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/Main.js
new file mode 100644
index 0000000..16e585d
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Main-bold"]={directory:"Main/Bold",family:"MathJax_Main",weight:"bold",testString:"MathJax Main",skew:{305:0.0319,567:0.0958,8463:-0.0319,8467:0.128,8706:0.0958},Ranges:[[160,255,"Latin1Supplement"],[256,383,"LatinExtendedA"],[384,591,"LatinExtendedB"],[688,767,"SpacingModLetters"],[768,879,"CombDiacritMarks"],[8192,8303,"GeneralPunctuation"],[8400,8447,"CombDiactForSymbols"],[8448,8527,"LetterlikeSymbols"],[8592,8703,"Arrows"],[8704,8959,"MathOperators"],[8960,9215,"MiscTechnical"],[9632,9727,"GeometricShapes"],[9728,9983,"MiscSymbols"],[10176,10223,"MiscMathSymbolsA"],[10224,10239,"SupplementalArrowsA"],[10752,11007,"SuppMathOperators"]],32:[0,0,250,0,0],33:[705,-1,350,89,260],34:[694,-329,603,38,492],35:[694,193,958,64,893],36:[750,56,575,64,510],37:[750,56,958,65,893],38:[705,11,894,48,836],39:[694,-329,319,74,261],40:[751,250,447,103,382],41:[750,249,447,64,343],42:[750,-306,575,73,501],43:[633,131,894,64,829],44:[171,194,319,74,258],45:[278,-166,383,13,318],46:[171,-1,319,74,245],47:[750,250,575,63,511],48:[655,10,575,45,529],49:[655,0,575,80,494],50:[654,0,575,57,517],51:[655,12,575,47,526],52:[657,0,575,32,542],53:[655,11,575,57,517],54:[655,11,575,48,527],55:[676,11,575,64,559],56:[654,11,575,48,526],57:[654,11,575,48,526],58:[444,-1,319,74,245],59:[444,194,319,74,248],60:[587,85,894,96,797],61:[393,-109,894,64,829],62:[587,85,894,95,797],63:[700,-1,543,65,478],64:[700,6,894,64,829],65:[698,0,869,40,828],66:[687,0,818,39,753],67:[697,11,831,64,767],68:[687,0,882,39,817],69:[681,0,756,38,723],70:[680,0,724,39,675],71:[697,10,904,64,845],72:[686,0,900,39,860],73:[686,0,436,25,410],74:[686,11,594,8,527],75:[686,0,901,39,852],76:[686,0,692,39,643],77:[687,0,1092,39,1052],78:[687,1,900,39,861],79:[696,10,864,64,798],80:[686,0,786,39,721],81:[697,193,864,64,806],82:[687,11,862,39,858],83:[697,11,639,63,575],84:[675,0,800,41,758],85:[686,12,885,39,845],86:[686,7,869,25,843],87:[686,8,1189,24,1164],88:[686,0,869,33,835],89:[686,0,869,19,849],90:[687,0,703,64,645],91:[750,250,319,128,293],92:[750,250,575,63,511],93:[750,250,319,25,190],94:[694,-520,575,126,448],95:[-10,61,575,0,574],96:[706,-503,575,114,338],97:[453,6,559,32,558],98:[694,7,639,29,601],99:[453,6,511,39,478],100:[695,6,639,38,609],101:[453,6,527,32,494],102:[700,0,351,40,452],103:[455,201,575,30,558],104:[694,0,639,37,623],105:[695,0,319,40,294],106:[695,200,351,-71,274],107:[694,0,607,29,587],108:[694,0,319,40,301],109:[451,0,958,37,942],110:[450,0,639,37,623],111:[452,5,575,32,542],112:[450,194,639,28,600],113:[450,194,607,38,609],114:[450,0,474,29,442],115:[453,7,454,37,415],116:[636,6,447,21,382],117:[450,6,639,37,623],118:[444,4,607,26,580],119:[444,5,831,25,805],120:[444,0,607,21,586],121:[444,200,607,23,580],122:[445,0,511,31,462],123:[751,251,575,69,504],124:[750,249,319,129,190],125:[751,251,575,70,504],126:[344,-201,575,96,478],915:[680,0,692,39,643],916:[698,0,958,56,901],920:[696,10,894,64,829],923:[699,0,806,40,765],926:[675,0,767,48,718],928:[680,0,900,39,860],931:[686,0,831,63,766],933:[697,0,894,64,829],934:[686,0,831,64,766],936:[686,0,894,64,829],937:[696,1,831,51,780]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_Main-bold"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Bold/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MathOperators.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MathOperators.js
new file mode 100644
index 0000000..e036e7e
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MathOperators.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MathOperators.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Main-bold"],{8704:[694,16,639,0,640],8706:[710,17,628,60,657],8707:[694,-1,639,64,574],8709:[767,73,575,46,528],8711:[686,24,958,56,901],8712:[587,86,767,97,670],8713:[711,210,767,97,670],8715:[588,86,767,95,670],8722:[281,-221,894,96,797],8723:[537,227,894,64,829],8725:[750,250,575,63,511],8726:[750,250,575,63,511],8727:[472,-27,575,73,501],8728:[474,-28,575,64,510],8729:[474,-28,575,64,510],8730:[820,180,958,78,989],8733:[451,8,894,65,831],8734:[452,8,1150,65,1084],8736:[715,0,722,55,676],8739:[750,249,319,129,190],8741:[750,248,575,145,430],8743:[604,17,767,64,702],8744:[604,17,767,64,702],8745:[603,16,767,64,702],8746:[604,16,767,64,702],8747:[711,211,569,64,632],8764:[391,-109,894,64,828],8768:[583,82,319,64,254],8771:[502,3,894,64,829],8773:[638,27,1000,64,829],8776:[524,-32,894,64,829],8781:[533,32,894,64,829],8784:[721,-109,894,64,829],8800:[712,210,894,64,830],8801:[505,3,894,64,829],8804:[697,199,894,96,797],8805:[697,199,894,96,797],8810:[618,117,1150,64,1085],8811:[619,116,1150,64,1085],8826:[585,86,894,95,797],8827:[586,86,894,96,797],8834:[587,85,894,96,797],8835:[587,86,894,96,797],8838:[697,199,894,96,797],8839:[697,199,894,96,797],8846:[604,16,767,64,702],8849:[697,199,894,96,828],8850:[697,199,894,66,797],8851:[604,-1,767,70,696],8852:[604,-1,767,70,696],8853:[632,132,894,64,828],8854:[632,132,894,64,828],8855:[632,132,894,64,828],8856:[632,132,894,64,828],8857:[632,132,894,64,828],8866:[693,-1,703,65,637],8867:[693,-1,703,64,638],8868:[694,-1,894,64,829],8869:[693,-1,894,64,829],8872:[750,249,974,129,918],8900:[524,21,575,15,561],8901:[336,-166,319,74,245],8902:[502,1,575,24,551],8904:[541,39,1000,33,967],8942:[951,29,319,74,245],8943:[336,-166,1295,74,1221],8945:[871,-101,1323,129,1194]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Bold/MathOperators.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MiscMathSymbolsA.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MiscMathSymbolsA.js
new file mode 100644
index 0000000..2e788a7
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MiscMathSymbolsA.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MiscMathSymbolsA.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Main-bold"],{10216:[750,249,447,127,382],10217:[750,249,447,64,319]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Bold/MiscMathSymbolsA.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MiscSymbols.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MiscSymbols.js
new file mode 100644
index 0000000..b8253d5
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MiscSymbols.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MiscSymbols.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Main-bold"],{9824:[720,130,894,63,829],9825:[711,24,894,65,828],9826:[719,154,894,64,828],9827:[720,130,894,32,861],9837:[750,17,447,63,382],9838:[741,223,447,56,390],9839:[724,224,447,63,383]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Bold/MiscSymbols.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MiscTechnical.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MiscTechnical.js
new file mode 100644
index 0000000..592a023
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MiscTechnical.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MiscTechnical.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Main-bold"],{8968:[750,248,511,194,493],8969:[750,248,511,17,317],8970:[749,248,511,194,493],8971:[749,248,511,17,317],8994:[405,-108,1150,64,1084],8995:[393,-126,1150,64,1085]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Bold/MiscTechnical.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/SpacingModLetters.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/SpacingModLetters.js
new file mode 100644
index 0000000..df997cf
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/SpacingModLetters.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/SpacingModLetters.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Main-bold"],{710:[694,-520,575,126,448],711:[660,-515,575,130,444],713:[607,-540,575,80,494],714:[706,-503,575,236,460],715:[706,-503,575,114,338],728:[694,-500,575,102,472],729:[695,-525,575,202,372],730:[703,-536,575,160,414],732:[694,-551,575,96,478]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Bold/SpacingModLetters.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/SuppMathOperators.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/SuppMathOperators.js
new file mode 100644
index 0000000..22069ea
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/SuppMathOperators.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/SuppMathOperators.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Main-bold"],{10815:[687,1,900,38,861],10927:[696,199,894,96,797],10928:[698,199,894,96,797]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Bold/SuppMathOperators.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/SupplementalArrowsA.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/SupplementalArrowsA.js
new file mode 100644
index 0000000..95b5d98
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/SupplementalArrowsA.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/SupplementalArrowsA.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Main-bold"],{10229:[519,18,1805,64,1741],10230:[519,18,1833,96,1774],10231:[519,18,2126,64,2062],10232:[548,46,1868,64,1804],10233:[548,47,1870,63,1804],10234:[548,47,2126,64,2060],10236:[519,18,1833,65,1774]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Bold/SupplementalArrowsA.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/CombDiacritMarks.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/CombDiacritMarks.js
new file mode 100644
index 0000000..232431a
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/CombDiacritMarks.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/CombDiacritMarks.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Main-italic"],{768:[697,-500,0,-222,-74],769:[697,-500,0,-173,39],770:[694,-527,0,-251,17],771:[668,-558,0,-265,60],772:[590,-544,0,-282,54],774:[695,-515,0,-237,62],775:[669,-548,0,-165,-41],776:[669,-554,0,-251,45],778:[716,-542,0,-199,3],779:[697,-503,0,-248,65],780:[638,-501,0,-236,29]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Italic/CombDiacritMarks.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/GeneralPunctuation.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/GeneralPunctuation.js
new file mode 100644
index 0000000..4c654ac
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/GeneralPunctuation.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/GeneralPunctuation.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Main-italic"],{8211:[286,-248,511,91,554],8212:[285,-248,1022,117,1038],8216:[694,-379,307,197,362],8217:[694,-379,307,213,377],8220:[694,-378,514,243,606],8221:[694,-379,514,176,538]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Italic/GeneralPunctuation.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/Latin1Supplement.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/Latin1Supplement.js
new file mode 100644
index 0000000..8e6faa5
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/Latin1Supplement.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/Latin1Supplement.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Main-italic"],{160:[0,0,250,0,0]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Italic/Latin1Supplement.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/LetterlikeSymbols.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/LetterlikeSymbols.js
new file mode 100644
index 0000000..a7a4ef1
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/LetterlikeSymbols.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/LetterlikeSymbols.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Main-italic"],{8463:[695,13,540,42,562]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Italic/LetterlikeSymbols.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/Main.js
new file mode 100644
index 0000000..ac283ba
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Main-italic"]={directory:"Main/Italic",family:"MathJax_Main",style:"italic",testString:"MathJax Main",Ranges:[[160,255,"Latin1Supplement"],[768,879,"CombDiacritMarks"],[8192,8303,"GeneralPunctuation"],[8448,8527,"LetterlikeSymbols"]],32:[0,0,250,0,0],33:[716,0,307,107,380],34:[694,-379,514,176,538],35:[694,194,818,115,828],37:[751,56,818,144,848],38:[716,22,767,127,802],39:[694,-379,307,213,377],40:[750,250,409,144,517],41:[750,250,409,17,390],42:[751,-320,511,195,584],43:[558,57,767,139,753],44:[121,194,307,69,233],45:[251,-179,358,84,341],46:[121,0,307,107,231],47:[750,250,511,19,617],48:[665,21,511,110,562],49:[666,0,511,110,468],50:[666,22,511,76,551],51:[667,22,511,96,563],52:[666,194,511,46,479],53:[666,22,511,106,567],54:[665,22,511,120,566],55:[666,22,511,136,634],56:[666,21,511,99,553],57:[666,22,511,107,553],58:[431,0,307,107,308],59:[431,194,307,70,308],61:[367,-133,767,116,776],63:[717,0,511,195,551],64:[705,11,767,152,789],65:[716,1,743,58,696],66:[683,1,704,57,732],67:[705,21,716,150,812],68:[683,1,755,56,775],69:[681,0,678,54,743],70:[681,0,653,54,731],71:[705,22,774,149,812],72:[683,0,743,54,860],73:[683,0,386,49,508],74:[683,21,525,78,622],75:[683,0,769,54,859],76:[683,0,627,54,628],77:[684,0,897,58,1010],78:[684,0,743,54,860],79:[704,22,767,149,788],80:[684,0,678,55,729],81:[704,194,767,149,788],82:[683,22,729,55,723],83:[706,22,562,74,634],84:[678,0,716,171,807],85:[684,22,743,194,860],86:[683,22,743,205,868],87:[683,22,999,205,1124],88:[684,0,743,50,826],89:[684,0,743,198,875],90:[683,1,613,80,705],91:[751,251,307,73,446],93:[751,251,307,-14,359],94:[694,-527,511,260,528],95:[-24,62,511,91,554],97:[442,11,511,101,543],98:[694,11,460,108,467],99:[441,10,460,103,470],100:[694,11,511,100,567],101:[442,10,460,107,470],102:[705,204,307,-23,450],103:[442,205,460,46,495],104:[695,11,511,69,544],105:[656,10,307,75,340],106:[656,204,307,-32,364],107:[694,11,460,69,499],108:[694,11,256,87,312],109:[443,11,818,75,851],110:[443,11,562,75,595],111:[442,11,511,103,517],112:[442,194,511,5,518],113:[442,195,460,100,504],114:[442,11,422,75,484],115:[442,11,409,76,418],116:[627,11,332,87,373],117:[441,11,537,75,570],118:[443,10,460,75,492],119:[443,12,664,74,696],120:[442,11,464,58,513],121:[441,206,486,75,522],122:[442,11,409,54,466],126:[318,-208,511,246,571],163:[714,11,769,87,699],305:[441,10,307,75,340],567:[442,205,332,-32,327],915:[680,0,627,54,706],916:[717,1,818,70,751],920:[704,22,767,149,788],923:[717,0,692,58,646],926:[678,1,664,74,754],928:[680,0,743,54,859],931:[683,1,716,80,782],933:[706,0,767,213,833],934:[683,1,716,158,728],936:[683,0,767,207,824],937:[705,0,716,100,759]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_Main-italic"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Italic/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/CombDiacritMarks.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/CombDiacritMarks.js
new file mode 100644
index 0000000..69bde5f
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/CombDiacritMarks.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/CombDiacritMarks.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_Main,{768:[699,-505,0,-394,-205],769:[699,-505,0,-297,-107],770:[694,-531,0,-388,-113],771:[668,-565,0,-417,-84],772:[590,-544,0,-431,-70],774:[694,-515,0,-408,-93],775:[669,-549,0,-310,-191],776:[669,-554,0,-405,-96],778:[715,-542,0,-353,-148],779:[701,-510,0,-378,-80],780:[644,-513,0,-386,-115],824:[716,215,0,-639,-140]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Regular/CombDiacritMarks.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/GeometricShapes.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/GeometricShapes.js
new file mode 100644
index 0000000..129fb9d
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/GeometricShapes.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/GeometricShapes.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_Main,{9651:[716,0,889,59,828],9657:[505,5,500,26,474],9661:[500,215,889,59,828],9667:[505,5,500,26,473],9711:[715,215,1000,56,944]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Regular/GeometricShapes.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/Main.js
new file mode 100644
index 0000000..9668542
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_Main={directory:"Main/Regular",family:"MathJax_Main",testString:"MathJax Main",skew:{305:0.0278,567:0.0833,8467:0.111,8472:0.111,8706:0.0833},Ranges:[[688,767,"SpacingModLetters"],[768,879,"CombDiacritMarks"],[9632,9727,"GeometricShapes"],[9728,9983,"MiscSymbols"]],32:[0,0,250,0,0],33:[716,-1,278,78,199],34:[694,-379,500,34,372],35:[694,194,833,55,778],36:[750,56,500,54,444],37:[750,56,833,56,776],38:[717,22,778,42,727],39:[694,-379,278,78,212],40:[751,251,389,94,333],41:[750,250,389,55,294],42:[750,-319,500,64,435],43:[583,83,778,55,722],44:[121,194,278,78,210],45:[252,-179,333,11,277],46:[120,0,278,78,199],47:[751,250,500,56,445],48:[666,22,500,39,460],49:[666,0,500,83,427],50:[666,1,500,49,449],51:[665,23,500,41,457],52:[677,0,500,28,471],53:[666,22,500,49,449],54:[666,22,500,42,456],55:[676,22,500,55,485],56:[666,22,500,43,457],57:[666,22,500,41,456],58:[430,0,278,78,199],59:[430,194,278,78,202],60:[540,40,778,83,694],61:[367,-133,778,55,722],62:[540,40,778,82,694],63:[706,-1,472,55,416],64:[705,11,778,56,722],65:[717,0,750,32,717],66:[684,0,708,28,651],67:[706,21,722,56,666],68:[683,0,764,27,708],69:[680,0,681,24,652],70:[680,0,653,25,611],71:[706,22,785,56,735],72:[683,0,750,25,724],73:[683,0,361,21,339],74:[683,22,514,25,465],75:[683,0,778,24,736],76:[683,0,625,25,582],77:[683,0,917,29,887],78:[683,0,750,25,724],79:[705,22,778,56,722],80:[684,0,681,27,624],81:[705,193,778,56,728],82:[684,22,736,27,732],83:[706,23,556,55,500],84:[677,0,722,36,685],85:[684,22,750,25,724],86:[683,23,750,19,730],87:[683,23,1028,18,1009],88:[683,1,750,23,727],89:[684,0,750,11,738],90:[683,1,611,55,560],91:[750,250,278,118,255],92:[750,250,500,56,444],93:[750,250,278,22,159],94:[694,-531,500,112,387],95:[-25,62,500,0,499],96:[699,-505,500,106,295],97:[448,11,500,34,493],98:[694,11,556,20,522],99:[448,11,444,34,415],100:[694,11,556,34,535],101:[448,11,444,28,415],102:[705,0,306,25,372],103:[453,206,500,29,485],104:[695,0,556,25,543],105:[669,0,278,26,255],106:[669,205,306,-55,218],107:[695,0,528,20,512],108:[694,0,278,26,263],109:[443,0,833,25,820],110:[443,0,556,25,543],111:[448,10,500,28,471],112:[443,194,556,20,522],113:[442,194,528,33,535],114:[442,0,392,20,364],115:[449,12,394,32,359],116:[615,10,389,18,334],117:[442,11,556,25,542],118:[431,11,528,19,508],119:[432,12,722,18,704],120:[431,0,528,10,516],121:[431,204,528,19,508],122:[431,0,444,28,401],123:[750,250,500,64,434],124:[750,250,278,119,159],125:[750,250,500,64,435],126:[318,-215,500,83,416],160:[0,0,250,0,0],168:[669,-554,500,95,404],172:[356,-89,667,55,611],175:[590,-544,500,69,430],176:[715,-542,500,147,352],177:[666,0,778,55,722],180:[699,-505,500,203,393],215:[491,-9,778,147,631],247:[537,36,778,55,721],305:[442,0,278,26,255],567:[442,205,306,-55,218],710:[694,-531,500,112,387],711:[644,-513,500,114,385],713:[590,-544,500,69,430],714:[699,-505,500,203,393],715:[699,-505,500,106,295],728:[694,-515,500,92,407],729:[669,-549,500,190,309],732:[668,-565,500,83,416],915:[681,0,625,25,582],916:[716,0,833,46,786],920:[705,22,778,56,722],923:[717,0,694,32,661],926:[677,0,667,42,624],928:[680,0,750,25,724],931:[683,1,722,55,666],933:[705,0,778,55,722],934:[683,0,722,56,665],936:[683,0,778,54,722],937:[704,1,722,44,677],8194:[0,0,500,0,0],8195:[0,0,999,0,0],8196:[0,0,333,0,0],8197:[0,0,250,0,0],8198:[0,0,167,0,0],8201:[0,0,167,0,0],8202:[0,0,83,0,0],8211:[285,-248,500,0,499],8212:[285,-248,1000,0,999],8216:[694,-379,278,64,198],8217:[694,-379,278,78,212],8220:[694,-379,500,128,466],8221:[694,-379,500,34,372],8224:[705,217,444,55,390],8225:[705,206,444,55,389],8230:[120,0,1172,78,1093],8242:[560,-43,275,30,262],8407:[714,-516,0,-471,-29],8463:[695,13,540,42,562],8465:[705,11,722,54,693],8467:[706,20,417,6,398],8472:[453,216,636,67,625],8476:[717,22,722,40,716],8501:[694,1,611,54,556],8592:[511,12,1000,54,944],8593:[694,194,500,17,483],8594:[512,11,1000,55,945],8595:[694,194,500,17,483],8596:[511,11,1000,55,945],8597:[772,272,500,17,483],8598:[720,196,1000,29,944],8599:[720,195,1000,55,970],8600:[695,220,1000,55,970],8601:[695,220,1000,29,944],8614:[512,11,1000,54,945],8617:[511,12,1126,54,1070],8618:[512,11,1126,55,1071],8636:[511,-230,1000,55,944],8637:[270,11,1000,55,944],8640:[511,-230,1000,55,944],8641:[270,11,1000,55,945],8652:[671,11,1000,55,944],8656:[525,24,1000,55,944],8657:[694,194,611,31,579],8658:[525,25,1000,55,944],8659:[694,194,611,31,579],8660:[525,25,1000,34,966],8661:[772,272,611,31,580],8704:[694,22,556,0,556],8706:[715,22,531,41,566],8707:[694,0,556,55,500],8709:[772,78,500,39,460],8711:[683,33,833,46,786],8712:[541,41,667,84,584],8713:[716,215,667,84,584],8715:[541,40,667,83,582],8722:[270,-230,778,83,694],8723:[500,167,778,55,722],8725:[751,250,500,56,445],8726:[750,250,500,56,444],8727:[465,-34,500,64,435],8728:[444,-55,500,55,444],8729:[444,-55,500,55,444],8730:[800,200,833,72,853],8733:[442,11,778,56,722],8734:[442,11,1000,55,944],8736:[694,0,722,55,666],8739:[750,250,278,119,159],8741:[750,250,500,132,367],8743:[598,22,667,55,611],8744:[598,22,667,55,611],8745:[598,22,667,55,611],8746:[599,22,667,55,611],8747:[716,216,417,55,472],8764:[367,-133,778,55,722],8768:[583,83,278,55,222],8771:[464,-36,778,55,722],8773:[589,-22,1000,55,722],8776:[483,-55,778,55,722],8781:[484,-16,778,55,722],8784:[670,-133,778,55,722],8800:[716,215,778,55,722],8801:[464,-36,778,55,722],8804:[636,138,778,83,694],8805:[636,138,778,82,694],8810:[568,68,1000,56,944],8811:[567,67,1000,55,945],8826:[539,41,778,84,695],8827:[539,41,778,83,694],8834:[540,41,778,84,695],8835:[541,40,778,82,693],8838:[636,139,778,84,695],8839:[637,138,778,83,693],8846:[599,22,667,55,611],8849:[636,138,778,83,714],8850:[636,138,778,63,694],8851:[598,0,667,61,605],8852:[598,0,667,61,605],8853:[583,83,778,56,722],8854:[583,83,778,56,722],8855:[583,83,778,56,722],8856:[583,83,778,56,722],8857:[583,83,778,56,722],8866:[694,0,611,55,555],8867:[694,0,611,55,555],8868:[668,0,778,55,723],8869:[668,0,778,55,723],8872:[750,250,867,119,811],8900:[488,-12,500,12,488],8901:[310,-190,278,78,199],8902:[486,-16,500,3,497],8904:[505,6,900,25,873],8942:[900,30,278,78,199],8943:[310,-190,1172,78,1093],8945:[820,-100,1282,133,1148],8968:[751,250,444,174,422],8969:[751,250,444,21,269],8970:[750,251,444,174,422],8971:[751,251,444,20,269],8994:[388,-122,1000,55,944],8995:[378,-134,1000,55,944],9136:[744,245,412,55,357],9137:[745,244,412,55,357],10216:[750,250,389,110,333],10217:[750,250,389,55,278],10222:[744,245,412,173,357],10223:[744,245,412,55,240],10229:[511,12,1609,54,1525],10230:[512,11,1638,83,1554],10231:[512,12,1859,54,1804],10232:[525,24,1609,55,1553],10233:[525,25,1638,55,1582],10234:[525,24,1858,55,1802],10236:[512,11,1638,54,1554],10815:[684,0,750,28,721],10927:[636,138,778,83,695],10928:[636,138,778,83,694]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_Main"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Regular/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/MiscSymbols.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/MiscSymbols.js
new file mode 100644
index 0000000..fb025a1
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/MiscSymbols.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/MiscSymbols.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_Main,{9824:[727,131,778,55,723],9825:[716,33,778,55,723],9826:[727,163,778,55,723],9827:[726,131,778,28,750],9837:[751,22,389,54,333],9838:[734,223,389,65,324],9839:[723,223,389,54,334]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Regular/MiscSymbols.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/SpacingModLetters.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/SpacingModLetters.js
new file mode 100644
index 0000000..0c064d2
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/SpacingModLetters.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/SpacingModLetters.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_Main,{730:[715,-542,500,147,352]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Main/Regular/SpacingModLetters.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Math/BoldItalic/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Math/BoldItalic/Main.js
new file mode 100644
index 0000000..fb00e00
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Math/BoldItalic/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Math/BoldItalic/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Math-bold-italic"]={directory:"Math/BoldItalic",family:"MathJax_Math",weight:"bold",style:"italic",testString:"MathJax Math",skew:{65:0.16,66:0.0958,67:0.0958,68:0.0639,69:0.0958,70:0.0958,71:0.0958,72:0.0639,73:0.128,74:0.192,75:0.0639,76:0.0319,77:0.0958,78:0.0958,79:0.0958,80:0.0958,81:0.0958,82:0.0958,83:0.0958,84:0.0958,85:0.0319,88:0.0958,90:0.0958,99:0.0639,100:0.192,101:0.0639,102:0.192,103:0.0319,104:-0.0319,108:0.0958,111:0.0639,112:0.0958,113:0.0958,114:0.0639,115:0.0639,116:0.0958,117:0.0319,118:0.0319,119:0.0958,120:0.0319,121:0.0639,122:0.0639,915:0.0958,916:0.192,920:0.0958,923:0.192,926:0.0958,928:0.0639,931:0.0958,933:0.0639,934:0.0958,936:0.0639,937:0.0958,945:0.0319,946:0.0958,948:0.0639,949:0.0958,950:0.0958,951:0.0639,952:0.0958,953:0.0639,956:0.0319,957:0.0319,958:0.128,959:0.0639,961:0.0958,962:0.0958,964:0.0319,965:0.0319,966:0.0958,967:0.0639,968:0.128,977:0.0958,981:0.0958,1009:0.0958,1013:0.0639},32:[0,0,250,0,0],47:[711,210,894,160,733],65:[712,0,869,45,839],66:[687,0,866,43,853],67:[703,17,817,54,855],68:[686,0,938,43,914],69:[681,0,810,43,825],70:[681,0,689,43,810],71:[703,16,887,56,854],72:[686,0,982,43,1027],73:[686,0,511,30,574],74:[686,17,631,42,694],75:[686,0,971,43,1003],76:[686,0,756,43,711],77:[687,1,1142,43,1220],78:[687,1,950,43,1028],79:[703,17,837,53,815],80:[686,0,723,42,847],81:[703,194,869,53,815],82:[687,17,872,43,881],83:[703,18,693,63,714],84:[675,1,637,22,773],85:[687,16,800,63,877],86:[686,17,678,62,886],87:[687,18,1093,60,1207],88:[686,1,947,38,953],89:[686,0,675,39,876],90:[686,1,773,68,805],97:[452,8,633,37,607],98:[694,8,521,44,513],99:[451,8,513,40,509],100:[694,8,610,38,612],101:[452,8,554,42,509],102:[701,201,568,64,625],103:[452,202,545,0,540],104:[694,8,668,44,642],105:[694,8,405,24,367],106:[694,202,471,-12,456],107:[694,8,604,44,578],108:[694,8,348,27,297],109:[452,9,1032,24,1006],110:[452,9,713,24,688],111:[452,8,585,39,576],112:[452,194,601,-23,593],113:[452,194,542,38,550],114:[452,8,529,24,500],115:[452,8,531,57,476],116:[644,7,415,21,387],117:[452,8,681,24,655],118:[453,8,567,24,540],119:[454,8,831,24,796],120:[452,8,659,43,599],121:[452,202,590,24,587],122:[453,9,555,33,539],160:[0,0,250,0,0],915:[680,0,657,43,777],916:[712,0,958,59,904],920:[702,17,867,54,844],923:[712,1,806,43,776],926:[676,0,841,62,868],928:[680,0,982,43,1026],931:[686,0,885,69,902],933:[704,0,671,32,802],934:[687,0,767,29,737],936:[687,0,714,22,791],937:[703,1,879,93,886],945:[452,8,761,39,712],946:[701,195,660,28,637],947:[451,211,590,5,617],948:[725,8,522,39,513],949:[461,17,529,35,481],950:[711,202,508,48,521],951:[452,211,600,24,601],952:[702,8,562,39,554],953:[452,8,412,37,386],954:[452,8,668,45,642],955:[694,13,671,40,652],956:[452,211,708,33,682],957:[452,2,577,38,608],958:[712,201,508,23,490],959:[452,8,585,39,576],960:[445,8,682,23,674],961:[451,211,612,34,603],962:[452,105,424,33,457],963:[444,8,686,35,677],964:[444,13,521,23,610],965:[454,8,631,24,604],966:[452,216,747,52,703],967:[452,201,718,32,686],968:[694,203,758,24,732],969:[453,8,718,24,691],977:[701,9,692,23,656],981:[695,203,712,51,693],982:[444,8,975,22,961],1009:[451,195,612,75,604],1013:[445,7,483,43,450]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_Math-bold-italic"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/Math/BoldItalic/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Math/Italic/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Math/Italic/Main.js
new file mode 100644
index 0000000..1852066
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Math/Italic/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Math/Italic/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_Math-italic"]={directory:"Math/Italic",family:"MathJax_Math",style:"italic",testString:"MathJax Math",skew:{65:0.139,66:0.0833,67:0.0833,68:0.0556,69:0.0833,70:0.0833,71:0.0833,72:0.0556,73:0.111,74:0.167,75:0.0556,76:0.0278,77:0.0833,78:0.0833,79:0.0833,80:0.0833,81:0.0833,82:0.0833,83:0.0833,84:0.0833,85:0.0278,88:0.0833,90:0.0833,99:0.0556,100:0.167,101:0.0556,102:0.167,103:0.0278,104:-0.0278,108:0.0833,111:0.0556,112:0.0833,113:0.0833,114:0.0556,115:0.0556,116:0.0833,117:0.0278,118:0.0278,119:0.0833,120:0.0278,121:0.0556,122:0.0556,915:0.0833,916:0.167,920:0.0833,923:0.167,926:0.0833,928:0.0556,931:0.0833,933:0.0556,934:0.0833,936:0.0556,937:0.0833,945:0.0278,946:0.0833,948:0.0556,949:0.0833,950:0.0833,951:0.0556,952:0.0833,953:0.0556,956:0.0278,957:0.0278,958:0.111,959:0.0556,961:0.0833,962:0.0833,964:0.0278,965:0.0278,966:0.0833,967:0.0556,968:0.111,977:0.0833,981:0.0833,1009:0.0833,1013:0.0556},32:[0,0,250,0,0],47:[716,215,778,139,638],65:[717,0,750,35,727],66:[683,0,759,35,756],67:[705,22,715,50,760],68:[683,1,828,32,804],69:[680,1,738,30,764],70:[681,0,643,30,749],71:[705,22,786,50,760],72:[683,0,831,31,889],73:[684,0,440,26,504],74:[683,22,555,57,633],75:[684,0,849,31,889],76:[684,1,681,32,647],77:[684,0,970,35,1051],78:[684,0,803,31,888],79:[704,22,763,50,740],80:[683,0,642,33,751],81:[704,195,791,50,740],82:[683,22,759,33,755],83:[705,22,613,52,645],84:[678,0,584,21,705],85:[684,22,683,59,767],86:[683,23,583,52,769],87:[684,22,944,51,1048],88:[684,1,828,25,852],89:[683,-1,581,29,763],90:[684,1,683,58,724],97:[441,10,529,33,506],98:[694,11,429,39,422],99:[442,11,433,34,429],100:[694,10,520,33,524],101:[442,11,466,39,429],102:[705,205,490,55,550],103:[443,205,477,10,480],104:[694,11,576,48,555],105:[661,11,345,21,303],106:[661,204,412,-12,403],107:[694,11,521,48,503],108:[694,11,298,38,267],109:[442,11,878,21,857],110:[442,11,600,21,580],111:[441,11,485,34,476],112:[442,194,503,-39,497],113:[442,194,446,33,460],114:[442,11,451,21,430],115:[442,10,469,53,419],116:[626,11,361,19,330],117:[442,11,572,21,551],118:[443,11,485,21,467],119:[444,11,716,20,690],120:[443,11,572,35,523],121:[442,205,490,21,496],122:[442,12,465,35,468],160:[0,0,250,0,0],915:[680,-1,615,31,721],916:[716,1,833,48,788],920:[704,22,763,50,740],923:[717,0,694,35,671],926:[678,1,742,53,777],928:[681,0,831,31,888],931:[683,0,780,58,806],933:[706,0,583,28,701],934:[683,0,667,24,643],936:[684,0,612,21,693],937:[704,0,772,80,786],945:[442,11,640,34,603],946:[706,194,566,23,573],947:[441,216,518,11,543],948:[717,10,444,36,451],949:[453,22,466,27,428],950:[704,204,438,44,472],951:[442,216,497,21,504],952:[705,10,469,35,462],953:[442,10,354,48,332],954:[442,11,576,49,554],955:[694,12,583,46,556],956:[443,216,603,22,580],957:[442,2,494,45,530],958:[704,205,438,21,443],959:[441,11,485,34,476],960:[431,11,570,19,573],961:[442,216,517,22,510],962:[442,108,363,31,405],963:[431,11,571,31,572],964:[431,13,437,17,517],965:[443,10,540,21,523],966:[442,219,654,50,618],967:[442,204,626,24,601],968:[694,205,651,21,634],969:[444,11,622,15,604],977:[705,11,591,21,563],981:[695,206,596,43,579],982:[431,10,828,19,823],1009:[442,194,517,67,510],1013:[432,11,406,39,383]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_Math-italic"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/Math/Italic/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/BasicLatin.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/BasicLatin.js
new file mode 100644
index 0000000..1009a9b
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/BasicLatin.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/BasicLatin.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_SansSerif-bold"],{32:[0,0,250,0,0],33:[695,0,367,109,257],34:[694,-441,558,37,420],35:[694,193,917,61,855],36:[750,57,550,49,488],37:[750,57,1029,61,967],38:[716,22,831,47,769],39:[694,-441,306,80,226],40:[750,249,428,79,366],41:[751,251,428,61,348],42:[750,-293,550,67,482],43:[617,116,856,61,794],44:[146,107,306,80,226],45:[274,-185,367,12,305],46:[146,0,306,80,226],47:[750,249,550,61,489],48:[715,22,550,42,506],49:[716,-1,550,76,473],50:[716,0,550,46,495],51:[716,22,550,46,503],52:[695,1,550,30,519],53:[694,22,550,37,494],54:[716,22,550,46,503],55:[696,12,550,45,504],56:[716,22,550,46,503],57:[716,22,550,46,503],58:[458,0,306,80,226],59:[458,107,306,80,226],61:[407,-94,856,61,794],63:[706,0,519,61,457],64:[704,11,733,61,671],65:[695,1,733,42,691],66:[695,-1,733,92,671],67:[704,11,703,61,647],68:[695,0,794,91,732],69:[692,0,642,92,596],70:[692,1,611,92,565],71:[705,11,733,61,659],72:[695,1,794,92,702],73:[695,1,331,85,246],74:[695,22,519,46,427],75:[695,1,764,92,701],76:[695,0,581,92,535],77:[695,1,978,92,886],78:[695,1,794,92,702],79:[716,22,794,62,731],80:[694,0,703,92,641],81:[716,106,794,62,732],82:[695,1,703,92,654],83:[716,22,611,49,549],84:[689,1,733,40,693],85:[695,22,764,92,672],86:[695,-1,733,27,705],87:[695,1,1039,23,1014],88:[695,0,733,37,694],89:[695,1,733,23,708],90:[694,0,672,61,617],91:[751,251,343,78,318],93:[751,251,343,24,263],94:[694,-537,550,108,441],95:[-23,110,550,0,549],97:[475,11,525,31,474],98:[695,11,561,54,523],99:[475,11,489,37,457],100:[695,11,561,37,507],101:[475,10,511,30,480],102:[705,1,336,28,382],103:[469,207,550,17,534],104:[695,1,561,53,509],105:[695,1,256,45,208],106:[696,205,286,-71,233],107:[695,1,531,63,496],108:[695,1,256,54,201],109:[469,1,867,53,816],110:[468,1,561,53,509],111:[475,11,550,32,518],112:[470,194,561,54,523],113:[470,195,561,37,507],114:[469,0,372,54,356],115:[474,10,422,30,396],116:[590,10,404,20,374],117:[459,11,561,52,509],118:[459,0,500,26,473],119:[459,1,744,23,719],120:[459,1,500,23,475],121:[459,205,500,28,473],122:[458,1,476,31,443],126:[344,-197,550,92,457]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/SansSerif/Bold/BasicLatin.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/CombDiacritMarks.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/CombDiacritMarks.js
new file mode 100644
index 0000000..d2b807d
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/CombDiacritMarks.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/CombDiacritMarks.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_SansSerif-bold"],{768:[695,-537,0,-458,-218],769:[694,-536,0,-334,-93],770:[694,-537,0,-442,-109],771:[694,-547,0,-458,-93],772:[660,-560,0,-474,-77],774:[695,-552,0,-470,-80],775:[695,-596,0,-357,-194],776:[696,-594,0,-459,-90],778:[694,-537,0,-365,-118],779:[695,-536,0,-440,-93],780:[658,-500,0,-442,-109]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/SansSerif/Bold/CombDiacritMarks.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/Main.js
new file mode 100644
index 0000000..0f1c43e
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_SansSerif-bold"]={directory:"SansSerif/Bold",family:"MathJax_SansSerif",weight:"bold",testString:"MathJax SansSerif",Ranges:[[0,127,"BasicLatin"],[128,65535,"Other"],[768,879,"CombDiacritMarks"]]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_SansSerif-bold"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/SansSerif/Bold/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/Other.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/Other.js
new file mode 100644
index 0000000..86471ec
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/Other.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/Other.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_SansSerif-bold"],{160:[0,0,250,0,0],305:[459,1,256,54,201],567:[459,205,286,-71,232],915:[692,1,581,92,535],916:[695,0,917,60,856],920:[716,22,856,62,793],923:[695,1,672,41,630],926:[688,1,733,45,687],928:[691,1,794,92,702],931:[695,0,794,61,733],933:[716,1,856,61,794],934:[695,0,794,62,732],936:[695,0,856,61,794],937:[716,1,794,48,745],8211:[327,-240,550,0,549],8212:[327,-240,1100,0,1099],8216:[695,-443,306,81,226],8217:[694,-441,306,80,226],8220:[695,-443,558,138,521],8221:[694,-441,558,37,420]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/SansSerif/Bold/Other.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/BasicLatin.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/BasicLatin.js
new file mode 100644
index 0000000..d310dbd
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/BasicLatin.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/BasicLatin.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_SansSerif-italic"],{32:[0,0,250,0,0],33:[694,0,319,110,355],34:[694,-471,500,133,472],35:[694,194,833,87,851],36:[750,56,500,56,565],37:[750,56,833,165,815],38:[716,22,758,71,747],39:[694,-471,278,190,335],40:[750,250,389,104,491],41:[750,250,389,2,390],42:[750,-305,500,156,569],43:[583,83,778,108,775],44:[98,125,278,63,209],45:[259,-186,333,51,332],46:[98,0,278,90,209],47:[750,250,500,6,600],48:[678,23,500,88,549],49:[678,0,500,88,451],50:[679,0,500,50,552],51:[678,22,500,56,544],52:[656,0,500,62,521],53:[656,22,500,50,555],54:[678,22,500,94,548],55:[656,11,500,143,596],56:[678,22,500,77,554],57:[677,22,500,77,545],58:[444,0,278,90,282],59:[444,125,278,63,282],61:[370,-130,778,87,796],63:[704,0,472,173,536],64:[705,10,667,120,707],65:[694,0,667,28,638],66:[694,0,667,90,696],67:[705,10,639,124,719],68:[694,0,722,88,747],69:[691,0,597,86,688],70:[691,0,569,86,673],71:[705,11,667,125,730],72:[694,0,708,86,768],73:[694,0,278,87,338],74:[694,22,472,46,535],75:[694,0,694,88,785],76:[694,0,542,87,516],77:[694,0,875,92,929],78:[694,0,708,88,766],79:[716,22,736,118,763],80:[694,0,639,88,690],81:[716,125,736,118,763],82:[694,0,646,88,699],83:[716,22,556,54,609],84:[688,0,681,165,790],85:[694,22,688,130,747],86:[694,0,667,161,799],87:[694,0,944,160,1076],88:[694,0,667,14,758],89:[694,0,667,151,810],90:[694,0,611,55,702],91:[750,250,289,41,425],93:[750,250,289,-31,353],94:[694,-527,500,190,533],95:[-38,114,500,50,565],97:[461,11,481,61,474],98:[694,11,517,75,539],99:[461,11,444,75,499],100:[694,11,517,73,588],101:[460,11,444,71,472],102:[705,0,306,94,494],103:[455,206,500,12,568],104:[694,0,517,73,513],105:[680,0,239,74,315],106:[680,204,267,-96,336],107:[694,0,489,76,543],108:[694,0,239,74,311],109:[455,0,794,73,790],110:[454,0,517,73,513],111:[461,11,500,69,523],112:[455,194,517,34,538],113:[455,194,517,72,538],114:[455,0,342,74,424],115:[461,11,383,35,436],116:[571,11,361,97,410],117:[444,11,517,90,537],118:[444,0,461,108,540],119:[444,0,683,108,762],120:[444,0,461,1,537],121:[444,205,461,1,540],122:[444,0,435,28,494],126:[327,-193,500,199,560]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/SansSerif/Italic/BasicLatin.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/CombDiacritMarks.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/CombDiacritMarks.js
new file mode 100644
index 0000000..a9f50e7
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/CombDiacritMarks.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/CombDiacritMarks.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_SansSerif-italic"],{768:[694,-527,0,-270,-87],769:[694,-527,0,-190,63],770:[694,-527,0,-310,33],771:[677,-543,0,-301,60],772:[631,-552,0,-314,64],774:[694,-508,0,-284,73],775:[680,-576,0,-180,-54],776:[680,-582,0,-273,40],778:[694,-527,0,-227,-2],779:[694,-527,0,-287,63],780:[654,-487,0,-283,60]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/SansSerif/Italic/CombDiacritMarks.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/Main.js
new file mode 100644
index 0000000..3dbb1a1
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_SansSerif-italic"]={directory:"SansSerif/Italic",family:"MathJax_SansSerif",style:"italic",testString:"MathJax SansSerif",Ranges:[[0,127,"BasicLatin"],[128,65535,"Other"],[768,879,"CombDiacritMarks"]]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_SansSerif-italic"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/SansSerif/Italic/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/Other.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/Other.js
new file mode 100644
index 0000000..6c1fe1f
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/Other.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/Other.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS["MathJax_SansSerif-italic"],{160:[0,0,250,0,0],305:[444,0,239,74,258],567:[444,204,267,-96,286],915:[691,0,542,87,646],916:[694,0,833,42,790],920:[715,22,778,119,804],923:[694,0,611,28,582],926:[688,0,667,42,765],928:[691,0,708,86,768],931:[694,0,722,55,813],933:[716,0,778,173,843],934:[694,0,722,124,743],936:[694,0,778,171,854],937:[716,0,722,44,769],8211:[312,-236,500,50,565],8212:[312,-236,1000,50,1065],8216:[694,-471,278,190,336],8217:[694,-471,278,190,335],8220:[694,-471,500,274,614],8221:[694,-471,500,133,472]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/SansSerif/Italic/Other.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/BasicLatin.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/BasicLatin.js
new file mode 100644
index 0000000..7710aea
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/BasicLatin.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/BasicLatin.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_SansSerif,{32:[0,0,250,0,0],33:[694,0,319,110,208],34:[694,-471,500,32,325],35:[694,194,833,55,777],36:[750,56,500,44,444],37:[750,56,833,56,776],38:[716,23,758,42,703],39:[694,-471,278,89,188],40:[750,250,389,74,333],41:[750,250,389,55,314],42:[750,-306,500,63,436],43:[583,83,778,55,722],44:[98,125,278,89,188],45:[259,-186,333,11,277],46:[98,0,278,90,188],47:[751,250,500,56,445],48:[678,22,500,39,460],49:[678,0,500,83,430],50:[677,0,500,42,450],51:[678,22,500,42,457],52:[656,0,500,28,471],53:[656,22,500,33,449],54:[678,22,500,42,457],55:[656,11,500,42,457],56:[678,22,500,43,456],57:[678,22,500,42,457],58:[444,0,278,90,188],59:[444,125,278,89,188],61:[370,-130,778,55,722],63:[704,0,472,55,416],64:[704,11,667,56,612],65:[694,0,667,28,638],66:[694,0,667,90,610],67:[705,11,639,59,587],68:[695,0,722,87,666],69:[691,0,597,86,554],70:[691,0,569,86,526],71:[704,11,667,59,599],72:[694,0,708,86,621],73:[694,0,278,87,191],74:[694,22,472,42,389],75:[694,0,694,88,651],76:[694,0,542,87,499],77:[694,0,875,92,782],78:[694,0,708,88,619],79:[715,22,736,55,680],80:[694,0,639,88,583],81:[715,125,736,55,680],82:[694,0,646,88,617],83:[716,22,556,44,500],84:[688,0,681,36,644],85:[694,22,688,87,600],86:[694,0,667,14,652],87:[694,0,944,14,929],88:[694,0,667,14,652],89:[694,0,667,3,663],90:[694,0,611,55,560],91:[750,250,289,94,266],93:[750,250,289,22,194],94:[694,-527,500,78,421],95:[-38,114,500,0,499],97:[461,11,481,38,408],98:[694,11,517,75,482],99:[460,10,444,34,415],100:[694,10,517,33,441],101:[461,10,444,28,415],102:[706,0,306,27,347],103:[455,206,500,28,485],104:[694,0,517,73,443],105:[680,0,239,67,171],106:[680,205,267,-59,192],107:[694,0,489,76,471],108:[694,0,239,74,164],109:[455,0,794,73,720],110:[455,0,517,73,443],111:[460,10,500,28,471],112:[456,194,517,75,483],113:[455,194,517,33,441],114:[455,0,342,74,327],115:[460,10,383,28,360],116:[571,10,361,18,333],117:[444,11,517,73,443],118:[444,0,461,14,446],119:[444,0,683,14,668],120:[444,0,461,0,460],121:[444,205,461,14,446],122:[444,0,435,28,402],126:[327,-193,500,83,416]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/SansSerif/Regular/BasicLatin.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/CombDiacritMarks.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/CombDiacritMarks.js
new file mode 100644
index 0000000..73f334d
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/CombDiacritMarks.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/CombDiacritMarks.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_SansSerif,{768:[694,-527,0,-417,-199],769:[694,-527,0,-302,-84],770:[694,-527,0,-422,-79],771:[677,-543,0,-417,-84],772:[631,-552,0,-431,-70],774:[694,-508,0,-427,-74],775:[680,-576,0,-302,-198],776:[680,-582,0,-397,-104],778:[694,-527,0,-319,-99],779:[694,-527,0,-399,-84],780:[654,-487,0,-422,-79]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/SansSerif/Regular/CombDiacritMarks.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/Main.js
new file mode 100644
index 0000000..6b65849
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_SansSerif={directory:"SansSerif/Regular",family:"MathJax_SansSerif",testString:"MathJax SansSerif",Ranges:[[0,127,"BasicLatin"],[128,65535,"Other"],[768,879,"CombDiacritMarks"]]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_SansSerif"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/SansSerif/Regular/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/Other.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/Other.js
new file mode 100644
index 0000000..13b65b2
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/Other.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/Other.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_SansSerif,{160:[0,0,250,0,0],305:[444,0,239,74,164],567:[444,205,267,-59,192],915:[691,0,542,87,499],916:[694,0,833,42,790],920:[716,21,778,56,722],923:[694,0,611,28,582],926:[688,0,667,42,624],928:[691,0,708,86,621],931:[694,0,722,55,666],933:[717,0,778,55,722],934:[694,0,722,55,666],936:[694,0,778,55,722],937:[716,0,722,44,677],8211:[312,-236,500,0,499],8212:[312,-236,1000,0,999],8216:[694,-471,278,90,189],8217:[694,-471,278,89,188],8220:[694,-471,500,174,467],8221:[694,-471,500,32,325]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/SansSerif/Regular/Other.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Script/Regular/BasicLatin.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Script/Regular/BasicLatin.js
new file mode 100644
index 0000000..5ed4ee1
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Script/Regular/BasicLatin.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Script/Regular/BasicLatin.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_Script,{32:[0,0,250,0,0],65:[718,8,803,35,1017],66:[708,28,908,31,928],67:[728,26,666,26,819],68:[708,31,774,68,855],69:[708,8,562,46,719],70:[735,36,895,39,990],71:[717,38,610,12,739],72:[718,36,969,29,1241],73:[717,17,809,59,946],74:[718,315,1052,92,1133],75:[717,37,914,29,1204],76:[718,18,874,14,1036],77:[721,50,1080,30,1216],78:[726,36,902,29,1208],79:[707,8,738,96,805],80:[716,38,1013,89,1031],81:[717,17,883,54,885],82:[717,17,850,-3,887],83:[708,36,868,29,1016],84:[735,37,747,92,996],85:[717,17,800,55,960],86:[717,17,622,56,850],87:[718,17,805,46,1026],88:[718,17,944,103,1132],89:[716,17,710,57,959],90:[718,16,821,82,1033]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Script/Regular/BasicLatin.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Script/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Script/Regular/Main.js
new file mode 100644
index 0000000..b69453e
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Script/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Script/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_Script={directory:"Script/Regular",family:"MathJax_Script",testString:"MATHJAX SCRIPT",skew:{65:0.389,66:0.194,67:0.278,68:0.111,69:0.139,70:0.222,71:0.25,72:0.333,73:0.333,74:0.417,75:0.361,76:0.306,77:0.444,78:0.389,79:0.167,80:0.222,81:0.278,82:0.194,83:0.333,84:0.222,85:0.25,86:0.222,87:0.25,88:0.278,89:0.194,90:0.306},Ranges:[[0,127,"BasicLatin"],[128,65535,"Other"]]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_Script"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/Script/Regular/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Script/Regular/Other.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Script/Regular/Other.js
new file mode 100644
index 0000000..de25f84
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Script/Regular/Other.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Script/Regular/Other.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_Script,{160:[0,0,250,0,0]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Script/Regular/Other.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Size1/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Size1/Regular/Main.js
new file mode 100644
index 0000000..add73d4
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Size1/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Size1/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_Size1={directory:"Size1/Regular",family:"MathJax_Size1",testString:"() [] {}",32:[0,0,250,0,0],40:[850,349,458,152,422],41:[851,349,458,35,305],47:[850,349,578,55,522],91:[850,349,417,202,394],92:[850,349,578,54,522],93:[850,349,417,22,214],123:[850,349,583,104,477],125:[851,349,583,104,477],160:[0,0,250,0,0],710:[744,-551,556,-8,564],732:[722,-597,556,1,554],770:[744,-551,0,-564,8],771:[722,-597,0,-555,-2],8214:[602,0,778,257,521],8593:[600,0,667,112,555],8595:[600,0,667,112,555],8657:[599,0,778,57,721],8659:[600,-1,778,57,721],8719:[750,250,944,55,888],8720:[750,250,944,55,888],8721:[751,250,1056,56,999],8730:[850,350,1000,111,1020],8739:[627,15,333,145,188],8741:[627,15,556,145,410],8747:[805,306,472,55,610],8748:[805,306,819,55,957],8749:[805,306,1166,55,1304],8750:[805,306,472,55,610],8896:[750,249,833,55,777],8897:[750,249,833,55,777],8898:[750,249,833,54,777],8899:[750,250,833,55,777],8968:[850,349,472,202,449],8969:[850,349,472,22,269],8970:[850,349,472,202,449],8971:[850,349,472,22,269],9168:[602,0,667,312,355],10216:[850,350,472,97,394],10217:[850,350,472,77,374],10752:[750,250,1111,56,1054],10753:[750,250,1111,56,1054],10754:[750,250,1111,56,1054],10756:[750,250,833,55,777],10758:[750,249,833,55,777]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_Size1"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/Size1/Regular/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Size2/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Size2/Regular/Main.js
new file mode 100644
index 0000000..a32200f
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Size2/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Size2/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_Size2={directory:"Size2/Regular",family:"MathJax_Size2",testString:"() [] {}",32:[0,0,250,0,0],40:[1150,649,597,180,561],41:[1151,649,597,35,416],47:[1150,649,811,55,755],91:[1150,649,472,224,455],92:[1150,649,811,54,754],93:[1150,649,472,16,247],123:[1150,649,667,119,547],125:[1151,649,667,119,547],160:[0,0,250,0,0],710:[772,-565,1000,-5,1004],732:[750,-611,1000,0,999],770:[772,-565,0,-1005,4],771:[750,-611,0,-1000,-1],8719:[950,450,1278,56,1221],8720:[950,450,1278,56,1221],8721:[950,450,1444,55,1388],8730:[1150,650,1000,111,1020],8747:[1360,862,556,55,944],8748:[1361,862,1084,55,1473],8749:[1361,862,1592,55,1981],8750:[1360,862,556,55,944],8896:[950,450,1111,55,1055],8897:[950,450,1111,55,1055],8898:[949,450,1111,55,1055],8899:[950,449,1111,55,1055],8968:[1150,649,528,224,511],8969:[1150,649,528,16,303],8970:[1150,649,528,224,511],8971:[1150,649,528,16,303],10216:[1150,649,611,112,524],10217:[1150,649,611,85,498],10752:[949,449,1511,56,1454],10753:[949,449,1511,56,1454],10754:[949,449,1511,56,1454],10756:[950,449,1111,55,1055],10758:[950,450,1111,55,1055]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_Size2"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/Size2/Regular/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Size3/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Size3/Regular/Main.js
new file mode 100644
index 0000000..4e0158b
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Size3/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Size3/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_Size3={directory:"Size3/Regular",family:"MathJax_Size3",testString:"() [] {}",32:[0,0,250,0,0],40:[1450,949,736,209,701],41:[1451,949,736,34,526],47:[1450,949,1044,55,989],91:[1450,949,528,247,516],92:[1450,949,1044,56,988],93:[1450,949,528,11,280],123:[1450,949,750,130,618],125:[1451,949,750,131,618],160:[0,0,250,0,0],710:[772,-564,1444,-4,1447],732:[749,-610,1444,1,1442],770:[772,-564,0,-1448,3],771:[749,-610,0,-1443,-2],8730:[1450,951,1000,111,1020],8968:[1450,949,583,246,571],8969:[1450,949,583,11,336],8970:[1450,949,583,246,571],8971:[1450,949,583,11,336],10216:[1450,950,750,126,654],10217:[1450,950,750,94,623]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_Size3"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/Size3/Regular/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Size4/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Size4/Regular/Main.js
new file mode 100644
index 0000000..ee90b53
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Size4/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Size4/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_Size4={directory:"Size4/Regular",family:"MathJax_Size4",testString:"() [] {}",32:[0,0,250,0,0],40:[1750,1249,792,237,758],41:[1751,1250,792,33,554],47:[1750,1249,1278,56,1221],91:[1750,1249,583,269,577],92:[1750,1249,1278,56,1221],93:[1750,1249,583,5,313],123:[1750,1249,806,144,662],125:[1751,1249,806,144,662],160:[0,0,250,0,0],710:[845,-561,1889,-14,1902],732:[823,-583,1889,1,1885],770:[845,-561,0,-1903,13],771:[823,-583,0,-1888,-4],8730:[1750,1251,1000,111,1020],8968:[1750,1249,639,269,633],8969:[1750,1249,639,5,369],8970:[1750,1249,639,269,633],8971:[1750,1249,639,5,369],9115:[1155,655,875,290,843],9116:[610,10,875,291,417],9117:[1165,644,875,291,843],9118:[1155,655,875,31,583],9119:[610,10,875,457,583],9120:[1165,645,875,31,583],9121:[1154,645,667,319,666],9122:[602,0,667,319,403],9123:[1155,644,667,319,666],9124:[1154,645,667,0,347],9125:[602,0,667,263,347],9126:[1155,644,667,0,347],9127:[899,10,889,383,719],9128:[1160,660,889,170,505],9129:[10,899,889,384,718],9130:[310,10,889,383,504],9131:[900,11,889,170,504],9132:[1160,660,889,384,718],9133:[10,899,889,170,505],9143:[935,885,1056,111,742],10216:[1750,1249,806,140,703],10217:[1751,1249,806,103,665],57344:[625,15,1056,702,742],57345:[605,15,1056,702,1076],57680:[120,213,450,-24,461],57681:[120,214,450,-11,475],57682:[333,0,450,-24,461],57683:[333,0,450,-11,475],57684:[120,0,400,-10,410]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_Size4"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/Size4/Regular/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/BasicLatin.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/BasicLatin.js
new file mode 100644
index 0000000..53d3dd9
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/BasicLatin.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/BasicLatin.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_Typewriter,{32:[0,0,250,0,0],33:[622,0,525,206,320],34:[623,-333,525,122,402],35:[612,0,525,36,490],36:[695,83,525,58,467],37:[694,83,525,35,489],38:[622,11,525,28,490],39:[611,-287,525,175,349],40:[695,83,525,166,437],41:[694,82,525,87,358],42:[520,-90,525,68,456],43:[531,-81,525,38,487],44:[140,139,525,173,353],45:[341,-271,525,56,468],46:[140,-1,525,193,332],47:[694,83,525,58,466],48:[621,10,525,42,482],49:[622,0,525,98,450],50:[623,-1,525,52,473],51:[622,12,525,44,479],52:[624,-1,525,28,496],53:[611,10,525,52,472],54:[622,11,525,45,480],55:[628,10,525,43,480],56:[621,10,525,45,479],57:[622,11,525,45,479],58:[431,-1,525,193,332],59:[431,139,525,175,337],60:[557,-55,525,57,468],61:[417,-195,525,37,487],62:[557,-55,525,57,468],63:[617,0,525,62,462],64:[617,6,525,44,481],65:[624,0,525,27,497],66:[611,-1,525,16,482],67:[622,11,525,40,485],68:[612,-1,525,15,485],69:[611,-1,525,18,503],70:[611,-1,525,21,491],71:[622,11,525,38,497],72:[612,-1,525,16,508],73:[611,-1,525,71,453],74:[611,11,525,56,479],75:[612,-1,525,18,496],76:[612,1,525,25,489],77:[612,0,525,11,513],78:[612,1,525,20,504],79:[621,11,525,56,468],80:[612,-1,525,18,481],81:[621,138,525,56,468],82:[612,11,525,16,522],83:[622,12,525,51,472],84:[611,-1,525,26,499],85:[611,11,525,-4,528],86:[611,8,525,18,506],87:[612,8,525,11,513],88:[612,-1,525,27,496],89:[612,-1,525,19,505],90:[611,-1,525,47,482],91:[695,82,525,213,484],92:[694,83,525,58,466],93:[696,82,525,41,310],94:[612,-459,525,95,428],95:[-25,95,525,56,468],96:[681,-357,525,176,350],97:[439,6,525,48,525],98:[612,6,525,4,492],99:[441,6,525,66,466],100:[612,6,525,31,520],101:[440,6,525,48,464],102:[617,-1,525,34,437],103:[442,229,525,28,509],104:[612,-1,525,4,520],105:[612,-1,525,71,463],106:[612,228,525,48,377],107:[612,0,525,12,508],108:[611,-1,525,50,475],109:[437,0,525,-13,536],110:[437,-1,525,4,520],111:[440,6,525,52,472],112:[437,221,525,4,492],113:[438,222,525,34,546],114:[437,0,525,24,487],115:[440,6,525,71,458],116:[555,6,525,25,448],117:[432,5,525,4,520],118:[432,5,525,24,500],119:[432,5,525,15,509],120:[432,-1,525,28,496],121:[432,228,525,25,500],122:[431,-1,525,33,476],123:[694,84,525,49,475],124:[694,82,525,228,297],125:[695,83,525,49,476],126:[611,-466,525,87,437],127:[612,-518,525,104,421]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Typewriter/Regular/BasicLatin.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/CombDiacritMarks.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/CombDiacritMarks.js
new file mode 100644
index 0000000..6910071
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/CombDiacritMarks.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/CombDiacritMarks.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_Typewriter,{768:[611,-485,0,-409,-195],769:[611,-485,0,-331,-117],770:[612,-459,0,-430,-97],771:[611,-466,0,-438,-88],772:[578,-500,0,-453,-74],774:[612,-503,0,-446,-78],776:[612,-518,0,-421,-104],778:[619,-499,0,-344,-182],780:[577,-449,0,-428,-99]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Typewriter/Regular/CombDiacritMarks.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/Main.js
new file mode 100644
index 0000000..990cdc4
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_Typewriter={directory:"Typewriter/Regular",family:"MathJax_Typewriter",testString:"MathJax Typewriter",Ranges:[[0,127,"BasicLatin"],[128,65535,"Other"],[768,879,"CombDiacritMarks"]]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_Typewriter"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/Typewriter/Regular/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/Other.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/Other.js
new file mode 100644
index 0000000..3b41ccc
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/Other.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/Other.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_Typewriter,{160:[0,0,250,0,0],305:[432,-1,525,71,463],567:[432,228,525,48,377],915:[612,1,525,25,489],916:[623,0,525,35,489],920:[621,11,525,56,468],923:[623,-1,525,29,496],926:[611,-1,525,32,492],928:[611,-1,525,16,508],931:[612,-1,525,40,485],933:[623,-1,525,38,487],934:[611,-1,525,41,483],936:[611,-1,525,36,487],937:[622,0,525,31,493],2018:[611,-287,525,175,349],2019:[681,-357,525,176,350],8242:[623,-334,525,211,313]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/Typewriter/Regular/Other.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/WinChrome/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/WinChrome/Regular/Main.js
new file mode 100644
index 0000000..df3dac1
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/WinChrome/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/WinChrome/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_WinChrome={directory:"WinChrome/Regular",family:"MathJax_WinChrome",testString:"> T d "+String.fromCharCode(9126)+" "+String.fromCharCode(10752),skew:{84:0.0278,58096:0.0319},32:[0,0,250,0,0],62:[540,40,778,82,694],84:[717,69,545,34,834],100:[694,11,511,100,567],160:[0,0,250,0,0],8899:[750,250,833,55,777],9126:[1155,644,667,0,347],10752:[949,449,1511,56,1454],58096:[720,69,644,38,947],58097:[587,85,894,95,797]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_WinChrome"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/WinChrome/Regular/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/WinIE6/Regular/AMS.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/WinIE6/Regular/AMS.js
new file mode 100644
index 0000000..312f47a
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/WinIE6/Regular/AMS.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/WinIE6/Regular/AMS.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_WinIE6,{58048:[438,-63,500,57,417],58049:[438,-63,500,64,422],58050:[430,23,222,91,131],58051:[431,23,389,55,331],58052:[365,-132,778,55,719],58053:[753,175,778,83,694],58054:[753,175,778,82,694],58055:[708,209,778,82,693],58056:[708,209,778,82,694],58058:[694,-306,500,54,444],58059:[695,-306,500,55,444],58060:[367,23,500,54,444],58061:[366,22,500,55,445],58062:[694,195,889,0,860],58063:[694,195,889,0,860],58064:[689,0,778,55,722],58065:[689,0,778,55,722],58066:[575,20,722,84,637],58067:[575,20,722,84,637],58068:[539,41,778,83,694],58069:[576,20,722,84,638],58070:[576,20,722,84,638],58071:[539,41,778,83,694],58072:[716,132,667,56,612],58073:[471,82,667,24,643],58074:[471,82,667,23,643],58075:[601,101,778,15,762],58076:[695,111,944,49,896],58077:[367,-133,778,56,722]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/WinIE6/Regular/AMS.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/WinIE6/Regular/Bold.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/WinIE6/Regular/Bold.js
new file mode 100644
index 0000000..ece0399
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/WinIE6/Regular/Bold.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/WinIE6/Regular/Bold.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.Hub.Insert(MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_WinIE6,{57920:[519,18,1150,64,1085],57921:[694,193,575,13,562],57922:[519,18,1150,65,1085],57923:[694,194,575,13,562],57924:[519,18,1150,64,1085],57925:[767,267,575,13,562],57926:[724,195,1150,64,1084],57927:[724,193,1150,64,1086],57928:[695,224,1150,65,1085],57929:[694,224,1150,64,1085],57930:[548,47,1150,64,1084],57931:[548,46,1150,47,1102],57932:[694,16,639,0,640],57933:[710,17,628,60,657],57934:[694,-1,639,64,574],57935:[686,24,958,56,901],57936:[587,86,767,97,670],57937:[588,86,767,95,670],57938:[750,250,575,63,511],57939:[820,180,958,78,989],57940:[451,8,894,65,831],57941:[452,8,1150,65,1084],57942:[715,0,722,55,676],57943:[750,249,319,129,190],57944:[750,248,575,145,430],57945:[604,17,767,64,702],57946:[604,17,767,64,702],57947:[603,16,767,64,702],57948:[604,16,767,64,702],57949:[711,211,569,64,632],57950:[391,-109,894,64,828],57951:[524,-32,894,64,829],57952:[712,210,894,64,830],57953:[505,3,894,64,829],57954:[697,199,894,96,797],57955:[697,199,894,96,797],57956:[618,117,1150,64,1085],57957:[619,116,1150,64,1085],57958:[587,85,894,96,797],57959:[587,86,894,96,797],57960:[697,199,894,96,797],57961:[697,199,894,96,797],57962:[632,132,894,64,828],57963:[632,132,894,64,828],57964:[693,-1,894,64,829],57965:[711,-1,1022,68,953],57966:[500,210,1022,68,953],57967:[711,211,1150,65,1084],57968:[720,130,894,63,829],57969:[711,24,894,65,828],57970:[719,154,894,64,828],57971:[720,130,894,32,861],57972:[750,17,447,63,382],57973:[741,223,447,56,390],57974:[724,224,447,63,383]});MathJax.Ajax.loadComplete(MathJax.OutputJax["HTML-CSS"].fontDir+"/WinIE6/Regular/Bold.js");
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/WinIE6/Regular/Main.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/WinIE6/Regular/Main.js
new file mode 100644
index 0000000..098e4f0
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/WinIE6/Regular/Main.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/WinIE6/Regular/Main.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax["HTML-CSS"].FONTDATA.FONTS.MathJax_WinIE6={directory:"WinIE6/Regular",family:"MathJax_WinIE6",testString:String.fromCharCode(57927)+" "+String.fromCharCode(57943)+" "+String.fromCharCode(58063),skew:{57869:0.0833,57933:0.0958},Ranges:[[57920,57983,"Bold"],[58048,58079,"AMS"]],32:[0,0,250,0,0],160:[0,0,250,0,0],57856:[511,12,1000,54,944],57857:[694,194,500,17,483],57858:[512,11,1000,55,945],57859:[694,194,500,17,483],57860:[511,11,1000,55,945],57861:[772,272,500,17,483],57862:[720,196,1000,29,944],57863:[720,195,1000,55,970],57864:[695,220,1000,55,970],57865:[695,220,1000,29,944],57866:[525,25,1000,55,944],57867:[525,25,1000,34,966],57868:[694,22,556,0,556],57869:[715,22,531,41,566],57870:[694,0,556,55,500],57871:[683,33,833,46,786],57872:[541,41,667,84,584],57873:[541,40,667,83,582],57874:[751,250,500,56,445],57875:[800,200,833,72,853],57876:[442,11,778,56,722],57877:[442,11,1000,55,944],57878:[694,0,722,55,666],57879:[750,250,278,119,159],57880:[750,250,500,132,367],57881:[598,22,667,55,611],57882:[598,22,667,55,611],57883:[598,22,667,55,611],57884:[599,22,667,55,611],57885:[716,216,417,55,472],57886:[367,-133,778,55,722],57887:[483,-55,778,55,722],57888:[716,215,778,55,722],57889:[464,-36,778,55,722],57890:[636,138,778,83,694],57891:[636,138,778,82,694],57892:[568,68,1000,56,944],57893:[567,67,1000,55,945],57894:[540,41,778,84,695],57895:[541,40,778,82,693],57896:[636,139,778,84,695],57897:[637,138,778,83,693],57898:[583,83,778,56,722],57899:[583,83,778,56,722],57900:[668,0,778,55,723],57901:[716,0,889,59,828],57902:[500,215,889,59,828],57903:[715,215,1000,56,944],57904:[727,131,778,55,723],57905:[716,33,778,55,723],57906:[727,163,778,55,723],57907:[726,131,778,28,750],57908:[751,22,389,54,333],57909:[734,223,389,65,324],57910:[723,223,389,54,334],57984:[0,1000,944,55,888],57985:[1,1000,1056,56,999],57986:[40,1160,1000,111,1020],57987:[21,621,333,145,188],57988:[21,621,556,145,410],57989:[0,1111,472,55,610],57990:[0,1111,472,55,610],57991:[0,600,667,112,555],57992:[0,600,667,112,555],57993:[1,601,667,312,355],58000:[0,1400,1278,56,1221],58001:[0,1400,1444,55,1388],58002:[40,1760,1000,111,1020],58005:[0,2222,556,55,944],58006:[0,2222,556,55,944],58018:[40,2361,1000,111,1020],58034:[40,2961,1000,111,1020]};MathJax.Callback.Queue(["initFont",MathJax.OutputJax["HTML-CSS"],"MathJax_WinIE6"],["loadComplete",MathJax.Ajax,MathJax.OutputJax["HTML-CSS"].fontDir+"/WinIE6/Regular/Main.js"]);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/fonts/TeX/fontdata.js b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/fontdata.js
new file mode 100644
index 0000000..7ebe301
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/fonts/TeX/fontdata.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/fonts/TeX/fontdata.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(g,j,k){var n="1.1.1";var f="MathJax_Main",i="MathJax_Main-bold",h="MathJax_Math-italic",l="MathJax_AMS",d="MathJax_Size1",c="MathJax_Size2",b="MathJax_Size3",a="MathJax_Size4";var m="H",e="V";g.Augment({FONTDATA:{version:n,TeX_factor:1,baselineskip:1.2,lineH:0.8,lineD:0.2,hasStyleChar:true,FONTS:{MathJax_Main:"Main/Regular/Main.js","MathJax_Main-bold":"Main/Bold/Main.js","MathJax_Main-italic":"Main/Italic/Main.js","MathJax_Math-italic":"Math/Italic/Main.js","MathJax_Math-bold-italic":"Math/BoldItalic/Main.js",MathJax_Caligraphic:"Caligraphic/Regular/Main.js",MathJax_Size1:"Size1/Regular/Main.js",MathJax_Size2:"Size2/Regular/Main.js",MathJax_Size3:"Size3/Regular/Main.js",MathJax_Size4:"Size4/Regular/Main.js",MathJax_AMS:"AMS/Regular/Main.js",MathJax_Fraktur:"Fraktur/Regular/Main.js","MathJax_Fraktur-bold":"Fraktur/Bold/Main.js",MathJax_SansSerif:"SansSerif/Regular/Main.js","MathJax_SansSerif-bold":"SansSerif/Bold/Main.js","MathJax_SansSerif-italic":"SansSerif/Italic/Main.js",MathJax_Script:"Script/Regular/Main.js",MathJax_Typewriter:"Typewriter/Regular/Main.js"},VARIANT:{normal:{fonts:[f,d,l],offsetG:945,variantG:"italic",remap:{913:65,914:66,917:69,918:90,919:72,921:73,922:75,924:77,925:78,927:79,929:80,932:84,935:88}},bold:{fonts:[i,d,l],bold:true,offsetG:945,variantG:"bold-italic",remap:{913:65,914:66,917:69,918:90,919:72,921:73,922:75,924:77,925:78,927:79,929:80,932:84,935:88}},italic:{fonts:[h,"MathJax_Main-italic",f,d,l],italic:true,remap:{913:65,914:66,917:69,918:90,919:72,921:73,922:75,924:77,925:78,927:79,929:80,932:84,935:88}},"bold-italic":{fonts:["MathJax_Math-bold-italic",i,d,l],bold:true,italic:true,remap:{913:65,914:66,917:69,918:90,919:72,921:73,922:75,924:77,925:78,927:79,929:80,932:84,935:88}},"double-struck":{fonts:[l,f]},fraktur:{fonts:["MathJax_Fraktur",f,d,l]},"bold-fraktur":{fonts:["MathJax_Fraktur-bold",i,d,l],bold:true},script:{fonts:["MathJax_Script",f,d,l]},"bold-script":{fonts:["MathJax_Script",i,d,l],bold:true},"sans-serif":{fonts:["MathJax_SansSerif",f,d,l]},"bold-sans-serif":{fonts:["MathJax_SansSerif-bold",i,d,l],bold:true},"sans-serif-italic":{fonts:["MathJax_SansSerif-italic","MathJax_Main-italic",d,l],italic:true},"sans-serif-bold-italic":{fonts:["MathJax_SansSerif-italic","MathJax_Main-italic",d,l],bold:true,italic:true},monospace:{fonts:["MathJax_Typewriter",f,d,l]},"-tex-caligraphic":{fonts:["MathJax_Caligraphic",f],offsetA:65,variantA:"italic"},"-tex-oldstyle":{fonts:["MathJax_Caligraphic",f]},"-largeOp":{fonts:[c,d,f]},"-smallOp":{fonts:[d,f]}},RANGES:[{name:"alpha",low:97,high:122,offset:"A",add:32},{name:"number",low:48,high:57,offset:"N"},{name:"greek",low:945,high:1014,offset:"G"}],RULECHAR:8722,REMAP:{8254:713,8400:8636,8401:8640,8406:8592,8417:8596,8428:8641,8429:8637,8430:8592,8431:8594,8432:42,65079:9182,65080:9183,183:8901,697:8242,978:933,8213:8212,8215:95,8226:8729,8260:47,8965:8892,8966:10846,9642:9632,9652:9650,9653:9651,9662:9660,9663:9661,9666:9664,9001:10216,9002:10217,12296:10216,12297:10217,10072:8739,10799:215},PLANE1MAP:[[119808,119833,65,j.VARIANT.BOLD],[119834,119859,97,j.VARIANT.BOLD],[119860,119885,65,j.VARIANT.ITALIC],[119886,119911,97,j.VARIANT.ITALIC],[119912,119937,65,j.VARIANT.BOLDITALIC],[119938,119963,97,j.VARIANT.BOLDITALIC],[119964,119989,65,j.VARIANT.SCRIPT],[120068,120093,65,j.VARIANT.FRAKTUR],[120094,120119,97,j.VARIANT.FRAKTUR],[120120,120145,65,j.VARIANT.DOUBLESTRUCK],[120172,120197,65,j.VARIANT.BOLDFRAKTUR],[120198,120223,97,j.VARIANT.BOLDFRAKTUR],[120224,120249,65,j.VARIANT.SANSSERIF],[120250,120275,97,j.VARIANT.SANSSERIF],[120276,120301,65,j.VARIANT.BOLDSANSSERIF],[120302,120327,97,j.VARIANT.BOLDSANSSERIF],[120328,120353,65,j.VARIANT.SANSSERIFITALIC],[120354,120379,97,j.VARIANT.SANSSERIFITALIC],[120432,120457,65,j.VARIANT.MONOSPACE],[120458,120483,97,j.VARIANT.MONOSPACE],[120488,120513,913,j.VARIANT.BOLD],[120546,120570,913,j.VARIANT.ITALIC],[120572,120603,945,j.VARIANT.ITALIC],[120604,120628,913,j.VARIANT.BOLDITALIC],[120630,120661,945,j.VARIANT.BOLDITALIC],[120662,120686,913,j.VARIANT.BOLDSANSSERIF],[120720,120744,913,j.VARIANT.SANSSERIFBOLDITALIC],[120782,120791,48,j.VARIANT.BOLD],[120802,120811,48,j.VARIANT.SANSSERIF],[120812,120821,48,j.VARIANT.BOLDSANSSERIF],[120822,120831,48,j.VARIANT.MONOSPACE]],REMAPGREEK:{913:65,914:66,917:69,918:90,919:72,921:73,922:75,924:77,925:78,927:79,929:80,930:920,932:84,935:88,938:8711,970:8706,971:1013,972:977,973:1008,974:981,975:1009,976:982},RemapPlane1:function(r,q){for(var p=0,o=this.PLANE1MAP.length;p<o;p++){if(r<this.PLANE1MAP[p][0]){break}if(r<=this.PLANE1MAP[p][1]){r=r-this.PLANE1MAP[p][0]+this.PLANE1MAP[p][2];if(this.REMAPGREEK[r]){r=this.REMAPGREEK[r]}q=this.VARIANT[this.PLANE1MAP[p][3]];break}}return{n:r,variant:q}},DELIMITERS:{40:{dir:e,HW:[[1,f],[1.2,d],[1.8,c],[2.4,b],[3,a]],stretch:{top:[9115,a],ext:[9116,a],bot:[9117,a]}},41:{dir:e,HW:[[1,f],[1.2,d],[1.8,c],[2.4,b],[3,a]],stretch:{top:[9118,a],ext:[9119,a],bot:[9120,a]}},47:{dir:e,HW:[[1,f],[1.2,d],[1.8,c],[2.4,b],[3,a]]},91:{dir:e,HW:[[1,f],[1.2,d],[1.8,c],[2.4,b],[3,a]],stretch:{top:[9121,a],ext:[9122,a],bot:[9123,a]}},92:{dir:e,HW:[[1,f],[1.2,d],[1.8,c],[2.4,b],[3,a]]},93:{dir:e,HW:[[1,f],[1.2,d],[1.8,c],[2.4,b],[3,a]],stretch:{top:[9124,a],ext:[9125,a],bot:[9126,a]}},123:{dir:e,HW:[[1,f],[1.2,d],[1.8,c],[2.4,b],[3,a]],stretch:{top:[9127,a],mid:[9128,a],bot:[9129,a],ext:[9130,a]}},124:{dir:e,HW:[[1,f]],stretch:{ext:[8739,f]}},125:{dir:e,HW:[[1,f],[1.2,d],[1.8,c],[2.4,b],[3,a]],stretch:{top:[9131,a],mid:[9132,a],bot:[9133,a],ext:[9130,a]}},710:{dir:m,HW:[[0.267+0.05,f],[0.567+0.05,d],[1.005+0.05,c],[1.447+0.1,b],[1.909+0.1,a]]},732:{dir:m,HW:[[0.333,f],[0.555+0.05,d],[1+0.05,c],[1.443+0.1,b],[1.887+0.1,a]]},8214:{dir:e,HW:[[0.602,d],[1,f,null,8741]],stretch:{ext:[8741,f]}},8592:{dir:m,HW:[[1,f]],stretch:{left:[8592,f],rep:[8722,f]}},8593:{dir:e,HW:[[0.888,f]],stretch:{top:[8593,d],ext:[9168,d]}},8594:{dir:m,HW:[[1,f]],stretch:{rep:[8722,f],right:[8594,f]}},8595:{dir:e,HW:[[0.888,f]],stretch:{ext:[9168,d],bot:[8595,d]}},8596:{dir:m,HW:[[1,f]],stretch:{left:[8592,f],rep:[8722,f],right:[8594,f]}},8597:{dir:e,HW:[[1.044,f]],stretch:{top:[8593,d],ext:[9168,d],bot:[8595,d]}},8656:{dir:m,HW:[[1,f]],stretch:{left:[8656,f],rep:[61,f]}},8657:{dir:e,HW:[[0.888,f]],stretch:{top:[8657,d],ext:[8214,d]}},8658:{dir:m,HW:[[1,f]],stretch:{rep:[61,f],right:[8658,f]}},8659:{dir:e,HW:[[0.888,f]],stretch:{ext:[8214,d],bot:[8659,d]}},8660:{dir:m,HW:[[1,f]],stretch:{left:[8656,f],rep:[61,f],right:[8658,f]}},8661:{dir:e,HW:[[1.044,f]],stretch:{top:[8657,d],ext:[8214,d],bot:[8659,d]}},8722:{dir:m,HW:[[0.611,f]],stretch:{rep:[8722,f]}},8730:{dir:e,HW:[[1,f],[1.2,d],[1.8,c],[2.4,b],[3,a]],stretch:{top:[57345,a],ext:[57344,a],bot:[9143,a],fullExtenders:true}},8739:{dir:e,HW:[[1,f]],stretch:{ext:[8739,f]}},8741:{dir:e,HW:[[1,f]],stretch:{ext:[8741,f]}},8968:{dir:e,HW:[[1,f],[1.2,d],[1.8,c],[2.4,b],[3,a]],stretch:{top:[9121,a],ext:[9122,a]}},8969:{dir:e,HW:[[1,f],[1.2,d],[1.8,c],[2.4,b],[3,a]],stretch:{top:[9124,a],ext:[9125,a]}},8970:{dir:e,HW:[[1,f],[1.2,d],[1.8,c],[2.4,b],[3,a]],stretch:{ext:[9122,a],bot:[9123,a]}},8971:{dir:e,HW:[[1,f],[1.2,d],[1.8,c],[2.4,b],[3,a]],stretch:{ext:[9125,a],bot:[9126,a]}},9130:{dir:e,HW:[[0.32,a]],stretch:{top:[9130,a],ext:[9130,a],bot:[9130,a]}},9136:{dir:e,HW:[[0.989,f]],stretch:{top:[9127,a],ext:[9130,a],bot:[9133,a]}},9137:{dir:e,HW:[[0.989,f]],stretch:{top:[9131,a],ext:[9130,a],bot:[9129,a]}},9168:{dir:e,HW:[[0.602,d],[1,f,null,8739]],stretch:{ext:[8739,f]}},9182:{dir:m,HW:[],stretch:{left:[57680,a],mid:[[57683,57682],a],right:[57681,a],rep:[57684,a]}},9183:{dir:m,HW:[],stretch:{left:[57682,a],mid:[[57681,57680],a],right:[57683,a],rep:[57684,a]}},10216:{dir:e,HW:[[1,f],[1.2,d],[1.8,c],[2.4,b],[3,a]]},10217:{dir:e,HW:[[1,f],[1.2,d],[1.8,c],[2.4,b],[3,a]]},10222:{dir:e,HW:[[0.989,f]],stretch:{top:[9127,a],ext:[9130,a],bot:[9129,a]}},10223:{dir:e,HW:[[0.989,f]],stretch:{top:[9131,a],ext:[9130,a],bot:[9133,a]}},45:{alias:8722,dir:m},94:{alias:710,dir:m},95:{alias:8722,dir:m},126:{alias:732,dir:m},175:{alias:8722,dir:m},818:{alias:8722,dir:m},8213:{alias:8722,dir:m},8215:{alias:8722,dir:m},8254:{alias:8722,dir:m},9001:{alias:10216,dir:e},9002:{alias:10217,dir:e},9135:{alias:8722,dir:m},9472:{alias:8722,dir:m},10072:{alias:8739,dir:e},12296:{alias:10216,dir:e},12297:{alias:10217,dir:e},65079:{alias:9182,dir:m},65080:{alias:9183,dir:m}}}});g.Font.oldLoadComplete=g.Font.loadComplete;g.Font.loadComplete=function(q,r,p,o){if(r!=null){this.oldLoadComplete(q,r,p,o)}if(q.family===d||q.family===c){if(q.version===1){g.FONTDATA.VARIANT["-largeOp"].remap={8898:8899,8899:8898};g.FONTDATA.VARIANT["-smallOp"].remap={8898:8899,8899:8898}}}};MathJax.Hub.Register.StartupHook("TeX Jax Ready",function(){var o=MathJax.InputJax.TeX;o.Definitions.mathchar0mi.ell=["2113",{mathvariant:j.VARIANT.NORMAL}];o.Definitions.mathchar0mi.hbar=["210F",{mathvariant:j.VARIANT.NORMAL}];o.Definitions.mathchar0mi.S=["00A7",{mathvariant:j.VARIANT.SCRIPT}];if(MathJax.Hub.Browser.isOpera){o.Definitions.macros.not=["Macro","\\mathrel{\\rlap{\\hphantom{\\mathrel{\\subset}}\\notChar}}"]}else{o.Definitions.mathchar0mo.notChar=["002F",{mathvariant:j.VARIANT.ITALIC}];o.Definitions.macros.not=["Macro","\\mathrel{\\rlap{\\notChar}}"]}});g.FONTDATA.FONTS.MathJax_Caligraphic={directory:"Caligraphic/Regular",family:"MathJax_Caligraphic",testString:"MATHJAX CALIGRAPHIC",skew:{65:0.194,66:0.139,67:0.139,68:0.0833,69:0.111,70:0.111,71:0.111,72:0.111,73:0.0278,74:0.167,75:0.0556,76:0.139,77:0.139,78:0.0833,79:0.111,80:0.0833,81:0.111,82:0.0833,83:0.139,84:0.0278,85:0.0833,86:0.0278,87:0.0833,88:0.139,89:0.0833,90:0.139},32:[0,0,250,0,0],48:[452,22,500,39,460],49:[454,0,500,86,426],50:[453,0,500,44,449],51:[452,216,500,41,456],52:[464,194,500,27,471],53:[453,217,500,50,448],54:[666,22,500,42,456],55:[463,216,500,54,485],56:[666,21,500,43,457],57:[453,216,500,42,457],65:[728,50,798,30,819],66:[705,22,657,31,664],67:[705,25,527,12,533],68:[684,1,771,19,767],69:[706,22,528,30,565],70:[683,32,719,18,829],71:[704,119,595,43,599],72:[683,48,845,18,803],73:[683,1,545,-31,642],74:[683,119,678,47,839],75:[705,23,762,32,733],76:[706,22,690,32,656],77:[705,50,1201,28,1137],78:[790,50,820,-27,979],79:[705,22,796,58,777],80:[684,57,696,19,733],81:[706,131,817,114,787],82:[683,22,848,19,837],83:[705,23,606,17,642],84:[717,69,545,34,834],85:[684,28,626,-17,687],86:[683,52,613,25,658],87:[683,53,988,25,1034],88:[684,1,713,52,807],89:[683,143,668,31,714],90:[683,0,725,37,767],160:[0,0,250,0,0]};g.FONTDATA.FONTS["MathJax_Main-bold"]={directory:"Main/Bold",family:"MathJax_Main",weight:"bold",testString:"MathJax Main",skew:{305:0.0319,567:0.0958,8463:-0.0319,8467:0.128,8706:0.0958},Ranges:[[160,255,"Latin1Supplement"],[256,383,"LatinExtendedA"],[384,591,"LatinExtendedB"],[688,767,"SpacingModLetters"],[768,879,"CombDiacritMarks"],[8192,8303,"GeneralPunctuation"],[8400,8447,"CombDiactForSymbols"],[8448,8527,"LetterlikeSymbols"],[8592,8703,"Arrows"],[8704,8959,"MathOperators"],[8960,9215,"MiscTechnical"],[9632,9727,"GeometricShapes"],[9728,9983,"MiscSymbols"],[10176,10223,"MiscMathSymbolsA"],[10224,10239,"SupplementalArrowsA"],[10752,11007,"SuppMathOperators"]],32:[0,0,250,0,0],33:[705,-1,350,89,260],34:[694,-329,603,38,492],35:[694,193,958,64,893],36:[750,56,575,64,510],37:[750,56,958,65,893],38:[705,11,894,48,836],39:[694,-329,319,74,261],40:[751,250,447,103,382],41:[750,249,447,64,343],42:[750,-306,575,73,501],43:[633,131,894,64,829],44:[171,194,319,74,258],45:[278,-166,383,13,318],46:[171,-1,319,74,245],47:[750,250,575,63,511],48:[655,10,575,45,529],49:[655,0,575,80,494],50:[654,0,575,57,517],51:[655,12,575,47,526],52:[657,0,575,32,542],53:[655,11,575,57,517],54:[655,11,575,48,527],55:[676,11,575,64,559],56:[654,11,575,48,526],57:[654,11,575,48,526],58:[444,-1,319,74,245],59:[444,194,319,74,248],60:[587,85,894,96,797],61:[393,-109,894,64,829],62:[587,85,894,95,797],63:[700,-1,543,65,478],64:[700,6,894,64,829],65:[698,0,869,40,828],66:[687,0,818,39,753],67:[697,11,831,64,767],68:[687,0,882,39,817],69:[681,0,756,38,723],70:[680,0,724,39,675],71:[697,10,904,64,845],72:[686,0,900,39,860],73:[686,0,436,25,410],74:[686,11,594,8,527],75:[686,0,901,39,852],76:[686,0,692,39,643],77:[687,0,1092,39,1052],78:[687,1,900,39,861],79:[696,10,864,64,798],80:[686,0,786,39,721],81:[697,193,864,64,806],82:[687,11,862,39,858],83:[697,11,639,63,575],84:[675,0,800,41,758],85:[686,12,885,39,845],86:[686,7,869,25,843],87:[686,8,1189,24,1164],88:[686,0,869,33,835],89:[686,0,869,19,849],90:[687,0,703,64,645],91:[750,250,319,128,293],92:[750,250,575,63,511],93:[750,250,319,25,190],94:[694,-520,575,126,448],95:[-10,61,575,0,574],96:[706,-503,575,114,338],97:[453,6,559,32,558],98:[694,7,639,29,601],99:[453,6,511,39,478],100:[695,6,639,38,609],101:[453,6,527,32,494],102:[700,0,351,40,452],103:[455,201,575,30,558],104:[694,0,639,37,623],105:[695,0,319,40,294],106:[695,200,351,-71,274],107:[694,0,607,29,587],108:[694,0,319,40,301],109:[451,0,958,37,942],110:[450,0,639,37,623],111:[452,5,575,32,542],112:[450,194,639,28,600],113:[450,194,607,38,609],114:[450,0,474,29,442],115:[453,7,454,37,415],116:[636,6,447,21,382],117:[450,6,639,37,623],118:[444,4,607,26,580],119:[444,5,831,25,805],120:[444,0,607,21,586],121:[444,200,607,23,580],122:[445,0,511,31,462],123:[751,251,575,69,504],124:[750,249,319,129,190],125:[751,251,575,70,504],126:[344,-201,575,96,478],915:[680,0,692,39,643],916:[698,0,958,56,901],920:[696,10,894,64,829],923:[699,0,806,40,765],926:[675,0,767,48,718],928:[680,0,900,39,860],931:[686,0,831,63,766],933:[697,0,894,64,829],934:[686,0,831,64,766],936:[686,0,894,64,829],937:[696,1,831,51,780]};g.FONTDATA.FONTS["MathJax_Main-italic"]={directory:"Main/Italic",family:"MathJax_Main",style:"italic",testString:"MathJax Main",Ranges:[[160,255,"Latin1Supplement"],[768,879,"CombDiacritMarks"],[8192,8303,"GeneralPunctuation"],[8448,8527,"LetterlikeSymbols"]],32:[0,0,250,0,0],33:[716,0,307,107,380],34:[694,-379,514,176,538],35:[694,194,818,115,828],37:[751,56,818,144,848],38:[716,22,767,127,802],39:[694,-379,307,213,377],40:[750,250,409,144,517],41:[750,250,409,17,390],42:[751,-320,511,195,584],43:[558,57,767,139,753],44:[121,194,307,69,233],45:[251,-179,358,84,341],46:[121,0,307,107,231],47:[750,250,511,19,617],48:[665,21,511,110,562],49:[666,0,511,110,468],50:[666,22,511,76,551],51:[667,22,511,96,563],52:[666,194,511,46,479],53:[666,22,511,106,567],54:[665,22,511,120,566],55:[666,22,511,136,634],56:[666,21,511,99,553],57:[666,22,511,107,553],58:[431,0,307,107,308],59:[431,194,307,70,308],61:[367,-133,767,116,776],63:[717,0,511,195,551],64:[705,11,767,152,789],65:[716,1,743,58,696],66:[683,1,704,57,732],67:[705,21,716,150,812],68:[683,1,755,56,775],69:[681,0,678,54,743],70:[681,0,653,54,731],71:[705,22,774,149,812],72:[683,0,743,54,860],73:[683,0,386,49,508],74:[683,21,525,78,622],75:[683,0,769,54,859],76:[683,0,627,54,628],77:[684,0,897,58,1010],78:[684,0,743,54,860],79:[704,22,767,149,788],80:[684,0,678,55,729],81:[704,194,767,149,788],82:[683,22,729,55,723],83:[706,22,562,74,634],84:[678,0,716,171,807],85:[684,22,743,194,860],86:[683,22,743,205,868],87:[683,22,999,205,1124],88:[684,0,743,50,826],89:[684,0,743,198,875],90:[683,1,613,80,705],91:[751,251,307,73,446],93:[751,251,307,-14,359],94:[694,-527,511,260,528],95:[-24,62,511,91,554],97:[442,11,511,101,543],98:[694,11,460,108,467],99:[441,10,460,103,470],100:[694,11,511,100,567],101:[442,10,460,107,470],102:[705,204,307,-23,450],103:[442,205,460,46,495],104:[695,11,511,69,544],105:[656,10,307,75,340],106:[656,204,307,-32,364],107:[694,11,460,69,499],108:[694,11,256,87,312],109:[443,11,818,75,851],110:[443,11,562,75,595],111:[442,11,511,103,517],112:[442,194,511,5,518],113:[442,195,460,100,504],114:[442,11,422,75,484],115:[442,11,409,76,418],116:[627,11,332,87,373],117:[441,11,537,75,570],118:[443,10,460,75,492],119:[443,12,664,74,696],120:[442,11,464,58,513],121:[441,206,486,75,522],122:[442,11,409,54,466],126:[318,-208,511,246,571],163:[714,11,769,87,699],305:[441,10,307,75,340],567:[442,205,332,-32,327],915:[680,0,627,54,706],916:[717,1,818,70,751],920:[704,22,767,149,788],923:[717,0,692,58,646],926:[678,1,664,74,754],928:[680,0,743,54,859],931:[683,1,716,80,782],933:[706,0,767,213,833],934:[683,1,716,158,728],936:[683,0,767,207,824],937:[705,0,716,100,759]};g.FONTDATA.FONTS.MathJax_Main={directory:"Main/Regular",family:"MathJax_Main",testString:"MathJax Main",skew:{305:0.0278,567:0.0833,8467:0.111,8472:0.111,8706:0.0833},Ranges:[[688,767,"SpacingModLetters"],[768,879,"CombDiacritMarks"],[9632,9727,"GeometricShapes"],[9728,9983,"MiscSymbols"]],32:[0,0,250,0,0],33:[716,-1,278,78,199],34:[694,-379,500,34,372],35:[694,194,833,55,778],36:[750,56,500,54,444],37:[750,56,833,56,776],38:[717,22,778,42,727],39:[694,-379,278,78,212],40:[751,251,389,94,333],41:[750,250,389,55,294],42:[750,-319,500,64,435],43:[583,83,778,55,722],44:[121,194,278,78,210],45:[252,-179,333,11,277],46:[120,0,278,78,199],47:[751,250,500,56,445],48:[666,22,500,39,460],49:[666,0,500,83,427],50:[666,1,500,49,449],51:[665,23,500,41,457],52:[677,0,500,28,471],53:[666,22,500,49,449],54:[666,22,500,42,456],55:[676,22,500,55,485],56:[666,22,500,43,457],57:[666,22,500,41,456],58:[430,0,278,78,199],59:[430,194,278,78,202],60:[540,40,778,83,694],61:[367,-133,778,55,722],62:[540,40,778,82,694],63:[706,-1,472,55,416],64:[705,11,778,56,722],65:[717,0,750,32,717],66:[684,0,708,28,651],67:[706,21,722,56,666],68:[683,0,764,27,708],69:[680,0,681,24,652],70:[680,0,653,25,611],71:[706,22,785,56,735],72:[683,0,750,25,724],73:[683,0,361,21,339],74:[683,22,514,25,465],75:[683,0,778,24,736],76:[683,0,625,25,582],77:[683,0,917,29,887],78:[683,0,750,25,724],79:[705,22,778,56,722],80:[684,0,681,27,624],81:[705,193,778,56,728],82:[684,22,736,27,732],83:[706,23,556,55,500],84:[677,0,722,36,685],85:[684,22,750,25,724],86:[683,23,750,19,730],87:[683,23,1028,18,1009],88:[683,1,750,23,727],89:[684,0,750,11,738],90:[683,1,611,55,560],91:[750,250,278,118,255],92:[750,250,500,56,444],93:[750,250,278,22,159],94:[694,-531,500,112,387],95:[-25,62,500,0,499],96:[699,-505,500,106,295],97:[448,11,500,34,493],98:[694,11,556,20,522],99:[448,11,444,34,415],100:[694,11,556,34,535],101:[448,11,444,28,415],102:[705,0,306,25,372],103:[453,206,500,29,485],104:[695,0,556,25,543],105:[669,0,278,26,255],106:[669,205,306,-55,218],107:[695,0,528,20,512],108:[694,0,278,26,263],109:[443,0,833,25,820],110:[443,0,556,25,543],111:[448,10,500,28,471],112:[443,194,556,20,522],113:[442,194,528,33,535],114:[442,0,392,20,364],115:[449,12,394,32,359],116:[615,10,389,18,334],117:[442,11,556,25,542],118:[431,11,528,19,508],119:[432,12,722,18,704],120:[431,0,528,10,516],121:[431,204,528,19,508],122:[431,0,444,28,401],123:[750,250,500,64,434],124:[750,250,278,119,159],125:[750,250,500,64,435],126:[318,-215,500,83,416],160:[0,0,250,0,0],168:[669,-554,500,95,404],172:[356,-89,667,55,611],175:[590,-544,500,69,430],176:[715,-542,500,147,352],177:[666,0,778,55,722],180:[699,-505,500,203,393],215:[491,-9,778,147,631],247:[537,36,778,55,721],305:[442,0,278,26,255],567:[442,205,306,-55,218],710:[694,-531,500,112,387],711:[644,-513,500,114,385],713:[590,-544,500,69,430],714:[699,-505,500,203,393],715:[699,-505,500,106,295],728:[694,-515,500,92,407],729:[669,-549,500,190,309],732:[668,-565,500,83,416],915:[681,0,625,25,582],916:[716,0,833,46,786],920:[705,22,778,56,722],923:[717,0,694,32,661],926:[677,0,667,42,624],928:[680,0,750,25,724],931:[683,1,722,55,666],933:[705,0,778,55,722],934:[683,0,722,56,665],936:[683,0,778,54,722],937:[704,1,722,44,677],8194:[0,0,500,0,0],8195:[0,0,999,0,0],8196:[0,0,333,0,0],8197:[0,0,250,0,0],8198:[0,0,167,0,0],8201:[0,0,167,0,0],8202:[0,0,83,0,0],8211:[285,-248,500,0,499],8212:[285,-248,1000,0,999],8216:[694,-379,278,64,198],8217:[694,-379,278,78,212],8220:[694,-379,500,128,466],8221:[694,-379,500,34,372],8224:[705,217,444,55,390],8225:[705,206,444,55,389],8230:[120,0,1172,78,1093],8242:[560,-43,275,30,262],8407:[714,-516,0,-471,-29],8463:[695,13,540,42,562],8465:[705,11,722,54,693],8467:[706,20,417,6,398],8472:[453,216,636,67,625],8476:[717,22,722,40,716],8501:[694,1,611,54,556],8592:[511,12,1000,54,944],8593:[694,194,500,17,483],8594:[512,11,1000,55,945],8595:[694,194,500,17,483],8596:[511,11,1000,55,945],8597:[772,272,500,17,483],8598:[720,196,1000,29,944],8599:[720,195,1000,55,970],8600:[695,220,1000,55,970],8601:[695,220,1000,29,944],8614:[512,11,1000,54,945],8617:[511,12,1126,54,1070],8618:[512,11,1126,55,1071],8636:[511,-230,1000,55,944],8637:[270,11,1000,55,944],8640:[511,-230,1000,55,944],8641:[270,11,1000,55,945],8652:[671,11,1000,55,944],8656:[525,24,1000,55,944],8657:[694,194,611,31,579],8658:[525,25,1000,55,944],8659:[694,194,611,31,579],8660:[525,25,1000,34,966],8661:[772,272,611,31,580],8704:[694,22,556,0,556],8706:[715,22,531,41,566],8707:[694,0,556,55,500],8709:[772,78,500,39,460],8711:[683,33,833,46,786],8712:[541,41,667,84,584],8713:[716,215,667,84,584],8715:[541,40,667,83,582],8722:[270,-230,778,83,694],8723:[500,167,778,55,722],8725:[751,250,500,56,445],8726:[750,250,500,56,444],8727:[465,-34,500,64,435],8728:[444,-55,500,55,444],8729:[444,-55,500,55,444],8730:[800,200,833,72,853],8733:[442,11,778,56,722],8734:[442,11,1000,55,944],8736:[694,0,722,55,666],8739:[750,250,278,119,159],8741:[750,250,500,132,367],8743:[598,22,667,55,611],8744:[598,22,667,55,611],8745:[598,22,667,55,611],8746:[599,22,667,55,611],8747:[716,216,417,55,472],8764:[367,-133,778,55,722],8768:[583,83,278,55,222],8771:[464,-36,778,55,722],8773:[589,-22,1000,55,722],8776:[483,-55,778,55,722],8781:[484,-16,778,55,722],8784:[670,-133,778,55,722],8800:[716,215,778,55,722],8801:[464,-36,778,55,722],8804:[636,138,778,83,694],8805:[636,138,778,82,694],8810:[568,68,1000,56,944],8811:[567,67,1000,55,945],8826:[539,41,778,84,695],8827:[539,41,778,83,694],8834:[540,41,778,84,695],8835:[541,40,778,82,693],8838:[636,139,778,84,695],8839:[637,138,778,83,693],8846:[599,22,667,55,611],8849:[636,138,778,83,714],8850:[636,138,778,63,694],8851:[598,0,667,61,605],8852:[598,0,667,61,605],8853:[583,83,778,56,722],8854:[583,83,778,56,722],8855:[583,83,778,56,722],8856:[583,83,778,56,722],8857:[583,83,778,56,722],8866:[694,0,611,55,555],8867:[694,0,611,55,555],8868:[668,0,778,55,723],8869:[668,0,778,55,723],8872:[750,250,867,119,811],8900:[488,-12,500,12,488],8901:[310,-190,278,78,199],8902:[486,-16,500,3,497],8904:[505,6,900,25,873],8942:[900,30,278,78,199],8943:[310,-190,1172,78,1093],8945:[820,-100,1282,133,1148],8968:[751,250,444,174,422],8969:[751,250,444,21,269],8970:[750,251,444,174,422],8971:[751,251,444,20,269],8994:[388,-122,1000,55,944],8995:[378,-134,1000,55,944],9136:[744,245,412,55,357],9137:[745,244,412,55,357],10216:[750,250,389,110,333],10217:[750,250,389,55,278],10222:[744,245,412,173,357],10223:[744,245,412,55,240],10229:[511,12,1609,54,1525],10230:[512,11,1638,83,1554],10231:[512,12,1859,54,1804],10232:[525,24,1609,55,1553],10233:[525,25,1638,55,1582],10234:[525,24,1858,55,1802],10236:[512,11,1638,54,1554],10815:[684,0,750,28,721],10927:[636,138,778,83,695],10928:[636,138,778,83,694]};g.FONTDATA.FONTS["MathJax_Math-italic"]={directory:"Math/Italic",family:"MathJax_Math",style:"italic",testString:"MathJax Math",skew:{65:0.139,66:0.0833,67:0.0833,68:0.0556,69:0.0833,70:0.0833,71:0.0833,72:0.0556,73:0.111,74:0.167,75:0.0556,76:0.0278,77:0.0833,78:0.0833,79:0.0833,80:0.0833,81:0.0833,82:0.0833,83:0.0833,84:0.0833,85:0.0278,88:0.0833,90:0.0833,99:0.0556,100:0.167,101:0.0556,102:0.167,103:0.0278,104:-0.0278,108:0.0833,111:0.0556,112:0.0833,113:0.0833,114:0.0556,115:0.0556,116:0.0833,117:0.0278,118:0.0278,119:0.0833,120:0.0278,121:0.0556,122:0.0556,915:0.0833,916:0.167,920:0.0833,923:0.167,926:0.0833,928:0.0556,931:0.0833,933:0.0556,934:0.0833,936:0.0556,937:0.0833,945:0.0278,946:0.0833,948:0.0556,949:0.0833,950:0.0833,951:0.0556,952:0.0833,953:0.0556,956:0.0278,957:0.0278,958:0.111,959:0.0556,961:0.0833,962:0.0833,964:0.0278,965:0.0278,966:0.0833,967:0.0556,968:0.111,977:0.0833,981:0.0833,1009:0.0833,1013:0.0556},32:[0,0,250,0,0],47:[716,215,778,139,638],65:[717,0,750,35,727],66:[683,0,759,35,756],67:[705,22,715,50,760],68:[683,1,828,32,804],69:[680,1,738,30,764],70:[681,0,643,30,749],71:[705,22,786,50,760],72:[683,0,831,31,889],73:[684,0,440,26,504],74:[683,22,555,57,633],75:[684,0,849,31,889],76:[684,1,681,32,647],77:[684,0,970,35,1051],78:[684,0,803,31,888],79:[704,22,763,50,740],80:[683,0,642,33,751],81:[704,195,791,50,740],82:[683,22,759,33,755],83:[705,22,613,52,645],84:[678,0,584,21,705],85:[684,22,683,59,767],86:[683,23,583,52,769],87:[684,22,944,51,1048],88:[684,1,828,25,852],89:[683,-1,581,29,763],90:[684,1,683,58,724],97:[441,10,529,33,506],98:[694,11,429,39,422],99:[442,11,433,34,429],100:[694,10,520,33,524],101:[442,11,466,39,429],102:[705,205,490,55,550],103:[443,205,477,10,480],104:[694,11,576,48,555],105:[661,11,345,21,303],106:[661,204,412,-12,403],107:[694,11,521,48,503],108:[694,11,298,38,267],109:[442,11,878,21,857],110:[442,11,600,21,580],111:[441,11,485,34,476],112:[442,194,503,-39,497],113:[442,194,446,33,460],114:[442,11,451,21,430],115:[442,10,469,53,419],116:[626,11,361,19,330],117:[442,11,572,21,551],118:[443,11,485,21,467],119:[444,11,716,20,690],120:[443,11,572,35,523],121:[442,205,490,21,496],122:[442,12,465,35,468],160:[0,0,250,0,0],915:[680,-1,615,31,721],916:[716,1,833,48,788],920:[704,22,763,50,740],923:[717,0,694,35,671],926:[678,1,742,53,777],928:[681,0,831,31,888],931:[683,0,780,58,806],933:[706,0,583,28,701],934:[683,0,667,24,643],936:[684,0,612,21,693],937:[704,0,772,80,786],945:[442,11,640,34,603],946:[706,194,566,23,573],947:[441,216,518,11,543],948:[717,10,444,36,451],949:[453,22,466,27,428],950:[704,204,438,44,472],951:[442,216,497,21,504],952:[705,10,469,35,462],953:[442,10,354,48,332],954:[442,11,576,49,554],955:[694,12,583,46,556],956:[443,216,603,22,580],957:[442,2,494,45,530],958:[704,205,438,21,443],959:[441,11,485,34,476],960:[431,11,570,19,573],961:[442,216,517,22,510],962:[442,108,363,31,405],963:[431,11,571,31,572],964:[431,13,437,17,517],965:[443,10,540,21,523],966:[442,219,654,50,618],967:[442,204,626,24,601],968:[694,205,651,21,634],969:[444,11,622,15,604],977:[705,11,591,21,563],981:[695,206,596,43,579],982:[431,10,828,19,823],1009:[442,194,517,67,510],1013:[432,11,406,39,383]};g.FONTDATA.FONTS.MathJax_Size1={directory:"Size1/Regular",family:"MathJax_Size1",testString:"() [] {}",32:[0,0,250,0,0],40:[850,349,458,152,422],41:[851,349,458,35,305],47:[850,349,578,55,522],91:[850,349,417,202,394],92:[850,349,578,54,522],93:[850,349,417,22,214],123:[850,349,583,104,477],125:[851,349,583,104,477],160:[0,0,250,0,0],710:[744,-551,556,-8,564],732:[722,-597,556,1,554],770:[744,-551,0,-564,8],771:[722,-597,0,-555,-2],8214:[602,0,778,257,521],8593:[600,0,667,112,555],8595:[600,0,667,112,555],8657:[599,0,778,57,721],8659:[600,-1,778,57,721],8719:[750,250,944,55,888],8720:[750,250,944,55,888],8721:[751,250,1056,56,999],8730:[850,350,1000,111,1020],8739:[627,15,333,145,188],8741:[627,15,556,145,410],8747:[805,306,472,55,610],8748:[805,306,819,55,957],8749:[805,306,1166,55,1304],8750:[805,306,472,55,610],8896:[750,249,833,55,777],8897:[750,249,833,55,777],8898:[750,249,833,54,777],8899:[750,250,833,55,777],8968:[850,349,472,202,449],8969:[850,349,472,22,269],8970:[850,349,472,202,449],8971:[850,349,472,22,269],9168:[602,0,667,312,355],10216:[850,350,472,97,394],10217:[850,350,472,77,374],10752:[750,250,1111,56,1054],10753:[750,250,1111,56,1054],10754:[750,250,1111,56,1054],10756:[750,250,833,55,777],10758:[750,249,833,55,777]};g.FONTDATA.FONTS.MathJax_Size2={directory:"Size2/Regular",family:"MathJax_Size2",testString:"() [] {}",32:[0,0,250,0,0],40:[1150,649,597,180,561],41:[1151,649,597,35,416],47:[1150,649,811,55,755],91:[1150,649,472,224,455],92:[1150,649,811,54,754],93:[1150,649,472,16,247],123:[1150,649,667,119,547],125:[1151,649,667,119,547],160:[0,0,250,0,0],710:[772,-565,1000,-5,1004],732:[750,-611,1000,0,999],770:[772,-565,0,-1005,4],771:[750,-611,0,-1000,-1],8719:[950,450,1278,56,1221],8720:[950,450,1278,56,1221],8721:[950,450,1444,55,1388],8730:[1150,650,1000,111,1020],8747:[1360,862,556,55,944],8748:[1361,862,1084,55,1473],8749:[1361,862,1592,55,1981],8750:[1360,862,556,55,944],8896:[950,450,1111,55,1055],8897:[950,450,1111,55,1055],8898:[949,450,1111,55,1055],8899:[950,449,1111,55,1055],8968:[1150,649,528,224,511],8969:[1150,649,528,16,303],8970:[1150,649,528,224,511],8971:[1150,649,528,16,303],10216:[1150,649,611,112,524],10217:[1150,649,611,85,498],10752:[949,449,1511,56,1454],10753:[949,449,1511,56,1454],10754:[949,449,1511,56,1454],10756:[950,449,1111,55,1055],10758:[950,450,1111,55,1055]};g.FONTDATA.FONTS.MathJax_Size3={directory:"Size3/Regular",family:"MathJax_Size3",testString:"() [] {}",32:[0,0,250,0,0],40:[1450,949,736,209,701],41:[1451,949,736,34,526],47:[1450,949,1044,55,989],91:[1450,949,528,247,516],92:[1450,949,1044,56,988],93:[1450,949,528,11,280],123:[1450,949,750,130,618],125:[1451,949,750,131,618],160:[0,0,250,0,0],710:[772,-564,1444,-4,1447],732:[749,-610,1444,1,1442],770:[772,-564,0,-1448,3],771:[749,-610,0,-1443,-2],8730:[1450,951,1000,111,1020],8968:[1450,949,583,246,571],8969:[1450,949,583,11,336],8970:[1450,949,583,246,571],8971:[1450,949,583,11,336],10216:[1450,950,750,126,654],10217:[1450,950,750,94,623]};g.FONTDATA.FONTS.MathJax_Size4={directory:"Size4/Regular",family:"MathJax_Size4",testString:"() [] {}",32:[0,0,250,0,0],40:[1750,1249,792,237,758],41:[1751,1250,792,33,554],47:[1750,1249,1278,56,1221],91:[1750,1249,583,269,577],92:[1750,1249,1278,56,1221],93:[1750,1249,583,5,313],123:[1750,1249,806,144,662],125:[1751,1249,806,144,662],160:[0,0,250,0,0],710:[845,-561,1889,-14,1902],732:[823,-583,1889,1,1885],770:[845,-561,0,-1903,13],771:[823,-583,0,-1888,-4],8730:[1750,1251,1000,111,1020],8968:[1750,1249,639,269,633],8969:[1750,1249,639,5,369],8970:[1750,1249,639,269,633],8971:[1750,1249,639,5,369],9115:[1155,655,875,290,843],9116:[610,10,875,291,417],9117:[1165,644,875,291,843],9118:[1155,655,875,31,583],9119:[610,10,875,457,583],9120:[1165,645,875,31,583],9121:[1154,645,667,319,666],9122:[602,0,667,319,403],9123:[1155,644,667,319,666],9124:[1154,645,667,0,347],9125:[602,0,667,263,347],9126:[1155,644,667,0,347],9127:[899,10,889,383,719],9128:[1160,660,889,170,505],9129:[10,899,889,384,718],9130:[310,10,889,383,504],9131:[900,11,889,170,504],9132:[1160,660,889,384,718],9133:[10,899,889,170,505],9143:[935,885,1056,111,742],10216:[1750,1249,806,140,703],10217:[1751,1249,806,103,665],57344:[625,15,1056,702,742],57345:[605,15,1056,702,1076],57680:[120,213,450,-24,461],57681:[120,214,450,-11,475],57682:[333,0,450,-24,461],57683:[333,0,450,-11,475],57684:[120,0,400,-10,410]};g.FONTDATA.FONTS.MathJax_Main[8942][0]+=400;g.FONTDATA.FONTS.MathJax_Main[8945][0]+=700;g.FONTDATA.FONTS.MathJax_Size4[57684][0]+=200;g.FONTDATA.FONTS.MathJax_Size4[57684][1]+=200;if(!g.imgFonts){MathJax.Hub.Browser.Select({MSIE:function(q){if(g.config.availableFonts&&g.config.availableFonts.length){g.FONTDATA.REMAP[713]=175;g.FONTDATA.REMAP[714]=180;g.FONTDATA.REMAP[715]=96;g.FONTDATA.REMAP[730]=176;var p=g.msieCheckGreek=String.fromCharCode(915)+" "+String.fromCharCode(933)+" "+String.fromCharCode(923);g.FONTDATA.RANGES.push({name:"IEgreek",low:945,high:969,offset:"IEG",add:32});g.FONTDATA.RANGES.push({name:"IEGreek",low:913,high:1014,offset:"IEG"});if(g.Font.testFont({family:"MathJax_Greek",testString:p})){g.Augment({FONTDATA:{VARIANT:{normal:{offsetIEG:913,variantIEG:"-Greek"},fraktur:{offsetIEG:913,variantIEG:"-Greek"},script:{offsetIEG:913,variantIEG:"-Greek"},"-tex-caligraphic":{offsetIEG:913,variantIEG:"-Greek"},"-tex-oldstyle":{offsetIEG:913,variantIEG:"-Greek"},"-Greek":{fonts:["MathJax_Greek"]}}}});g.FONTDATA.FONTS.MathJax_Greek={directory:"Greek/Regular",family:"MathJax_Greek",testString:String.fromCharCode(915)+" "+String.fromCharCode(933)+" "+String.fromCharCode(923),32:[0,0,250,0,0],160:[0,0,250,0,0],915:[680,0,625,25,582],916:[716,0,833,46,786],920:[705,22,778,56,722],923:[716,0,694,32,661],926:[677,0,667,42,624],928:[680,0,750,25,724],931:[683,0,722,55,666],933:[705,0,778,55,722],934:[683,0,722,56,665],936:[683,0,778,55,722],937:[704,0,722,44,677]}}if(g.Font.testFont({family:"MathJax_Greek",weight:"bold",testString:p})){g.Augment({FONTDATA:{VARIANT:{bold:{offsetIEG:913,variantIEG:"-Greek-Bold"},"bold-fraktur":{offsetIEG:913,variantIEG:"-Greek-Bold"},"bold-script":{offsetIEG:913,variantIEG:"-Greek-Bold"},"-Greek-Bold":{fonts:["MathJax_Greek-bold"]}}}});g.FONTDATA.FONTS["MathJax_Greek-bold"]={directory:"Greek/Bold",family:"MathJax_Greek",weight:"bold",testString:String.fromCharCode(915)+" "+String.fromCharCode(933)+" "+String.fromCharCode(923),32:[0,0,250,0,0],160:[0,0,250,0,0],915:[680,0,692,39,643],916:[698,0,958,56,901],920:[696,10,894,64,829],923:[698,0,806,40,765],926:[675,0,767,48,718],928:[680,0,900,39,860],931:[686,0,831,64,766],933:[697,0,894,64,829],934:[686,0,831,64,766],936:[686,0,894,64,829],937:[696,1,831,51,779]}}if(g.Font.testFont({family:"MathJax_Greek",style:"italic",testString:p})){g.Augment({FONTDATA:{VARIANT:{italic:{offsetIEG:913,variantIEG:"-Greek-Italic"},"-Greek-Italic":{fonts:["MathJax_Greek-italic"]}}}});g.FONTDATA.FONTS["MathJax_Greek-italic"]={directory:"Greek/Italic",family:"MathJax_Greek",style:"italic",testString:String.fromCharCode(915)+" "+String.fromCharCode(933)+" "+String.fromCharCode(923),skew:{915:0.0833,916:0.167,920:0.0833,923:0.167,926:0.0833,928:0.0556,931:0.0833,933:0.0556,934:0.0833,936:0.0556,937:0.0833,945:0.0278,946:0.0833,948:0.0556,949:0.0833,950:0.0833,951:0.0556,952:0.0833,953:0.0556,956:0.0278,957:0.0278,958:0.111,959:0.0556,961:0.0833,962:0.0833,964:0.0278,965:0.0278,966:0.0833,967:0.0556,968:0.111,977:0.0833,981:0.0833,1009:0.0833,1013:0.0556},32:[0,0,250,0,0],160:[0,0,250,0,0],915:[680,-1,615,31,721],916:[716,0,833,48,788],920:[704,22,763,50,740],923:[716,0,694,35,670],926:[678,0,742,53,777],928:[681,0,831,31,887],931:[683,0,780,58,806],933:[705,0,583,28,700],934:[683,0,667,24,642],936:[683,0,612,21,692],937:[704,0,772,80,786],945:[442,11,640,34,603],946:[705,194,566,23,573],947:[441,216,518,11,543],948:[717,10,444,36,451],949:[452,22,466,27,428],950:[704,204,438,44,471],951:[442,216,497,21,503],952:[705,10,469,35,462],953:[442,10,354,48,332],954:[442,11,576,49,554],955:[694,12,583,47,556],956:[442,216,603,23,580],957:[442,2,494,45,530],958:[704,205,438,21,443],959:[441,11,485,34,476],960:[431,11,570,19,573],961:[442,216,517,23,510],962:[442,107,363,31,405],963:[431,11,571,31,572],964:[431,13,437,18,517],965:[443,10,540,21,523],966:[442,218,654,50,618],967:[442,204,626,25,600],968:[694,205,651,21,634],969:[443,11,622,15,604],977:[705,11,591,21,563],981:[694,205,596,43,579],982:[431,10,828,19,823],1009:[442,194,517,67,510],1013:[431,11,406,40,382]}}}if(g.msieIE6){var s="MathJax_WinIE6";g.FONTDATA.FONTS[s]="WinIE6/Regular/Main.js";g.FONTDATA.RANGES.push({name:"arrows",low:8592,high:8601,offset:"AR"});var r={variant:"-WinIE6",8658:57866,8660:57867,8704:57868,8706:57869,8707:57870,8711:57871,8712:57872,8715:57873,8725:57874,8730:57875,8733:57876,8734:57877,8736:57878,8739:57879,8741:57880,8743:57881,8744:57882,8745:57883,8746:57884,8747:57885,8764:57886,8776:57887,8800:57888,8801:57889,8804:57890,8805:57891,8810:57892,8811:57893,8834:57894,8835:57895,8838:57896,8839:57897,8853:57898,8857:57899,8869:57900,9651:57901,9661:57902,9711:57903,9824:57904,9825:57905,9826:57906,9827:57907,9837:57908,9838:57909,9839:57910,8806:58053,8807:58054,8814:58055,8815:58056,9484:58058,9488:58059,9492:58060,9496:58061,9585:58062,9586:58063,9632:58064,9633:58065,9650:58066,9654:58068,9660:58069,9661:58070,9664:58071,9674:58072,8756:58073,8757:58074,8786:58075,9733:58076,8765:58077};var u={variant:"-WinIE6",8658:57930,8660:57931,8704:57932,8706:57933,8707:57934,8711:57935,8712:57936,8715:57937,8725:57938,8730:57939,8733:57940,8734:57941,8736:57942,8739:57943,8741:57944,8743:57945,8744:57946,8745:57947,8746:57948,8747:57949,8764:57950,8776:57951,8800:57952,8801:57953,8804:57954,8805:57955,8810:57956,8811:57957,8834:57958,8835:57959,8838:57960,8839:57961,8853:57962,8857:57963,8869:57964,9651:57965,9661:57966,9711:57967,9824:57968,9825:57969,9826:57970,9827:57971,9837:57972,9838:57973,9839:57974,8806:58053,8807:58054,8814:58055,8815:58056,9484:58058,9488:58059,9492:58060,9496:58061,9585:58062,9586:58063,9632:58064,9633:58065,9650:58066,9654:58068,9660:58069,9661:58070,9664:58071,9674:58072,8756:58073,8757:58074,8786:58075,9733:58076,8765:58077};var o={offsetAR:57856,variantAR:"-WinIE6",remap:r};var t={offsetAR:57920,variantAR:"-WinIE6",remap:u};g.Augment({FONTDATA:{VARIANT:{normal:o,bold:t,italic:o,"bold-italic":t,"-largeOp":{fonts:[s,c,d,f],remap:{8719:58000,8721:58001,8747:58005,8750:58006}},"-smallOp":{fonts:[s,d,f],remap:{8719:57984,8721:57985,8747:57989,8750:57990}},"-WinIE6":{fonts:[s]}},DELIMITERS:{8730:{HW:{0:[1,s,null,57875],1:[1.2,s,null,57986],2:[1.8,s,null,58002],3:[2.4,s,null,58018],4:[3,s,null,58034]}},124:{stretch:{ext:[57879,s]}},8739:{HW:{0:[1,s,null,57879]},stretch:{ext:[57879,s]}},9168:{HW:{1:[1,s,null,57879]},stretch:{ext:[57879,s]}},8741:{HW:{0:[1,s,null,57880]},stretch:{ext:[57880,s]}},8592:{HW:{0:[0.889,s,null,57856]},stretch:{left:[57856,s]}},8593:{HW:{0:[0.888,s,null,57857]},stretch:{top:[57991,s],ext:[57993,s]}},8594:{HW:{0:[0.889,s,null,57858]},stretch:{right:[57858,s]}},8595:{HW:{0:[0.888,s,null,57859]},stretch:{bot:[57992,s],ext:[57993,s]}},8596:{HW:{0:[1,s,null,57860]},stretch:{left:[57856,s],right:[57858,s]}},8597:{HW:{0:[1.044,s,null,57859]},stretch:{top:[57991,s],bot:[57992,s],ext:[57993,s]}}}}})}},Chrome:function(p){if(p.isPC&&!MathJax.Hub.Browser.versionAtLeast("5.0")){var o="-WinChrome";g.Augment({FONTDATA:{VARIANT:{normal:{remap:{62:[62,o]}},bold:{remap:{58097:[62,o]}},italic:{remap:{100:[100,o]}},"-tex-caligraphic":{remap:{84:[84,o]}},"-largeOp":{remap:{10752:[10752,o]}},"-smallOp":{remap:{8899:[8899,o]}},"-WinChrome":{fonts:["MathJax_WinChrome"]}},DELIMITERS:{93:{stretch:{bot:[9126,"MathJax_WinChrome"]}},8971:{stretch:{bot:[9126,"MathJax_WinChrome"]}}}}});g.FONTDATA.FONTS.MathJax_WinChrome={directory:"WinChrome/Regular",family:"MathJax_WinChrome",testString:"> T d "+String.fromCharCode(9126)+" "+String.fromCharCode(10752),skew:{84:0.0278,58096:0.0319},32:[0,0,250,0,0],62:[540,40,778,82,694],84:[717,69,545,34,834],100:[694,11,511,100,567],160:[0,0,250,0,0],8899:[750,250,833,55,777],9126:[1155,644,667,0,347],10752:[949,449,1511,56,1454],58096:[720,69,644,38,947],58097:[587,85,894,95,797]}}}})}(function(){var r=g.FONTDATA.FONTS,q=g.config.availableFonts;var p,o=[];if(g.allowWebFonts){for(p in r){if(r[p].family){if(q&&q.length&&g.Font.testFont(r[p])){r[p].available=true;g.Font.loadComplete(r[p])}else{r[p].isWebFont=true;if(g.FontFaceBug){r[p].family=p}o.push(g.Font.fontFace(p))}}}if(!g.config.preloadWebFonts){g.config.preloadWebFonts=[]}g.config.preloadWebFonts.push(f,h,d);if(o.length){g.config.styles["@font-face"]=o}}else{if(q&&q.length){for(p in r){if(r[p].family&&g.Font.testFont(r[p])){r[p].available=true;g.Font.loadComplete(r[p])}}}}})();k.loadComplete(g.fontDir+"/fontdata.js")})(MathJax.OutputJax["HTML-CSS"],MathJax.ElementJax.mml,MathJax.Ajax);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/imageFonts.js b/static/MathJax/jax/output/HTML-CSS/imageFonts.js
new file mode 100644
index 0000000..6216e0c
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/imageFonts.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/imageFonts.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(b,c,a){var d="1.1";b.Register.LoadHook(c.fontDir+"/fontdata.js",function(){c.Augment({allowWebFonts:false,imgDir:c.webfontDir+"/png",imgPacked:(MathJax.isPacked?"":"/unpacked"),imgSize:["050","060","071","085",100,120,141,168,200,238,283,336,400,476],imgBaseIndex:4,imgSizeForEm:{},imgSizeForScale:{},imgZoom:1,handleImg:function(t,i,r,h,u){if(u.length){this.addText(t,u)}var s=r[5].orig;if(!s){s=r[5].orig=[r[0],r[1],r[2],r[3],r[4]]}var m=this.imgZoom;if(!t.scale){t.scale=1}var p=this.imgIndex(t.scale*m);if(p==this.imgEmWidth.length-1&&this.em*t.scale*m/this.imgEmWidth[p]>1.1){m=this.imgEmWidth[p]/(this.em*t.scale)}var q=this.imgEmWidth[p]/(this.em*(t.scale||1)*m);r[0]=s[0]*q;r[1]=s[1]*q;r[2]=s[2]*q;r[3]=s[3]*q;r[4]=s[4]*q;var k=this.imgDir+"/"+i.directory+"/"+this.imgSize[p];var l=h.toString(16).toUpperCase();while(l.length<4){l="0"+l}var j=k+"/"+l+".png";var o=r[5].img[p];var g={width:Math.floor(o[0]/m+0.5)+"px",height:Math.floor(o[1]/m+0.5)+"px"};if(o[2]){g.verticalAlign=Math.floor(-o[2]/m+0.5)+"px"}if(r[3]<0){g.marginLeft=this.Em(r[3]/1000)}if(r[4]!=r[2]){g.marginRight=this.Em((r[2]-r[4])/1000)}if(this.msieIE6){g.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+a.fileURL(j)+"', sizingMethod='scale')";j=this.directory+"/blank.gif"}this.addElement(t,"img",{src:a.fileURL(j),style:g});return""},defineImageData:function(i){for(var g in i){if(i.hasOwnProperty(g)){var h=c.FONTDATA.FONTS[g];if(h){g=i[g];for(var j in g){if(g.hasOwnProperty(j)&&h[j]){h[j][5]={img:g[j]}}}}}}},initImg:function(j){if(this.imgSizeForEm[this.em]){this.imgBaseIndex=this.imgSizeForEm[this.em]}for(var h=0,g=this.imgEmWidth.length-1;h<g;h++){if(this.em<=this.imgEmWidth[h]){break}}if(h&&this.imgEmWidth[h]-this.em>this.em-this.imgEmWidth[h-1]){h--}this.imgSizeForEm[this.em]=this.imgBaseIndex=h;this.imgZoom=this.imgBrowserZoom()},imgIndex:function(k){if(!k){return this.imgBaseIndex}if(!this.imgSizeForScale[this.em]){this.imgSizeForScale[this.em]={}}if(this.imgSizeForScale[this.em][k]){return this.imgSizeForScale[this.em][k]}var j=this.em*k;for(var h=0,g=this.imgEmWidth.length-1;h<g;h++){if(j<=this.imgEmWidth[h]){break}}if(h&&this.imgEmWidth[h]-j>j-this.imgEmWidth[h-1]){h--}this.imgSizeForScale[this.em][k]=h;return h},imgBrowserZoom:function(){return 1}});b.Browser.Select({Firefox:function(h){var g=c.addElement(document.body,"div",{style:{display:"none",visibility:"hidden",overflow:"scroll",position:"absolute",top:0,left:0,width:"200px",height:"200px",padding:0,border:0,margin:0}});var i=c.addElement(g,"div",{style:{position:"absolute",left:0,top:0,right:0,bottom:0,padding:0,border:0,margin:0}});c.Augment({imgSpaceBug:true,imgSpace:String.fromCharCode(160),imgZoomLevel:(h.isMac?{50:0.3,30:0.5,22:0.67,19:0.8,16:0.9,15:1,13:1.1,12:1.2,11:1.33,10:1.5,9:1.7,7:2,6:2.4,5:3,0:15}:{56:0.3,34:0.5,25:0.67,21:0.8,19:0.9,17:1,15:1.1,14:1.2,13:1.33,11:1.5,10:1.7,8:2,7:2.4,6:3,0:17}),imgZoomDiv:g,imgBrowserZoom:function(){var j=this.imgZoomLevel;g.style.display="";var k=(g.offsetWidth-i.offsetWidth);k=(j[k]?j[k]:j[0]/k);g.style.display="none";return k}})},Safari:function(g){c.Augment({imgBrowserZoom:function(){return 3}})},Chrome:function(g){c.Augment({imgHeightBug:true,imgBrowserZoom:function(){return 3}})},Opera:function(g){c.Augment({imgSpaceBug:true,imgSpace:String.fromCharCode(160)+String.fromCharCode(160),imgDoc:(document.compatMode=="BackCompat"?document.body:document.documentElement),imgBrowserZoom:function(){if(g.isMac){return 3}var h=this.imgDoc.clientHeight,i=Math.floor(15*h/window.innerHeight);if(this.imgDoc.clientWidth<this.imgDoc.scrollWidth-i){h+=i}return parseFloat((window.innerHeight/h).toFixed(1))}})}});var f=function(){var h=c.FONTDATA.FONTS.MathJax_Main[8212][5].img;c.imgEmWidth=[];for(var j=0,g=h.length;j<g;j++){c.imgEmWidth[j]=h[j][0]}};var e=c.imgDir+c.imgPacked;MathJax.Callback.Queue(["Require",a,e+"/imagedata.js"],f,["loadComplete",a,c.directory+"/imageFonts.js"])})})(MathJax.Hub,MathJax.OutputJax["HTML-CSS"],MathJax.Ajax);
+
diff --git a/static/MathJax/jax/output/HTML-CSS/jax.js b/static/MathJax/jax/output/HTML-CSS/jax.js
new file mode 100644
index 0000000..a08b641
--- /dev/null
+++ b/static/MathJax/jax/output/HTML-CSS/jax.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/HTML-CSS/jax.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(c,d,e){var a;var b=MathJax.Object.Subclass({timeout:5*1000,FontInfo:{STIX:{family:"STIXSizeOneSym",testString:"() {} []"},TeX:{family:"MathJax_Size1",testString:"() {} []"}},comparisonFont:["sans-serif","monospace","script","Times","Courier","Arial","Helvetica"],testSize:["40px","50px","60px","30px","20px"],Init:function(){this.div=MathJax.HTML.addElement(document.body,"div",{style:{position:"absolute",visibility:"hidden",top:0,left:0,width:"auto",padding:0,border:0,margin:0,textAlign:"left",textIndent:0,textTransform:"none",lineHeight:"normal",letterSpacing:"normal",wordSpacing:"normal",fontSize:this.testSize[0],fontWeight:"normal",fontStyle:"normal"}},[""]);this.text=this.div.firstChild},findFont:function(j,g){if(g&&this.testCollection(g)){return g}for(var h=0,f=j.length;h<f;h++){if(j[h]===g){continue}if(this.testCollection(j[h])){return j[h]}}return null},testCollection:function(f){return this.testFont(this.FontInfo[f])},testFont:function(h){if(h.isWebFont&&e.FontFaceBug){this.div.style.fontWeight=this.div.style.fontStyle="normal"}else{this.div.style.fontWeight=(h.weight||"normal");this.div.style.fontStyle=(h.style||"normal")}var g=this.getComparisonWidths(h.testString,h.noStyleChar);if(g){this.div.style.fontFamily="'"+h.family+"',"+this.comparisonFont[0];if(this.div.offsetWidth==g[0]){this.div.style.fontFamily="'"+h.family+"',"+this.comparisonFont[g[2]];if(this.div.offsetWidth==g[1]){return false}}if(this.div.offsetWidth!=g[3]){if(h.noStyleChar||!e.FONTDATA||!e.FONTDATA.hasStyleChar){return true}for(var j=0,f=this.testSize.length;j<f;j++){if(this.testStyleChar(h,this.testSize[j])){return true}}}}return false},styleChar:String.fromCharCode(61437),versionChar:String.fromCharCode(61438),compChar:String.fromCharCode(61439),testStyleChar:function(h,j){var m=3+(h.weight?2:0)+(h.style?4:0);var g="",i=0;var l=this.div.style.fontSize;this.div.style.fontSize=j;if(e.msieItalicWidthBug&&h.style==="italic"){this.text.nodeValue=g=this.compChar;i=this.div.offsetWidth}if(e.safariTextNodeBug){this.div.innerHTML=this.compChar+g}else{this.text.nodeValue=this.compChar+g}var f=this.div.offsetWidth-i;if(e.safariTextNodeBug){this.div.innerHTML=this.styleChar+g}else{this.text.nodeValue=this.styleChar+g}var k=Math.floor((this.div.offsetWidth-i)/f+0.5);if(k===m){if(e.safariTextNodeBug){this.div.innerHTML=this.versionChar+g}else{this.text.nodeValue=this.versionChar+g}h.version=Math.floor((this.div.offsetWidth-i)/f+1.5)/2}this.div.style.fontSize=l;return(k===m)},getComparisonWidths:function(j,h){if(e.FONTDATA&&e.FONTDATA.hasStyleChar&&!h){j+=this.styleChar+" "+this.compChar}if(e.safariTextNodeBug){this.div.innerHTML=j}else{this.text.nodeValue=j}this.div.style.fontFamily=this.comparisonFont[0];var g=this.div.offsetWidth,l=-1;if(e.safariWebFontSerif){this.div.style.fontFamily=e.safariWebFontSerif[0];l=this.div.offsetWidth}for(var k=1,f=this.comparisonFont.length;k<f;k++){this.div.style.fontFamily=this.comparisonFont[k];if(this.div.offsetWidth!=g){return[g,this.div.offsetWidth,k,l]}}return null},loadWebFont:function(g){d.Startup.signal.Post("HTML-CSS Jax - Web-Font "+e.fontInUse+"/"+g.directory);var i=MathJax.Message.File("Web-Font "+e.fontInUse+"/"+g.directory);var f=MathJax.Callback({});var h=MathJax.Callback(["loadComplete",this,g,i,f]);c.timer.start(c,[this.checkWebFont,g,h],1,this.timeout);return f},loadComplete:function(h,j,g,f){MathJax.Message.Clear(j);if(f===c.STATUS.OK){g();return}this.loadError(h);if(d.Browser.isFirefox&&e.allowWebFonts){var i=document.location.protocol+"//"+document.location.hostname;if(document.location.port!=""){i+=":"+document.location.port}i+="/";if(c.fileURL(e.webfontDir).substr(0,i.length)!==i){this.firefoxFontError(h)}}e.loadWebFontError(h,g)},loadError:function(f){MathJax.Message.Set("Can't load web font "+e.fontInUse+"/"+f.directory,null,2000)},firefoxFontError:function(f){MathJax.Message.Set("Firefox can't load web fonts from a remote host",null,3000)},checkWebFont:function(f,g,h){if(f.time(h)){return}if(e.Font.testFont(g)){h(f.STATUS.OK)}else{setTimeout(f,f.delay)}},fontFace:function(h){var i=e.allowWebFonts;var k=e.FONTDATA.FONTS[h];if(e.msieFontCSSBug&&!k.family.match(/-Web$/)){k.family+="-Web"}var g=c.fileURL(e.webfontDir+"/"+i);var f=h.replace(/-b/,"-B").replace(/-i/,"-I").replace(/-Bold-/,"-Bold");if(!f.match(/-/)){f+="-Regular"}if(i==="svg"){f+=".svg#"+f}else{f+="."+i}var j={"font-family":k.family,src:"url('"+g+"/"+f+"')"};if(i==="svg"){j.src+=" format('svg')"}if(!(e.FontFaceBug&&k.isWebFont)){if(h.match(/-bold/)){j["font-weight"]="bold"}if(h.match(/-italic/)){j["font-style"]="italic"}}return j}});e.Augment({config:{styles:{".MathJax":{display:"inline","font-family":"serif","font-style":"normal","font-weight":"normal","line-height":"normal","font-size":"100%","font-size-adjust":"none","text-indent":0,"text-align":"left","text-transform":"none","letter-spacing":"normal","word-spacing":"normal","word-wrap":"normal","white-space":"nowrap","float":"none",direction:"ltr",border:0,padding:0,margin:0},".MathJax_Display":{position:"relative",display:"block",width:"100%"},".MathJax img, .MathJax nobr, .MathJax a":{border:0,padding:0,margin:0,"max-width":"none","max-height":"none","vertical-align":0,"line-height":"normal","text-decoration":"none"},"img.MathJax_strut":{border:"0 !important",padding:"0 !important",margin:"0 !important","vertical-align":"0 !important"},".MathJax span":{display:"inline",position:"static",border:0,padding:0,margin:0,"vertical-align":0,"line-height":"normal","text-decoration":"none"},".MathJax nobr":{"white-space":"nowrap"},".MathJax img":{display:"inline ! important"},".MathJax_Processing":{visibility:"hidden",position:"fixed",width:0,height:0,overflow:"hidden"},".MathJax .MathJax_HitBox":{cursor:"text"},"#MathJax_Tooltip":{position:"absolute",left:0,top:0,width:"auto",height:"auto",display:"none"},"#MathJax_Tooltip *":{filter:"none",background:"transparent"}}},settings:d.config.menuSettings,LEFTBUTTON:(d.Browser.isMSIE?1:0),MENUKEY:"altKey",Font:null,Config:function(){this.Font=b();this.SUPER(arguments).Config.call(this);var g=this.settings;if(this.adjustAvailableFonts){this.adjustAvailableFonts(this.config.availableFonts)}if(g.scale){this.config.scale=g.scale}if(g.font&&g.font!=="Auto"){if(g.font==="TeX (local)"){this.config.availableFonts=["TeX"];this.config.preferredFont="TeX";this.config.webFont="TeX"}else{if(g.font==="STIX (local)"){this.config.availableFonts=["STIX"];this.config.preferredFont="STIX";this.config.webFont="TeX"}else{if(g.font==="TeX (web)"){this.config.availableFonts=[];this.config.preferredFont="";this.config.webFont="TeX"}else{if(g.font==="TeX (image)"){this.config.availableFonts=[];this.config.preferredFont="";this.config.webFont=""}}}}}var f=this.Font.findFont(this.config.availableFonts,this.config.preferredFont);if(!f&&this.allowWebFonts){f=this.config.webFont;if(f){this.webFonts=true}}if(!f&&this.config.imageFont){f=this.config.imageFont;this.imgFonts=true}if(f){this.fontInUse=f;this.fontDir+="/"+f;this.webfontDir+="/"+f;if(!this.require){this.require=[]}this.require.push(this.fontDir+"/fontdata.js");if(this.imgFonts){this.require.push(this.directory+"/imageFonts.js");d.Startup.signal.Post("HTML-CSS Jax - using image fonts")}}else{MathJax.Message.Set("Can't find a valid font using ["+this.config.availableFonts.join(", ")+"]",null,3000);this.FONTDATA={TeX_factor:1,baselineskip:1.2,lineH:0.8,lineD:0.2,ffLineH:0.8,FONTS:{},VARIANT:{normal:{fonts:[]}},RANGES:[],DELIMITERS:{},RULECHAR:45,REMAP:{}};if(MathJax.InputJax.TeX&&MathJax.InputJax.TeX.Definitions){MathJax.InputJax.TeX.Definitions.macros.overline[1]="002D";MathJax.InputJax.TeX.Definitions.macros.underline[1]="002D"}d.Startup.signal.Post("HTML-CSS Jax - no valid font")}},Startup:function(){var h=[],l=this.FONTDATA.VARIANT.normal.fonts;if(!(l instanceof Array)){l=[l]}for(var g=0,f=l.length;g<f;g++){h[g]=this.FONTDATA.FONTS[l[g]].family;if(!h[g]){h[g]=l[g]}}this.config.styles[".MathJax .math span"]=this.config.styles["#MathJax_getScales"]={"font-family":h.join(",")};this.hiddenDiv=this.Element("div",{style:{visibility:"hidden",overflow:"hidden",position:"absolute",top:0,height:"1px",width:"auto",padding:0,border:0,margin:0,textAlign:"left",textIndent:0,textTransform:"none",lineHeight:"normal",letterSpacing:"normal",wordSpacing:"normal"}});if(!document.body.firstChild){document.body.appendChild(this.hiddenDiv)}else{document.body.insertBefore(this.hiddenDiv,document.body.firstChild)}this.hiddenDiv=this.addElement(this.hiddenDiv,"div",{id:"MathJax_Hidden"});var k=this.addElement(this.hiddenDiv,"div",{style:{width:"5in"}});this.pxPerInch=k.offsetWidth/5;this.hiddenDiv.removeChild(k);this.startMarker=e.createStrut(this.Element("span"),10,true);this.endMarker=this.addText(this.Element("span"),"x").parentNode;this.HDspan=this.Element("span");if(this.operaHeightBug){this.createStrut(this.HDspan,0)}if(this.msieInlineBlockAlignBug){this.HDimg=this.addElement(this.HDspan,"img",{style:{height:"0px",width:"1px"}});try{this.HDimg.src="about:blank"}catch(j){}}else{this.HDimg=e.createStrut(this.HDspan,0)}this.HDMspan=this.Element("span",{style:{position:"absolute","font-size-adjust":"none"}});if(this.msieInlineBlockAlignBug){this.HDMimg=this.addElement(this.HDMspan,"img",{style:{height:"0px",width:"1px","max-width":"none","max-height":"none",border:0,padding:0,margin:0}});try{this.HDMimg.src="about:blank"}catch(j){}}else{this.HDMimg=e.createStrut(this.HDMspan,0);this.HDMimg.style.marginRight=""}this.marginCheck=e.Element("span",null,[["span",{style:{display:"inline-block",width:"5em"}}]]);this.marginMove=e.addElement(this.marginCheck,"span",{style:{display:"inline-block",width:"5em",marginLeft:"-5em"}});return c.Styles(this.config.styles,["PreloadWebFonts",this])},PreloadWebFonts:function(){if(!e.allowWebFonts||!e.config.preloadWebFonts){return}for(var g=0,f=e.config.preloadWebFonts.length;g<f;g++){var h=e.FONTDATA.FONTS[e.config.preloadWebFonts[g]];if(!h.available){e.Font.testFont(h)}}},Translate:function(l){if(!l.parentNode){return}var j=l.previousSibling;if(j&&String(j.className).match(/^MathJax(_MathML|_Display)?$/)){j.parentNode.removeChild(j)}var m=l.MathJax.elementJax.root,n,f,h;n=f=h=this.Element("span",{className:"MathJax",oncontextmenu:this.ContextMenu,onmousedown:this.Mousedown,onmouseover:this.Mouseover,onclick:this.Click,ondblclick:this.DblClick});var i=(m.Get("display")==="block");if(i){f=h=this.Element("div",{className:"MathJax_Display",style:{width:"100%",position:"relative"}});f.appendChild(n)}f.setAttribute("role","textbox");f.setAttribute("aria-readonly","true");if(this.useProcessingFrame){h=this.Element((i?"div":"span"),{className:"MathJax_Processing"});h.appendChild(f)}l.parentNode.insertBefore(h,l);var g;try{this.getScales(n);g=(this.em===0||String(this.em)==="NaN")}catch(k){g=true}if(g){this.hiddenDiv.appendChild(h);this.getScales(n)}this.initImg(n);this.initHTML(m,n);m.setTeXclass();try{m.toHTML(n,f)}catch(k){if(k.restart){h.parentNode.removeChild(h)}throw k}if(g){l.parentNode.insertBefore(h,l)}if(this.useProcessingFrame){h.parentNode.replaceChild(f,h)}},ContextMenu:function(i,j){if(e.config.showMathMenu&&(e.settings.context==="MathJax"||j)){if(e.safariContextMenuBug){setTimeout("window.getSelection().empty()",0)}if(!i||e.msieEventBug){i=window.event}var f=MathJax.Menu;if(f){var h=(this.parentNode.className==="MathJax_Display"?this.parentNode:this);f.jax=d.getJaxFor(h.nextSibling);f.menu.items[1].menu.items[1].name=(f.jax.inputJax.id==="MathML"?"Original":f.jax.inputJax.id);return f.menu.Post(i)}else{if(!c.loadingMathMenu){c.loadingMathMenu=true;var g={pageX:i.pageX,pageY:i.pageY,clientX:i.clientX,clientY:i.clientY};MathJax.Callback.Queue(c.Require("[MathJax]/extensions/MathMenu.js"),function(){delete c.loadingMathMenu},[this,arguments.callee,g,j])}if(!i){i=window.event}if(i.preventDefault){i.preventDefault()}if(i.stopPropagation){i.stopPropagation()}i.cancelBubble=true;i.returnValue=false;return false}}},Mousedown:function(f){if(e.config.showMathMenu){if(!f){f=window.event}if(e.settings.context==="MathJax"){if(!e.noContextMenuBug||f.button!==2){return}}else{if(!f[e.MENUKEY]||f.button!==e.LEFTBUTTON){return}}return e.ContextMenu.call(this,f,true)}},Mouseover:function(f){e.HandleEvent(f,"Mouseover",this)},Click:function(f){e.HandleEvent(f,"Click",this)},DblClick:function(f){e.HandleEvent(f,"DblClick",this)},HandleEvent:function(h,f,g){},initImg:function(f){},initHTML:function(g,f){},initFont:function(f){var h=e.FONTDATA.FONTS,g=e.config.availableFonts;if(g&&g.length&&e.Font.testFont(h[f])){h[f].available=true;return null}if(!this.allowWebFonts){return null}h[f].isWebFont=true;if(e.FontFaceBug){h[f].family=f;if(e.msieFontCSSBug){h[f].family+="-Web"}}return c.Styles({"@font-face":this.Font.fontFace(f)})},Remove:function(f){var g=f.SourceElement();if(!g){return}g=g.previousSibling;if(!g){return}if(g.className.match(/^MathJax/)){g.parentNode.removeChild(g)}},getScales:function(h){h.parentNode.insertBefore(this.HDMspan,h);this.HDMspan.className="";this.HDMspan.id="";this.HDMspan.style.fontSize="";this.HDMimg.style.height="1px";this.HDMimg.style.width="60ex";var g=this.HDMspan.offsetWidth/60;this.HDMspan.className="MathJax";this.HDMspan.id="MathJax_getScales";this.HDMimg.style.width="60em";var f=this.outerEm=this.HDMspan.offsetWidth/60;this.scale=Math.floor(Math.max(this.config.minScaleAdjust/100,(g/this.TeX.x_height)/f)*this.config.scale);h.style.fontSize=this.HDMspan.style.fontSize=this.scale+"%";this.em=a.mbase.prototype.em=this.HDMspan.offsetWidth/60;if(this.operaFontSizeBug&&f===this.em&&this.scale!==100){this.em=a.mbase.prototype.em=f*this.scale/100}h.parentNode.removeChild(this.HDMspan);this.msieMarginScale=this.getMarginScale(h)},getMarginScale:function(f){return 1},getMSIEmarginScale:function(h){h.appendChild(this.marginCheck);var f=this.marginCheck.offsetWidth,g=this.marginMove.offsetWidth;var i=(2*g-f?g/(2*g-f):1);h.removeChild(this.marginCheck);return i},getHD:function(g){var f=g.style.position;g.style.position="absolute";this.HDimg.style.height="0px";g.appendChild(this.HDspan);var h={h:g.offsetHeight};this.HDimg.style.height=h.h+"px";h.d=g.offsetHeight-h.h;h.h-=h.d;h.h/=this.em;h.d/=this.em;g.removeChild(this.HDspan);g.style.position=f;return h},getW:function(i){var g=i.offsetWidth,h=(i.bbox?i.bbox.w:-1),j=i;if((h<0||this.negativeSkipBug)&&g>=0){if(this.negativeSkipBug){var f=i.style.position;i.style.position="absolute";j=this.startMarker;if(i.firstChild){i.insertBefore(j,i.firstChild)}else{i.appendChild(j)}j=this.startMarker}i.appendChild(this.endMarker);g=this.endMarker.offsetLeft-j.offsetLeft;i.removeChild(this.endMarker);if(this.negativeSkipBug){i.removeChild(j);i.style.position=f}}return g/this.em},Measured:function(h,g){if(h.bbox.width==null&&h.bbox.w&&!h.bbox.isMultiline){var f=this.getW(h);h.bbox.rw+=f-h.bbox.w;h.bbox.w=f}if(!g){g=h.parentNode}if(!g.bbox){g.bbox=h.bbox}return h},Remeasured:function(g,f){f.bbox=this.Measured(g,f).bbox},Em:function(f){if(Math.abs(f)<0.0006){return"0em"}return f.toFixed(3).replace(/\.?0+$/,"")+"em"},Percent:function(f){return(100*f).toFixed(1).replace(/\.?0+$/,"")+"%"},length2percent:function(f){return this.Percent(this.length2em(f))},length2em:function(k,i){if(typeof(k)!=="string"){k=k.toString()}if(k===""){return""}if(k===a.SIZE.NORMAL){return 1}if(k===a.SIZE.BIG){return 2}if(k===a.SIZE.SMALL){return 0.71}if(k==="infinity"){return e.BIGDIMEN}var h=this.FONTDATA.TeX_factor;if(k.match(/mathspace$/)){return e.MATHSPACE[k]*h}var g=k.match(/^\s*([-+]?(?:\.\d+|\d+(?:\.\d*)?))?(pt|em|ex|mu|px|pc|in|mm|cm|%)?/);var f=parseFloat(g[1]||"1"),j=g[2];if(i==null){i=1}if(j==="em"){return f*h}if(j==="ex"){return f*e.TeX.x_height*h}if(j==="%"){return f/100*i}if(j==="px"){return f/e.em}if(j==="pt"){return f/10*h}if(j==="pc"){return f*1.2*h}if(j==="in"){return f*this.pxPerInch/e.em}if(j==="cm"){return f*this.pxPerInch/e.em/2.54}if(j==="mm"){return f*this.pxPerInch/e.em/25.4}if(j==="mu"){return f/18*h}return f*h*i},thickness2em:function(f){var g=e.TeX.rule_thickness;if(f===a.LINETHICKNESS.MEDIUM){return g}if(f===a.LINETHICKNESS.THIN){return 0.67*g}if(f===a.LINETHICKNESS.THICK){return 1.67*g}return this.length2em(f,g)},createStrut:function(i,g,j){var f=this.Element("span",{style:{display:"inline-block",overflow:"hidden",height:g+"px",width:"1px",marginRight:"-1px"}});if(j){i.insertBefore(f,i.firstChild)}else{i.appendChild(f)}return f},createBlank:function(g,f,h){var i=this.Element("span",{style:{display:"inline-block",overflow:"hidden",height:"1px",width:this.Em(f)}});if(h){g.insertBefore(i,g.firstChild)}else{g.appendChild(i)}return i},createShift:function(g,f,i){var h=this.Element("span",{style:{marginLeft:this.Em(f)}});if(i){g.insertBefore(h,g.firstChild)}else{g.appendChild(h)}return h},createSpace:function(k,j,m,f,g){var i=this.Em(Math.max(0,j+m)),l=this.Em(-m);if(this.msieInlineBlockAlignBug){l=this.Em(e.getHD(k.parentNode).d-m)}if(k.isBox||k.className=="mspace"){k.bbox={h:j*k.scale,d:m*k.scale,w:f*k.scale,rw:f*k.scale,lw:0};k.style.height=i;k.style.verticalAlign=l}else{k=this.addElement(k,"span",{style:{height:i,verticalAlign:l}})}if(f>=0){k.style.width=this.Em(f);k.style.display="inline-block"}else{if(this.msieNegativeSpaceBug){k.style.height=""}k.style.marginLeft=this.Em(f);if(e.safariNegativeSpaceBug&&k.parentNode.firstChild==k){this.createBlank(k,0,true)}}if(g&&g!==a.COLOR.TRANSPARENT){k.style.backgroundColor=g}return k},createRule:function(o,k,m,p,i){var j=e.TeX.min_rule_thickness;if(p>0&&p*this.em<j){p=j/this.em}if(k+m>0&&(k+m)*this.em<j){var l=1/(k+m)*(j/this.em);k*=l;m*=l}if(!i){i="solid"}else{i="solid "+i}i=this.Em(p)+" "+i;var q=this.Em(k+m),g=this.Em(-m);var n=this.addElement(o,"span",{style:{borderLeft:i,display:"inline-block",overflow:"hidden",width:0,height:q,verticalAlign:g},bbox:{h:k,d:m,w:p,rw:p,lw:0},noAdjust:true});if(p>0&&n.offsetWidth==0){n.style.width=this.Em(p)}if(o.isBox||o.className=="mspace"){o.bbox=n.bbox}return n},createFrame:function(o,m,n,p,r,g){var l=(this.msieBorderWidthBug?0:2*r);var q=this.Em(m+n-l),f=this.Em(-n-r),k=this.Em(p-l);var i=this.Em(r)+" "+g;var j=this.addElement(o,"span",{style:{border:i,display:"inline-block",overflow:"hidden",width:k,height:q},bbox:{h:m,d:n,w:p,rw:p,lw:0},noAdjust:true});if(f){j.style.verticalAlign=f}return j},createStack:function(h,j,g){if(this.msiePaddingWidthBug){this.createStrut(h,0)}var i=String(g).match(/%$/);var f=(!i&&g!=null?g:0);h=this.addElement(h,"span",{noAdjust:true,style:{display:"inline-block",position:"relative",width:(i?"100%":this.Em(f)),height:0}});if(!j){h.parentNode.bbox=h.bbox={h:-this.BIGDIMEN,d:-this.BIGDIMEN,w:f,lw:this.BIGDIMEN,rw:(!i&&g!=null?g:-this.BIGDIMEN)};if(i){h.bbox.width=g}}return h},createBox:function(g,f){var h=this.addElement(g,"span",{style:{position:"absolute"},isBox:true});if(f!=null){h.style.width=f}return h},addBox:function(f,g){g.style.position="absolute";g.isBox=true;return f.appendChild(g)},placeBox:function(n,m,k,i){var o=n.parentNode,v=n.bbox,q=o.bbox;if(this.msiePlaceBoxBug){this.addText(n,this.NBSP)}if(this.imgSpaceBug){this.addText(n,this.imgSpace)}var p=n.offsetHeight/this.em+1,z=0;if(n.noAdjust){p-=1}else{if(this.msieInlineBlockAlignBug){this.addElement(n,"img",{className:"MathJax_strut",border:0,src:"about:blank",style:{width:0,height:this.Em(p)}})}else{this.addElement(n,"span",{style:{display:"inline-block",width:0,height:this.Em(p)}})}}n.style.top=this.Em(-k-p);n.style.left=this.Em(m+z);if(v){if(this.negativeSkipBug){if(v.lw<0){z=v.lw;e.createBlank(n,-z,true);h=0}if(v.rw>v.w){e.createBlank(n,v.rw-v.w+0.1)}}if(!this.msieClipRectBug&&!v.noclip&&!i){var u=3/this.em;var s=(v.H==null?v.h:v.H),g=(v.D==null?v.d:v.D);var w=p-s-u,j=p+g+u,h=v.lw-3*u,f=1000;if(v.isFixed){f=v.width-h}n.style.clip="rect("+this.Em(w)+" "+this.Em(f)+" "+this.Em(j)+" "+this.Em(h)+")"}}if(v&&q){if(v.H!=null&&(q.H==null||v.H+k>q.H)){q.H=v.H+k}if(v.D!=null&&(q.D==null||v.D-k>q.D)){q.D=v.D-k}if(v.h+k>q.h){q.h=v.h+k}if(v.d-k>q.d){q.d=v.d-k}if(q.H!=null&&q.H<=q.h){delete q.H}if(q.D!=null&&q.D<=q.d){delete q.D}if(v.w+m>q.w){q.w=v.w+m;if(q.width==null){o.style.width=this.Em(q.w)}}if(v.rw+m>q.rw){q.rw=v.rw+m}if(v.lw+m<q.lw){q.lw=v.lw+m}if(v.width!=null&&!v.isFixed){if(q.width==null){o.style.width=q.width="100%"}n.style.width=v.width}}},alignBox:function(h,n,m){this.placeBox(h,0,m);var j=h.bbox;if(j.isMultiline){return}var g=j.width!=null&&!j.isFixed;var i=0,k=-j.w/2,f="50%";if(this.negativeSkipBug){i=j.w-j.rw-0.1;k+=j.lw}k=this.Em(k*this.msieMarginScale);if(g){k="";f=(50-parseFloat(j.width)/2)+"%"}d.Insert(h.style,({right:{left:"",right:this.Em(i)},center:{left:f,marginLeft:k}})[n])},setStackWidth:function(g,f){if(typeof(f)==="number"){g.style.width=this.Em(Math.max(0,f));if(g.bbox){g.bbox.w=f}if(g.parentNode.bbox){g.parentNode.bbox.w=f}}else{g.style.width=g.parentNode.style.width="100%";if(g.bbox){g.bbox.width=f}if(g.parentNode.bbox){g.parentNode.bbox.width=f}}},createDelimiter:function(q,f,h,l,j){if(!f){q.bbox={h:0,d:0,w:this.TeX.nulldelimiterspace,lw:0};q.bbox.rw=q.bbox.w;this.createSpace(q,q.bbox.h,q.bbox.d,q.bbox.w);return}if(!l){l=1}if(!(h instanceof Array)){h=[h,h]}var p=h[1];h=h[0];var g={alias:f};while(g.alias){f=g.alias;g=this.FONTDATA.DELIMITERS[f];if(!g){g={HW:[0,this.FONTDATA.VARIANT[a.VARIANT.NORMAL]]}}}for(var o=0,k=g.HW.length;o<k;o++){if(g.HW[o][0]*l>=h-0.01||(o==k-1&&!g.stretch)){if(g.HW[o][2]){l*=g.HW[o][2]}if(g.HW[o][3]){f=g.HW[o][3]}var n=this.addElement(q,"span");this.createChar(n,[f,g.HW[o][1]],l,j);q.bbox=n.bbox;q.offset=0.65*q.bbox.w;q.scale=l;return}}if(g.stretch){this["extendDelimiter"+g.dir](q,p,g.stretch,l,j)}},extendDelimiterV:function(v,p,A,B,s){var i=this.createStack(v,true);var r=this.createBox(i),q=this.createBox(i);this.createChar(r,(A.top||A.ext),B,s);this.createChar(q,(A.bot||A.ext),B,s);var g={bbox:{w:0,lw:0,rw:0}},z=g,j;var w=r.bbox.h+r.bbox.d+q.bbox.h+q.bbox.d;var m=-r.bbox.h;this.placeBox(r,0,m,true);m-=r.bbox.d;if(A.mid){z=this.createBox(i);this.createChar(z,A.mid,B,s);w+=z.bbox.h+z.bbox.d}if(p>w){g=this.Element("span");this.createChar(g,A.ext,B,s);var x=g.bbox.h+g.bbox.d,f=x-0.05,t,l,u=(A.mid?2:1);l=t=Math.ceil((p-w)/(u*f));if(!A.fullExtenders){f=(p-w)/(u*t)}var o=(t/(t+1))*(x-f);f=x-o;m+=o+f-g.bbox.h;while(u-->0){while(t-->0){if(!this.msieCloneNodeBug){j=g.cloneNode(true)}else{j=this.Element("span");this.createChar(j,A.ext,B,s)}m-=f;this.placeBox(this.addBox(i,j),0,m,true)}m+=o-g.bbox.d;if(A.mid&&u){this.placeBox(z,0,m-z.bbox.h,true);t=l;m+=-(z.bbox.h+z.bbox.d)+o+f-g.bbox.h}}}else{m+=(w-p)/2;if(A.mid){this.placeBox(z,0,m-z.bbox.h,true);m+=-(z.bbox.h+z.bbox.d)}m+=(w-p)/2}this.placeBox(q,0,m-q.bbox.h,true);m-=q.bbox.h+q.bbox.d;v.bbox={w:Math.max(r.bbox.w,g.bbox.w,q.bbox.w,z.bbox.w),lw:Math.min(r.bbox.lw,g.bbox.lw,q.bbox.lw,z.bbox.lw),rw:Math.max(r.bbox.rw,g.bbox.rw,q.bbox.rw,z.bbox.rw),h:0,d:-m};v.scale=B;v.offset=0.55*v.bbox.w;v.isMultiChar=true;this.setStackWidth(i,v.bbox.w)},extendDelimiterH:function(u,h,z,B,r){var l=this.createStack(u,true);var i=this.createBox(l),v=this.createBox(l);this.createChar(i,(z.left||z.rep),B,r);this.createChar(v,(z.right||z.rep),B,r);var f=this.Element("span");this.createChar(f,z.rep,B,r);var y={bbox:{h:-this.BIGDIMEN,d:-this.BIGDIMEN}},g;this.placeBox(i,-i.bbox.lw,0,true);var p=(i.bbox.rw-i.bbox.lw)+(v.bbox.rw-v.bbox.lw)-0.05,o=i.bbox.rw-i.bbox.lw-0.025,q;if(z.mid){y=this.createBox(l);this.createChar(y,z.mid,B,r);p+=y.bbox.w}if(h>p){var A=f.bbox.rw-f.bbox.lw,j=A-0.05,s,m,t=(z.mid?2:1);m=s=Math.ceil((h-p)/(t*j));j=(h-p)/(t*s);q=(s/(s+1))*(A-j);j=A-q;o-=f.bbox.lw+q;while(t-->0){while(s-->0){if(!this.msieCloneNodeBug){g=f.cloneNode(true)}else{g=this.Element("span");this.createChar(g,z.rep,B,r)}this.placeBox(this.addBox(l,g),o,0,true);o+=j}if(z.mid&&t){this.placeBox(y,o,0,true);o+=y.bbox.w-q;s=m}}}else{q=Math.min(p-h,i.bbox.w/2);o-=q/2;if(z.mid){this.placeBox(y,o,0,true);o+=y.bbox.w}o-=q/2}this.placeBox(v,o,0,true);u.bbox={w:o+v.bbox.rw,lw:0,rw:o+v.bbox.rw,H:Math.max(i.bbox.h,f.bbox.h,v.bbox.h,y.bbox.h),D:Math.max(i.bbox.d,f.bbox.d,v.bbox.d,y.bbox.d),h:f.bbox.h,d:f.bbox.d};u.scale=B;u.isMultiChar=true;this.setStackWidth(l,u.bbox.w)},createChar:function(o,k,h,f){var n=o,p="",j={fonts:[k[1]],noRemap:true};if(f&&f===a.VARIANT.BOLD){j.fonts=[k[1]+"-bold",k[1]]}if(typeof(k[1])!=="string"){j=k[1]}if(k[0] instanceof Array){for(var l=0,g=k[0].length;l<g;l++){p+=String.fromCharCode(k[0][l])}}else{p=String.fromCharCode(k[0])}if(h!==1){n=this.addElement(o,"span",{style:{fontSize:this.Percent(h)},scale:h});this.handleVariant(n,j,p);o.bbox=n.bbox}else{this.handleVariant(o,j,p)}if(k[2]){o.style.marginLeft=this.Em(k[2])}if(this.AccentBug&&o.bbox.w===0){n.firstChild.nodeValue+=this.NBSP;e.createSpace(o,0,0,-o.offsetWidth/e.em)}},positionDelimiter:function(g,f){f-=g.bbox.h;g.bbox.d-=f;g.bbox.h+=f;if(f){if(this.safariVerticalAlignBug||this.msieVerticalAlignBug||this.konquerorVerticalAlignBug||(this.operaVerticalAlignBug&&g.isMultiChar)){if(g.firstChild.style.display===""&&g.style.top!==""){g=g.firstChild;f-=parseFloat(g.style.top)}g.style.position="relative";g.style.top=this.Em(-f)}else{g.style.verticalAlign=this.Em(f);if(e.ffVerticalAlignBug){e.createRule(g.parentNode,g.bbox.h,0,0)}}}},handleVariant:function(v,j,o){var u="",s,y,p,g,x,z,f=v;if(o.length===0){return}if(!v.bbox){v.bbox={w:0,h:-this.BIGDIMEN,d:-this.BIGDIMEN,rw:-this.BIGDIMEN,lw:this.BIGDIMEN}}if(!j){j=this.FONTDATA.VARIANT[a.VARIANT.NORMAL]}z=j;for(var w=0,t=o.length;w<t;w++){j=z;s=o.charCodeAt(w);y=o.charAt(w);if(y===this.PLANE1){w++;s=o.charCodeAt(w)+119808-56320;if(this.FONTDATA.RemapPlane1){var A=this.FONTDATA.RemapPlane1(s,j);s=A.n;j=A.variant}}else{var q,l,r=this.FONTDATA.RANGES;for(q=0,l=r.length;q<l;q++){if(r[q].name==="alpha"&&j.noLowerCase){continue}var k=j["offset"+r[q].offset];if(k&&s>=r[q].low&&s<=r[q].high){if(r[q].remap&&r[q].remap[s]){s=k+r[q].remap[s]}else{s=s-r[q].low+k;if(r[q].add){s+=r[q].add}}if(j["variant"+r[q].offset]){j=this.FONTDATA.VARIANT[j["variant"+r[q].offset]]}break}}}if(j.remap&&j.remap[s]){if(j.remap[s] instanceof Array){var h=j.remap[s];s=h[0];j=this.FONTDATA.VARIANT[h[1]]}else{s=j.remap[s];if(j.remap.variant){j=this.FONTDATA.VARIANT[j.remap.variant]}}}if(this.FONTDATA.REMAP[s]&&!j.noRemap){s=this.FONTDATA.REMAP[s]}p=this.lookupChar(j,s);y=p[s];if(j!==x&&!y[5].img){if(u.length){this.addText(f,u);u=""}f=v;x=g;if(j!==x){if(x){f=this.addElement(v,"span")}else{g=j}}this.handleFont(f,p,f!==v);x=j}u=this.handleChar(f,p,y,s,u);if(y[0]/1000>v.bbox.h){v.bbox.h=y[0]/1000}if(y[1]/1000>v.bbox.d){v.bbox.d=y[1]/1000}if(v.bbox.w+y[3]/1000<v.bbox.lw){v.bbox.lw=v.bbox.w+y[3]/1000}if(v.bbox.w+y[4]/1000>v.bbox.rw){v.bbox.rw=v.bbox.w+y[4]/1000}v.bbox.w+=y[2]/1000}if(u.length){this.addText(f,u)}if(v.scale&&v.scale!==1){v.bbox.h*=v.scale;v.bbox.d*=v.scale;v.bbox.w*=v.scale;v.bbox.lw*=v.scale;v.bbox.rw*=v.scale}if(o.length==1&&p.skew&&p.skew[s]){v.bbox.skew=p.skew[s]}},handleFont:function(h,f,j){h.style.fontFamily=f.family;if(!(e.FontFaceBug&&f.isWebFont)){var g=f.style||"normal",i=f.weight||"normal";if(g!=="normal"||j){h.style.fontStyle=g}if(i!=="normal"||j){h.style.fontWeight=i}}},handleChar:function(g,f,l,k,j){var i=l[5];if(i.img){return this.handleImg(g,f,l,k,j)}if(i.isUnknown&&this.FONTDATA.DELIMITERS[k]){if(j.length){this.addText(g,j)}var h=g.scale;e.createDelimiter(g,k,0,1,f);g.scale=h;l[0]=g.bbox.h*1000;l[1]=g.bbox.d*1000;l[2]=g.bbox.w*1000;l[3]=g.bbox.lw*1000;l[4]=g.bbox.rw*1000;return""}if(i.c==null){if(k<=65535){i.c=String.fromCharCode(k)}else{i.c=this.PLANE1+String.fromCharCode(k-119808+56320)}}if(l[2]||!this.msieAccentBug||j.length){return j+i.c}e.createShift(g,l[3]/1000);e.createShift(g,(l[4]-l[3])/1000);this.addText(g,i.c);e.createShift(g,-l[4]/1000);return""},handleImg:function(g,f,j,i,h){return h},lookupChar:function(j,p){var h,f;if(!j.FONTS){var o=this.FONTDATA.FONTS;var l=(j.fonts||this.FONTDATA.VARIANT.normal.fonts);if(!(l instanceof Array)){l=[l]}if(j.fonts!=l){j.fonts=l}j.FONTS=[];for(h=0,f=l.length;h<f;h++){if(o[l[h]]){j.FONTS.push(o[l[h]]);o[l[h]].name=l[h]}}}for(h=0,f=j.FONTS.length;h<f;h++){var g=j.FONTS[h];if(typeof(g)==="string"){delete j.FONTS;this.loadFont(g)}if(g[p]){if(g[p].length===5){g[p][5]={}}if(e.allowWebFonts&&!g.available){this.loadWebFont(g)}else{return g}}else{this.findBlock(g,p)}}var k=(j.defaultFont||{family:e.config.undefinedFamily});if(j.bold){k.weight="bold"}if(j.italic){k.style="italic"}k[p]=[800,200,500,0,500,{isUnknown:true}];return k},findBlock:function(g,n){if(g.Ranges){for(var l=0,f=g.Ranges.length;l<f;l++){if(n<g.Ranges[l][0]){return}if(n<=g.Ranges[l][1]){var k=g.Ranges[l][2];for(var h=g.Ranges.length-1;h>=0;h--){if(g.Ranges[h][2]==k){g.Ranges.splice(h,1)}}this.loadFont(g.directory+"/"+k+".js")}}}},loadFont:function(g){var f=MathJax.Callback.Queue();f.Push(["Require",c,this.fontDir+"/"+g]);if(this.imgFonts){if(!MathJax.isPacked){g=g.replace(/\/([^\/]*)$/,e.imgPacked+"/$1")}f.Push(["Require",c,this.webfontDir+"/png/"+g])}d.RestartAfter(f.Push({}))},loadWebFont:function(f){f.available=f.isWebFont=true;if(e.FontFaceBug){f.family=f.name;if(e.msieFontCSSBug){f.family+="-Web"}}d.RestartAfter(this.Font.loadWebFont(f))},loadWebFontError:function(g,f){d.Startup.signal.Post("HTML-CSS Jax - disable web fonts");g.isWebFont=false;if(this.config.imageFont&&this.config.imageFont===this.fontInUse){this.imgFonts=true;d.Startup.signal.Post("HTML-CSS Jax - switch to image fonts");d.Startup.signal.Post("HTML-CSS Jax - using image fonts");MathJax.Message.Set("Web-Fonts not available -- using image fonts instead",null,3000);c.Require(this.directory+"/imageFonts.js",f)}else{this.allowWebFonts=false;f()}},Element:MathJax.HTML.Element,addElement:MathJax.HTML.addElement,TextNode:MathJax.HTML.TextNode,addText:MathJax.HTML.addText,ucMatch:MathJax.HTML.ucMatch,BIGDIMEN:10000000,ID:0,idPostfix:"",GetID:function(){this.ID++;return this.ID},MATHSPACE:{veryverythinmathspace:1/18,verythinmathspace:2/18,thinmathspace:3/18,mediummathspace:4/18,thickmathspace:5/18,verythickmathspace:6/18,veryverythickmathspace:7/18,negativeveryverythinmathspace:-1/18,negativeverythinmathspace:-2/18,negativethinmathspace:-3/18,negativemediummathspace:-4/18,negativethickmathspace:-5/18,negativeverythickmathspace:-6/18,negativeveryverythickmathspace:-7/18},TeX:{x_height:0.430554,quad:1,num1:0.676508,num2:0.393732,num3:0.44373,denom1:0.685951,denom2:0.344841,sup1:0.412892,sup2:0.362892,sup3:0.288888,sub1:0.15,sub2:0.247217,sup_drop:0.386108,sub_drop:0.05,delim1:2.39,delim2:1,axis_height:0.25,rule_thickness:0.06,big_op_spacing1:0.111111,big_op_spacing2:0.166666,big_op_spacing3:0.2,big_op_spacing4:0.6,big_op_spacing5:0.1,scriptspace:0.1,nulldelimiterspace:0.12,delimiterfactor:901,delimitershortfall:0.1,min_rule_thickness:1.25},PLANE1:String.fromCharCode(55349),NBSP:String.fromCharCode(160),rfuzz:0});MathJax.Hub.Register.StartupHook("mml Jax Ready",function(){a=MathJax.ElementJax.mml;a.mbase.Augment({toHTML:function(l){var j=this.HTMLlineBreaks();if(j.length>2){return this.toHTMLmultiline(l,j)}l=this.HTMLcreateSpan(l);if(this.type!="mrow"){l=this.HTMLhandleSize(l)}for(var g=0,f=this.data.length;g<f;g++){if(this.data[g]){this.data[g].toHTML(l)}}var o=this.HTMLcomputeBBox(l);var k=l.bbox.h,n=l.bbox.d;for(g=0,f=o.length;g<f;g++){o[g].HTMLstretchV(l,k,n)}if(o.length){this.HTMLcomputeBBox(l,true)}this.HTMLhandleSpace(l);this.HTMLhandleColor(l);return l},HTMLlineBreaks:function(){var k=[[0,this]];for(var h=0,f=this.data.length;h<f;h++){if(this.data[h]){var l=this.data[h].lineBreak();if(l!=="none"){var g=(l==="after"?h+1:h);if(k.length===0||k[k.length-1]!==g){k.push([g,this.data[h]])}else{k[k.length-1]=[g,this.data[h]]}}}}k.push([this.data.length,k[k.length-1][1]]);return k},toHTMLmultiline:function(f){a.mbase.HTMLautoloadFile("multiline")},HTMLcomputeBBox:function(l,k,j,f){if(j==null){j=0}if(f==null){f=this.data.length}var h=l.bbox={},n=[];while(j<f){var g=this.data[j];if(!g){continue}if(!k&&g.HTMLcanStretch("Vertical")){n.push(g);g=(g.CoreMO()||g)}this.HTMLcombineBBoxes(g,h);j++}this.HTMLcleanBBox(h);return n},HTMLcombineBBoxes:function(f,g){if(g.w==null){this.HTMLemptyBBox(g)}var i=f.HTMLspanElement();if(!i||!i.bbox){return}var h=i.bbox;if(h.d>g.d){g.d=h.d}if(h.h>g.h){g.h=h.h}if(h.D!=null&&h.D>g.D){g.D=h.D}if(h.H!=null&&h.H>g.H){g.H=h.H}if(i.style.paddingLeft){g.w+=parseFloat(i.style.paddingLeft)*(i.scale||1)}if(g.w+h.lw<g.lw){g.lw=g.w+h.lw}if(g.w+h.rw>g.rw){g.rw=g.w+h.rw}g.w+=h.w;if(i.style.paddingRight){g.w+=parseFloat(i.style.paddingRight)*(i.scale||1)}if(h.width){g.width=h.width}},HTMLemptyBBox:function(f){f.h=f.d=f.H=f.D=f.rw=-e.BIGDIMEN;f.w=0;f.lw=e.BIGDIMEN;return f},HTMLcleanBBox:function(f){if(f.h===this.BIGDIMEN){f.h=f.d=f.H=f.D=f.w=f.rw=f.lw=0}if(f.D<=f.d){delete f.D}if(f.H<=f.h){delete f.H}},HTMLzeroBBox:function(){return{h:0,d:0,w:0,lw:0,rw:0}},HTMLcanStretch:function(f){if(this.isEmbellished()){return this.Core().HTMLcanStretch(f)}return false},HTMLstretchH:function(g,f){return this.HTMLspanElement()},HTMLstretchV:function(g,f,i){return this.HTMLspanElement()},HTMLnotEmpty:function(f){while(f){if((f.type!=="mrow"&&f.type!=="texatom")||f.data.length>1){return true}f=f.data[0]}return false},HTMLmeasureChild:function(g,f){if(this.data[g]!=null){e.Measured(this.data[g].toHTML(f),f)}else{f.bbox=this.HTMLzeroBBox()}},HTMLcreateSpan:function(f){if(this.spanID){var g=this.HTMLspanElement();if(g){while(g.firstChild){g.removeChild(g.firstChild)}g.bbox={w:0,h:0,d:0,lw:0,rw:0};g.scale=1;g.isMultChar=null;g.style.cssText="";return g}}if(this.href){f=e.addElement(f,"a",{href:this.href})}f=e.addElement(f,"span",{className:this.type});if(e.imgHeightBug){f.style.display="inline-block"}if(this["class"]!=null){f.className+=" "+this["class"]}if(this.style){f.style.cssText=this.style;if(f.style.fontSize){this.mathsize=f.style.fontSize;f.style.fontSize=""}}this.spanID=e.GetID();f.id=(this.id||"MathJax-Span-"+this.spanID)+e.idPostfix;f.bbox={w:0,h:0,d:0,lw:0,lr:0};if(this.href){f.parentNode.bbox=f.bbox}return f},HTMLspanElement:function(){if(!this.spanID){return null}return document.getElementById((this.id||"MathJax-Span-"+this.spanID)+e.idPostfix)},HTMLhandleVariant:function(g,f,h){e.handleVariant(g,f,h)},HTMLhandleSize:function(f){if(!f.scale){f.scale=this.HTMLgetScale();if(f.scale!==1){f.style.fontSize=e.Percent(f.scale)}}return f},HTMLhandleColor:function(k){var m=this.getValues("mathcolor","color");if(this.mathbackground){m.mathbackground=this.mathbackground}if(this.background){m.background=this.background}if(this.style&&k.style.backgroundColor){m.mathbackground=k.style.backgroundColor;k.style.backgroundColor="transparent"}if(m.color&&!this.mathcolor){m.mathcolor=m.color}if(m.background&&!this.mathbackground){m.mathbackground=m.background}if(m.mathcolor){k.style.color=m.mathcolor}if(m.mathbackground&&m.mathbackground!==a.COLOR.TRANSPARENT){var n=1/e.em,j=0,i=0;if(this.isToken){j=k.bbox.lw;i=k.bbox.rw-k.bbox.w}if(k.style.paddingLeft!==""){j+=parseFloat(k.style.paddingLeft)*(k.scale||1)}if(k.style.paddingRight!==""){i-=parseFloat(k.style.paddingRight)*(k.scale||1)}var h=Math.max(0,e.getW(k)+(e.PaddingWidthBug?0:i-j));if(e.msieCharPaddingWidthBug&&k.style.paddingLeft!==""){h+=parseFloat(k.style.paddingLeft)*(k.scale||1)}var l=k.bbox.h+k.bbox.d,f=-k.bbox.d;if(h>0){h+=2*n;j-=n}if(l>0){l+=2*n;f-=n}i=-h-j;var g=e.Element("span",{id:"MathJax-Color-"+this.spanID+e.idPostfix,style:{display:"inline-block",backgroundColor:m.mathbackground,width:e.Em(h),height:e.Em(l),verticalAlign:e.Em(f),marginLeft:e.Em(j),marginRight:e.Em(i)}});if(e.msieInlineBlockAlignBug){g.style.position="relative";g.style.width=g.style.height=0;g.style.verticalAlign=g.style.marginLeft=g.style.marginRight="";e.placeBox(e.addElement(g,"span",{noAdjust:true,style:{display:"inline-block",position:"absolute",overflow:"hidden",width:e.Em(h),height:e.Em(l),background:m.mathbackground}}),j,k.bbox.h+n)}k.parentNode.insertBefore(g,k);if(e.msieColorPositionBug){k.style.position="relative"}return g}return null},HTMLremoveColor:function(){var f=document.getElementById("MathJax-Color-"+this.spanID+e.idPostfix);if(f){f.parentNode.removeChild(f)}},HTMLhandleSpace:function(i){if(this.useMMLspacing){if(this.type!=="mo"){return}var g=this.getValues("scriptlevel","lspace","rspace");if(g.scriptlevel<=0||this.hasValue("lspace")||this.hasValue("rspace")){g.lspace=Math.max(0,e.length2em(g.lspace));g.rspace=Math.max(0,e.length2em(g.rspace));var f=this,h=this.Parent();while(h&&h.isEmbellished()&&h.Core()===f){f=h;h=h.Parent();i=f.HTMLspanElement()}if(g.lspace){i.style.paddingLeft=e.Em(g.lspace)}if(g.rspace){i.style.paddingRight=e.Em(g.rspace)}}}else{var j=this.texSpacing();if(j!==""){j=e.length2em(j)/(i.scale||1);if(i.style.paddingLeft){j+=parseFloat(i.style.paddingLeft)}i.style.paddingLeft=e.Em(j)}}},HTMLgetScale:function(){var h=1,f=this.getValues("mathsize","scriptlevel","fontsize","scriptminsize");if(this.style){var g=this.HTMLspanElement();if(g.style.fontSize!=""){f.fontsize=g.style.fontSize}}if(f.fontsize&&!this.mathsize){f.mathsize=f.fontsize}if(f.scriptlevel!==0){if(f.scriptlevel>2){f.scriptlevel=2}h=Math.pow(this.Get("scriptsizemultiplier"),f.scriptlevel);f.scriptminsize=e.length2em(f.scriptminsize);if(h<f.scriptminsize){h=f.scriptminsize}}h*=e.length2em(f.mathsize);return h},HTMLgetVariant:function(){var f=this.getValues("mathvariant","fontfamily","fontweight","fontstyle");if(this.style){var h=this.HTMLspanElement();if(h.style.fontFamily){f.fontfamily=h.style.fontFamily}if(h.style.fontWeight){f.fontweight=h.style.fontWeight}if(h.style.fontStyle){f.fontStyle=h.style.fontStyle}}var g=f.mathvariant;if(this.variantForm){g="-"+e.fontInUse+"-variant"}if(f.fontfamily&&!this.mathvariant){if(!f.fontweight&&f.mathvariant.match(/bold/)){f.fontweight="bold"}if(!f.fontstyle&&f.mathvariant.match(/italic/)){f.fontstyle="italic"}return{FONTS:[],fonts:[],noRemap:true,defaultFont:{family:f.fontfamily,style:f.fontstyle,weight:f.fontweight}}}if(f.fontweight==="bold"){g={normal:a.VARIANT.BOLD,italic:a.VARIANT.BOLDITALIC,fraktur:a.VARIANT.BOLDFRAKTUR,script:a.VARIANT.BOLDSCRIPT,"sans-serif":a.VARIANT.BOLDSANSSERIF,"sans-serif-italic":a.VARIANT.SANSSERIFBOLDITALIC}[g]||g}else{if(f.fontweight==="normal"){g={bold:a.VARIANT.normal,"bold-italic":a.VARIANT.ITALIC,"bold-fraktur":a.VARIANT.FRAKTUR,"bold-script":a.VARIANT.SCRIPT,"bold-sans-serif":a.VARIANT.SANSSERIF,"sans-serif-bold-italic":a.VARIANT.SANSSERIFITALIC}[g]||g}}if(f.fontstyle==="italic"){g={normal:a.VARIANT.ITALIC,bold:a.VARIANT.BOLDITALIC,"sans-serif":a.VARIANT.SANSSERIFITALIC,"bold-sans-serif":a.VARIANT.SANSSERIFBOLDITALIC}[g]||g}else{if(f.fontstyle==="normal"){g={italic:a.VARIANT.NORMAL,"bold-italic":a.VARIANT.BOLD,"sans-serif-italic":a.VARIANT.SANSSERIF,"sans-serif-bold-italic":a.VARIANT.BOLDSANSSERIF}[g]||g}}return e.FONTDATA.VARIANT[g]}},{HTMLautoload:function(){var f=e.autoloadDir+"/"+this.type+".js";d.RestartAfter(c.Require(f))},HTMLautoloadFile:function(f){var g=e.autoloadDir+"/"+f+".js";d.RestartAfter(c.Require(g))},HTMLstretchH:function(g,f){this.HTMLremoveColor();return this.toHTML(g,f)},HTMLstretchV:function(g,f,i){this.HTMLremoveColor();return this.toHTML(g,f,i)}});a.chars.Augment({toHTML:function(g,f){this.HTMLhandleVariant(g,f,this.data.join("").replace(/[\u2061-\u2064]/g,""))}});a.entity.Augment({toHTML:function(g,f){this.HTMLhandleVariant(g,f,this.toString().replace(/[\u2061-\u2064]/g,""))}});a.mi.Augment({toHTML:function(j){j=this.HTMLhandleSize(this.HTMLcreateSpan(j));j.bbox=null;var h=this.HTMLgetVariant();for(var g=0,f=this.data.length;g<f;g++){if(this.data[g]){this.data[g].toHTML(j,h)}}if(!j.bbox){j.bbox={w:0,h:0,d:0,rw:0,lw:0}}if(this.data.join("").length!==1){delete j.bbox.skew}this.HTMLhandleSpace(j);this.HTMLhandleColor(j);return j}});a.mn.Augment({toHTML:function(j){j=this.HTMLhandleSize(this.HTMLcreateSpan(j));j.bbox=null;var h=this.HTMLgetVariant();for(var g=0,f=this.data.length;g<f;g++){if(this.data[g]){this.data[g].toHTML(j,h)}}if(!j.bbox){j.bbox={w:0,h:0,d:0,rw:0,lw:0}}if(this.data.join("").length!==1){delete j.bbox.skew}this.HTMLhandleSpace(j);this.HTMLhandleColor(j);return j}});a.mo.Augment({toHTML:function(k){k=this.HTMLhandleSize(this.HTMLcreateSpan(k));if(this.data.length==0){return k}else{k.bbox=null}var n=this.data.join("");var j=this.HTMLgetVariant();var g=this.getValues("largeop","displaystyle");if(g.largeop){j=e.FONTDATA.VARIANT[g.displaystyle?"-largeOp":"-smallOp"]}for(var h=0,f=this.data.length;h<f;h++){if(this.data[h]){this.data[h].toHTML(k,j)}}if(!k.bbox){k.bbox={w:0,h:0,d:0,rw:0,lw:0}}if(n.length!==1){delete k.bbox.skew}if(e.AccentBug&&k.bbox.w===0&&n.length===1&&k.firstChild){k.firstChild.nodeValue+=e.NBSP;e.createSpace(k,0,0,-k.offsetWidth/e.em)}if(g.largeop){var l=(k.bbox.h-k.bbox.d)/2-e.TeX.axis_height*k.scale;if(e.safariVerticalAlignBug&&k.lastChild.nodeName==="IMG"){k.lastChild.style.verticalAlign=e.Em(parseFloat(k.lastChild.style.verticalAlign||0)/e.em-l/k.scale)}else{if(e.konquerorVerticalAlignBug&&k.lastChild.nodeName==="IMG"){k.style.position="relative";k.lastChild.style.position="relative";k.lastChild.style.top=e.Em(l/k.scale)}else{k.style.verticalAlign=e.Em(-l/k.scale)}}k.bbox.h-=l;k.bbox.d+=l;if(k.bbox.rw>k.bbox.w){k.bbox.ic=k.bbox.rw-k.bbox.w;e.createBlank(k,k.bbox.ic);k.bbox.w=k.bbox.rw}}this.HTMLhandleSpace(k);this.HTMLhandleColor(k);return k},HTMLcanStretch:function(f){if(!this.Get("stretchy")){return false}var g=this.data.join("");if(g.length>1){return false}g=e.FONTDATA.DELIMITERS[g.charCodeAt(0)];return(g&&g.dir==f.substr(0,1))},HTMLstretchV:function(l,k,n){this.HTMLremoveColor();var f=this.getValues("symmetric","maxsize","minsize");var j=this.HTMLspanElement(),g;var i=e.TeX.axis_height,m=j.scale;if(f.symmetric){g=2*Math.max(k-i,n+i)}else{g=k+n}f.maxsize=e.length2em(f.maxsize,j.bbox.h+j.bbox.d);f.minsize=e.length2em(f.minsize,j.bbox.h+j.bbox.d);g=Math.max(f.minsize,Math.min(f.maxsize,g));j=this.HTMLcreateSpan(l);e.createDelimiter(j,this.data.join("").charCodeAt(0),g,m);if(f.symmetric){g=(j.bbox.h+j.bbox.d)/2+i}else{g=(j.bbox.h+j.bbox.d)*k/(k+n)}e.positionDelimiter(j,g);this.HTMLhandleSpace(j);this.HTMLhandleColor(j);return j},HTMLstretchH:function(i,f){this.HTMLremoveColor();var g=this.getValues("maxsize","minsize","mathvariant","fontweight");if(g.fontweight==="bold"&&!this.mathvariant){g.mathvariant=a.VARIANT.BOLD}var h=this.HTMLspanElement(),j=h.scale;g.maxsize=e.length2em(g.maxsize,h.bbox.w);g.minsize=e.length2em(g.minsize,h.bbox.w);f=Math.max(g.minsize,Math.min(g.maxsize,f));h=this.HTMLcreateSpan(i);e.createDelimiter(h,this.data.join("").charCodeAt(0),f,j,g.mathvariant);this.HTMLhandleSpace(h);this.HTMLhandleColor(h);return h}});a.mtext.Augment({toHTML:function(k){k=this.HTMLhandleSize(this.HTMLcreateSpan(k));k.bbox=null;if(this.Parent().type==="merror"){e.addText(k,this.data.join(""));var l=e.getHD(k),g=e.getW(k);k.bbox={h:l.h,d:l.d,w:g,lw:0,rw:g}}else{var j=this.HTMLgetVariant();for(var h=0,f=this.data.length;h<f;h++){if(this.data[h]){this.data[h].toHTML(k,j)}}if(!k.bbox){k.bbox={w:0,h:0,d:0,rw:0,lw:0}}if(this.data.join("").length!==1){delete k.bbox.skew}}this.HTMLhandleSpace(k);this.HTMLhandleColor(k);return k}});a.ms.Augment({toHTML:a.mbase.HTMLautoload});a.mglyph.Augment({toHTML:a.mbase.HTMLautoload});a.mspace.Augment({toHTML:function(j){j=this.HTMLhandleSize(this.HTMLcreateSpan(j));var g=this.getValues("height","depth","width");g.mathbackground=this.mathbackground;if(this.background&&!this.mathbackground){g.mathbackground=this.background}var i=e.length2em(g.height),k=e.length2em(g.depth),f=e.length2em(g.width);e.createSpace(j,i,k,f,g.mathbackground);return j}});a.mphantom.Augment({toHTML:function(j,g,l){j=this.HTMLcreateSpan(j);if(this.data[0]!=null){var k=e.Measured(this.data[0].toHTML(j),j);if(l!=null){e.Remeasured(this.data[0].HTMLstretchV(j,g,l),j)}else{if(g!=null){e.Remeasured(this.data[0].HTMLstretchH(j,g),j)}}j.bbox={w:k.bbox.w,h:k.bbox.h,d:k.bbox.d,lw:0,rw:0};for(var h=0,f=j.childNodes.length;h<f;h++){j.childNodes[h].style.visibility="hidden"}}this.HTMLhandleSpace(j);this.HTMLhandleColor(j);return j},HTMLstretchH:a.mbase.HTMLstretchH,HTMLstretchV:a.mbase.HTMLstretchV});a.mpadded.Augment({toHTML:function(j,h,l){j=this.HTMLcreateSpan(j);if(this.data[0]!=null){var g=e.createStack(j,true);var k=e.createBox(g);e.Measured(this.data[0].toHTML(k),k);if(l!=null){e.Remeasured(this.data[0].HTMLstretchV(k,h,l),k)}else{if(h!=null){e.Remeasured(this.data[0].HTMLstretchH(k,h),k)}}var i=this.getValues("height","depth","width","lspace","voffset"),f=0,m=0;if(i.lspace){f=this.HTMLlength2em(k,i.lspace)}if(i.voffset){m=this.HTMLlength2em(k,i.voffset)}e.placeBox(k,f,m);j.bbox={h:k.bbox.h,d:k.bbox.d,w:k.bbox.w,lw:Math.min(0,k.bbox.lw+f),rw:Math.max(k.bbox.w,k.bbox.rw+f),H:Math.max((k.bbox.H==null?-e.BIGDIMEN:k.bbox.H),k.bbox.h+m),D:Math.max((k.bbox.D==null?-e.BIGDIMEN:k.bbox.D),k.bbox.d-m)};if(i.height!==""){j.bbox.h=this.HTMLlength2em(k,i.height,"h",0)}if(i.depth!==""){j.bbox.d=this.HTMLlength2em(k,i.depth,"d",0)}if(i.width!==""){j.bbox.w=this.HTMLlength2em(k,i.width,"w",0)}if(j.bbox.H<=j.bbox.h){delete j.bbox.H}if(j.bbox.D<=j.bbox.d){delete j.bbox.D}e.setStackWidth(g,j.bbox.w)}this.HTMLhandleSpace(j);this.HTMLhandleColor(j);return j},HTMLlength2em:function(j,k,l,f){if(f==null){f=-e.BIGDIMEN}var h=String(k).match(/width|height|depth/);var i=(h?j.bbox[h[0].charAt(0)]:(l?j.bbox[l]:null));var g=e.length2em(k,i);if(l&&String(k).match(/^\s*[-+]/)){return Math.max(f,j.bbox[l]+g)}else{return g}},HTMLstretchH:a.mbase.HTMLstretchH,HTMLstretchV:a.mbase.HTMLstretchV});a.mrow.Augment({HTMLstretchH:function(h,f){this.HTMLremoveColor();var g=this.HTMLspanElement();this.data[this.core].HTMLstretchH(g,f);this.HTMLcomputeBBox(g,true);this.HTMLhandleColor(g);return g},HTMLstretchV:function(i,g,j){this.HTMLremoveColor();var f=this.HTMLspanElement();this.data[this.core].HTMLstretchV(f,g,j);this.HTMLcomputeBBox(f,true);this.HTMLhandleColor(f);return f}});a.mstyle.Augment({toHTML:function(f){if(this.data[0]!=null){f=this.data[0].toHTML(f);this.spanID=this.data[0].spanID;this.HTMLhandleSpace(f);this.HTMLhandleColor(f)}return f},HTMLspanElement:function(){return(this.data[0]!=null?this.data[0].HTMLspanElement():null)},HTMLstretchH:function(g,f){return(this.data[0]!=null?this.data[0].HTMLstretchH(g,f):g)},HTMLstretchV:function(g,f,i){return(this.data[0]!=null?this.data[0].HTMLstretchV(g,f,i):g)}});a.mfrac.Augment({toHTML:function(y){y=this.HTMLcreateSpan(y);var h=e.createStack(y);var k=e.createBox(h),j=e.createBox(h);this.HTMLmeasureChild(0,k);this.HTMLmeasureChild(1,j);var f=this.getValues("displaystyle","linethickness","numalign","denomalign","bevelled");var C=this.HTMLgetScale(),x=f.displaystyle;var B=e.TeX.axis_height*C;if(f.bevelled){var A=(x?0.4:0.15);var l=Math.max(k.bbox.h+k.bbox.d,j.bbox.h+j.bbox.d)+2*A;var z=e.createBox(h);e.createDelimiter(z,47,l);e.placeBox(k,0,(k.bbox.d-k.bbox.h)/2+B+A);e.placeBox(z,k.bbox.w-A/2,(z.bbox.d-z.bbox.h)/2+B);e.placeBox(j,k.bbox.w+z.bbox.w-A,(j.bbox.d-j.bbox.h)/2+B-A)}else{var g=Math.max(k.bbox.w,j.bbox.w);var o=e.thickness2em(f.linethickness),s,r,n,m;var w=e.TeX.min_rule_thickness/this.em;if(x){n=e.TeX.num1;m=e.TeX.denom1}else{n=(o===0?e.TeX.num3:e.TeX.num2);m=e.TeX.denom2}n*=C;m*=C;if(o===0){s=Math.max((x?7:3)*e.TeX.rule_thickness,2*w);r=(n-k.bbox.d)-(j.bbox.h-m);if(r<s){n+=(s-r)/2;m+=(s-r)/2}}else{s=Math.max((x?2:0)*w+o,o/2+1.5*w);r=(n-k.bbox.d)-(B+o/2);if(r<s){n+=s-r}r=(B-o/2)-(j.bbox.h-m);if(r<s){m+=s-r}var i=e.createBox(h);e.createRule(i,o,0,g+2*o);e.placeBox(i,0,B-o/2)}e.alignBox(k,f.numalign,n);e.alignBox(j,f.denomalign,-m)}this.HTMLhandleSpace(y);this.HTMLhandleColor(y);return y},HTMLcanStretch:function(f){return false},HTMLhandleSpace:function(f){if(!this.texWithDelims){var g=(this.useMMLspacing?0:e.length2em(this.texSpacing()||0))+0.12;f.style.paddingLeft=e.Em(g);f.style.paddingRight=".12em"}}});a.msqrt.Augment({toHTML:function(n){n=this.HTMLcreateSpan(n);var r=e.createStack(n);var h=e.createBox(r),l=e.createBox(r),k=e.createBox(r);this.HTMLmeasureChild(0,h);var j=this.HTMLgetScale();var s=e.TeX.rule_thickness*j,g,f,o,i;if(this.Get("displaystyle")){g=e.TeX.x_height*j}else{g=s}f=Math.max(s+g/4,1.5*e.TeX.min_rule_thickness/this.em);o=h.bbox.h+h.bbox.d+f+s;i=h.bbox.w;e.createDelimiter(k,8730,o,j);e.Measured(k);var m=0;if(k.isMultiChar||(e.AdjustSurd&&e.imgFonts)){k.bbox.w*=0.95}if(k.bbox.h+k.bbox.d>o){f=((k.bbox.h+k.bbox.d)-(o-s))/2}var u=e.FONTDATA.DELIMITERS[e.FONTDATA.RULECHAR];if(!u||i<u.HW[0][0]*j||j<0.75){e.createRule(l,s,0,i)}else{e.createDelimiter(l,e.FONTDATA.RULECHAR,i,j)}o=h.bbox.h+f+s;m=this.HTMLaddRoot(r,k,m,k.bbox.h+k.bbox.d-o,j);e.placeBox(k,m,o-k.bbox.h);e.placeBox(l,m+k.bbox.w,o-l.bbox.h+e.rfuzz);e.placeBox(h,m+k.bbox.w,0);this.HTMLhandleSpace(n);this.HTMLhandleColor(n);return n},HTMLaddRoot:function(h,g,f,j,i){return f}});a.mroot.Augment({toHTML:a.msqrt.prototype.toHTML,HTMLaddRoot:function(o,g,m,k,f){var i=e.createBox(o);if(this.data[1]){var l=this.data[1].toHTML(i);l.style.paddingRight=l.style.paddingLeft="";e.Measured(l,i)}else{i.bbox=this.HTMLzeroBBox()}var j=this.HTMLrootHeight(g.bbox.h+g.bbox.d,f,i)-k;var n=Math.min(i.bbox.w,i.bbox.rw);m=Math.max(n,g.offset);e.placeBox(i,m-n,j);return m-g.offset},HTMLrootHeight:function(h,g,f){return 0.45*(h-0.9*g)+0.6*g+Math.max(0,f.bbox.d-0.075)}});a.mfenced.Augment({toHTML:function(k){k=this.HTMLcreateSpan(k);if(this.data.open){this.data.open.toHTML(k)}if(this.data[0]!=null){this.data[0].toHTML(k)}for(var g=1,f=this.data.length;g<f;g++){if(this.data[g]){if(this.data["sep"+g]){this.data["sep"+g].toHTML(k)}this.data[g].toHTML(k)}}if(this.data.close){this.data.close.toHTML(k)}var n=this.HTMLcomputeBBox(k);var j=k.bbox.h,l=k.bbox.d;for(g=0,f=n.length;g<f;g++){n[g].HTMLstretchV(k,j,l)}if(n.length){this.HTMLcomputeBBox(k,true)}this.HTMLhandleSpace(k);this.HTMLhandleColor(k);return k},HTMLcomputeBBox:function(k,j){var g=k.bbox={},l=[];this.HTMLcheckStretchy(this.data.open,g,l,j);this.HTMLcheckStretchy(this.data[0],g,l,j);for(var h=1,f=this.data.length;h<f;h++){if(this.data[h]){this.HTMLcheckStretchy(this.data["sep"+h],g,l,j);this.HTMLcheckStretchy(this.data[h],g,l,j)}}this.HTMLcheckStretchy(this.data.close,g,l,j);this.HTMLcleanBBox(g);return l},HTMLcheckStretchy:function(f,g,i,h){if(f){if(!h&&f.HTMLcanStretch("Vertical")){i.push(f);f=(f.CoreMO()||f)}this.HTMLcombineBBoxes(f,g)}}});a.menclose.Augment({toHTML:a.mbase.HTMLautoload});a.maction.Augment({toHTML:a.mbase.HTMLautoload});a.semantics.Augment({toHTML:function(f){if(this.data[0]!=null){f=this.data[0].toHTML(f);this.spanID=this.data[0].spanID;this.HTMLhandleSpace(f)}return f},HTMLspanElement:function(){return(this.data[0]!=null?this.data[0].HTMLspanElement():null)},HTMLstretchH:function(g,f){return(this.data[0]!=null?this.data[0].HTMLstretchH(g,f):g)},HTMLstretchV:function(g,f,i){return(this.data[0]!=null?this.data[0].HTMLstretchV(g,f,i):g)}});a.munderover.Augment({toHTML:function(G,B,z){var f=this.getValues("displaystyle","accent","accentunder","align");if(!f.displaystyle&&this.data[this.base]!=null&&this.data[this.base].Get("movablelimits")){return a.msubsup.prototype.toHTML.call(this,G)}G=this.HTMLcreateSpan(G);var K=this.HTMLgetScale();var j=e.createStack(G);var l=[],I=[],q,H,C,g=-e.BIGDIMEN,F=g;for(H=0,C=this.data.length;H<C;H++){if(this.data[H]!=null){q=l[H]=e.createBox(j);e.Measured(this.data[H].toHTML(q),q);if(H==this.base){if(z!=null){e.Remeasured(this.data[this.base].HTMLstretchV(q,B,z),q)}else{if(B!=null){e.Remeasured(this.data[this.base].HTMLstretchH(q,B),q)}}I[H]=(z==null&&B!=null?false:this.data[H].HTMLcanStretch("Horizontal"))}else{I[H]=this.data[H].HTMLcanStretch("Horizontal")}if(q.bbox.w>F){F=q.bbox.w}if(!I[H]&&F>g){g=F}}}if(z==null&&B!=null){g=B}else{if(g==-e.BIGDIMEN){g=F}}for(H=F=0,C=this.data.length;H<C;H++){if(this.data[H]){q=l[H];if(I[H]){q.bbox=this.data[H].HTMLstretchH(q,g).bbox}if(q.bbox.w>F){F=q.bbox.w}}}var w=e.TeX.rule_thickness,A=e.FONTDATA.TeX_factor;var h=l[this.base]||{bbox:this.HTMLzeroBBox()},J=(h.bbox.ic||0);var p,n,s,r,o,v,E;for(H=0,C=this.data.length;H<C;H++){if(this.data[H]!=null){q=l[H];o=e.TeX.big_op_spacing5*K;var u=(H!=this.base&&f[this.ACCENTS[H]]);if(u&&q.bbox.w<=1/e.em+0.0001){q.bbox.w=q.bbox.rw-q.bbox.lw;q.bbox.noclip=true;if(q.bbox.lw&&!e.zeroWidthBug){q.insertBefore(e.createSpace(q.parentNode,0,0,-q.bbox.lw),q.firstChild)}e.createBlank(q,0,0,q.bbox.rw+0.1)}v={left:0,center:(F-q.bbox.w)/2,right:F-q.bbox.w}[f.align];p=v;n=0;if(H==this.over){if(u){E=Math.max(w*K*A,2.5/this.em);o=0;if(h.bbox.skew){p+=h.bbox.skew}}else{s=e.TeX.big_op_spacing1*K*A;r=e.TeX.big_op_spacing3*K*A;E=Math.max(s,r-Math.max(0,q.bbox.d))}E=Math.max(E,1.5/this.em);p+=J;n=h.bbox.h+q.bbox.d+E;q.bbox.h+=o}else{if(H==this.under){if(u){E=3*w*K*A;o=0}else{s=e.TeX.big_op_spacing2*K*A;r=e.TeX.big_op_spacing4*K*A;E=Math.max(s,r-q.bbox.h)}E=Math.max(E,1.5/this.em);p-=J;n=-(h.bbox.d+q.bbox.h+E);q.bbox.d+=o}}e.placeBox(q,p,n)}}this.HTMLhandleSpace(G);this.HTMLhandleColor(G);return G},HTMLstretchH:a.mbase.HTMLstretchH,HTMLstretchV:a.mbase.HTMLstretchV});a.msubsup.Augment({toHTML:function(C,A,w){C=this.HTMLcreateSpan(C);var G=this.HTMLgetScale();var j=e.createStack(C),g;var i=e.createBox(j);this.HTMLmeasureChild(this.base,i);if(this.data[this.base]){if(w!=null){e.Remeasured(this.data[this.base].HTMLstretchV(i,A,w),i)}else{if(A!=null){e.Remeasured(this.data[this.base].HTMLstretchH(i,A),i)}}}e.placeBox(i,0,0);var h=(this.data[this.sup]||this.data[this.sub]||this).HTMLgetScale();var E=e.TeX.x_height*G,o=e.TeX.scriptspace*G*0.75;var f,k;if(this.HTMLnotEmpty(this.data[this.sup])){f=e.createBox(j);e.Measured(this.data[this.sup].toHTML(f),f);f.bbox.w+=o;f.bbox.rw=Math.max(f.bbox.w,f.bbox.rw)}if(this.HTMLnotEmpty(this.data[this.sub])){k=e.createBox(j);e.Measured(this.data[this.sub].toHTML(k),k);k.bbox.w+=o;k.bbox.rw=Math.max(k.bbox.w,k.bbox.rw)}var y=e.TeX.sup_drop*h,x=e.TeX.sub_drop*h;var m=i.bbox.h-y,l=i.bbox.d+x,F=0,z;if(i.bbox.ic){F=i.bbox.ic}if(this.data[this.base]&&(this.data[this.base].type==="mi"||this.data[this.base].type==="mo")){if(this.data[this.base].data.join("").length===1&&i.bbox.scale===1&&!this.data[this.base].Get("largeop")){m=l=0}}var B=this.getValues("subscriptshift","superscriptshift");B.subscriptshift=(B.subscriptshift===""?0:e.length2em(B.subscriptshift));B.superscriptshift=(B.superscriptshift===""?0:e.length2em(B.superscriptshift));if(!f){if(k){l=Math.max(l,e.TeX.sub1*G,k.bbox.h-(4/5)*E,B.subscriptshift);e.placeBox(k,i.bbox.w+o-F,-l,k.bbox)}}else{if(!k){g=this.getValues("displaystyle","texprimestyle");z=e.TeX[(g.displaystyle?"sup1":(g.texprimestyle?"sup3":"sup2"))];m=Math.max(m,z*G,f.bbox.d+(1/4)*E,B.superscriptshift);e.placeBox(f,i.bbox.w+o,m,f.bbox)}else{l=Math.max(l,e.TeX.sub2*G);var n=e.TeX.rule_thickness*G;if((m-f.bbox.d)-(k.bbox.h-l)<3*n){l=3*n-m+f.bbox.d+k.bbox.h;y=(4/5)*E-(m-f.bbox.d);if(y>0){m+=y;l-=y}}e.placeBox(f,i.bbox.w+o,Math.max(m,B.superscriptshift));e.placeBox(k,i.bbox.w+o-F,-Math.max(l,B.subscriptshift))}}this.HTMLhandleSpace(C);this.HTMLhandleColor(C);return C},HTMLstretchH:a.mbase.HTMLstretchH,HTMLstretchV:a.mbase.HTMLstretchV});a.mmultiscripts.Augment({toHTML:a.mbase.HTMLautoload});a.mtable.Augment({toHTML:a.mbase.HTMLautoload});a["annotation-xml"].Augment({toHTML:a.mbase.HTMLautoload});a.math.Augment({toHTML:function(n,g){var k=this.Get("alttext");if(k){g.setAttribute("aria-label",k)}var h=e.addElement(n,"nobr");n=this.HTMLcreateSpan(h);var l=e.createStack(n),i=e.createBox(l),m;l.style.fontSize=h.parentNode.style.fontSize;h.parentNode.style.fontSize="";if(this.data[0]!=null){if(e.msieColorBug){if(this.background){this.data[0].background=this.background;delete this.background}if(this.mathbackground){this.data[0].mathbackground=this.mathbackground;delete this.mathbackground}}a.mbase.prototype.displayAlign=d.config.displayAlign;a.mbase.prototype.displayIndent=d.config.displayIndent;m=e.Measured(this.data[0].toHTML(i),i)}e.placeBox(i,0,0);var j=e.em/e.outerEm;e.em/=j;n.bbox.h*=j;n.bbox.d*=j;n.bbox.w*=j;n.bbox.lw*=j;n.bbox.rw*=j;if(m&&m.bbox.width!=null){l.style.width=m.bbox.width;i.style.width="100%"}this.HTMLhandleColor(n);if(m){e.createRule(n,m.bbox.h*j,m.bbox.d*j,0)}if(!this.isMultiline&&this.Get("display")==="block"&&n.bbox.width==null){var o=this.getValues("indentalignfirst","indentshiftfirst","indentalign","indentshift");if(o.indentalignfirst!==a.INDENTALIGN.INDENTALIGN){o.indentalign=o.indentalignfirst}if(o.indentalign===a.INDENTALIGN.AUTO){o.indentalign=this.displayAlign}g.style.textAlign=o.indentalign;if(o.indentshiftfirst!==a.INDENTSHIFT.INDENTSHIFT){o.indentshift=o.indentshiftfirst}if(o.indentshift==="auto"){o.indentshift=this.displayIndent}if(o.indentshift&&o.indentalign!==a.INDENTALIGN.CENTER){n.style[{left:"marginLeft",right:"marginRight"}[o.indentalign]]=e.Em(e.length2em(o.indentshift))}}return n}});a.TeXAtom.Augment({toHTML:function(g){g=this.HTMLcreateSpan(g);if(this.data[0]!=null){if(this.texClass===a.TEXCLASS.VCENTER){var f=e.createStack(g);var h=e.createBox(f);e.Measured(this.data[0].toHTML(h),h);e.placeBox(h,0,e.TeX.axis_height-(h.bbox.h+h.bbox.d)/2+h.bbox.d)}else{g.bbox=this.data[0].toHTML(g).bbox}}this.HTMLhandleSpace(g);this.HTMLhandleColor(g);return g}});MathJax.Hub.Register.StartupHook("onLoad",function(){setTimeout(MathJax.Callback(["loadComplete",e,"jax.js"]),0)})});d.Register.StartupHook("End Config",function(){d.Browser.Select({MSIE:function(f){var i=f.versionAtLeast("7.0");var h=f.versionAtLeast("8.0")&&document.documentMode>7;var g=(document.compatMode==="BackCompat");e.config.styles[".MathJax .MathJax_HitBox"]["background-color"]="white";e.config.styles[".MathJax .MathJax_HitBox"].opacity=0;e.config.styles[".MathJax .MathJax_HitBox"].filter="alpha(opacity=0)";e.Augment({getMarginScale:e.getMSIEmarginScale,PaddingWidthBug:true,msieEventBug:f.isIE9,msieAccentBug:true,msieColorBug:true,msieColorPositionBug:true,msieRelativeWidthBug:g,msieMarginWidthBug:true,msiePaddingWidthBug:true,msieCharPaddingWidthBug:(h&&!g),msieBorderWidthBug:g,msieInlineBlockAlignBug:(!h||g),msieVerticalAlignBug:(h&&!g),msiePlaceBoxBug:(h&&!g),msieClipRectBug:!h,msieNegativeSpaceBug:g,msieCloneNodeBug:(h&&f.version==="8.0"),negativeSkipBug:true,msieIE6:!i,msieItalicWidthBug:true,zeroWidthBug:true,FontFaceBug:true,msieFontCSSBug:f.isIE9,allowWebFonts:"eot"})},Firefox:function(g){var h=false;if(g.versionAtLeast("3.5")){var f=String(document.location).replace(/[^\/]*$/,"");if(document.location.protocol!=="file:"||(d.config.root+"/").substr(0,f.length)===f){h="otf"}}e.Augment({useProcessingFrame:true,ffVerticalAlignBug:true,AccentBug:true,allowWebFonts:h})},Safari:function(j){var h=j.versionAtLeast("3.0");var g=j.versionAtLeast("3.1");j.isMobile=(navigator.appVersion.match(/Mobile/i)!=null);var f=(navigator.appVersion.match(/ Android (\d+)\.(\d+)/));var k=(g&&j.isMobile&&((navigator.platform.match(/iPad|iPod|iPhone/)&&!j.versionAtLeast("5.0"))||(f!=null&&(f[1]<2||(f[1]==2&&f[2]<2)))));e.Augment({config:{styles:{".MathJax img, .MathJax nobr, .MathJax a":{"max-width":"5000em","max-height":"5000em"}}},useProcessingFrame:true,rfuzz:0.05,AccentBug:true,AdjustSurd:true,safariContextMenuBug:true,safariNegativeSpaceBug:true,safariVerticalAlignBug:!g,safariTextNodeBug:!h,safariWebFontSerif:["serif"],allowWebFonts:(g&&!k?"otf":false)});if(k){var i=d.config["HTML-CSS"];if(i){i.availableFonts=[];i.preferredFont=null}else{d.config["HTML-CSS"]={availableFonts:[],preferredFont:null}}}},Chrome:function(f){e.Augment({useProcessingFrame:true,rfuzz:0.05,AccentBug:true,AdjustSurd:true,allowWebFonts:(f.versionAtLeast("4.0")?"otf":"svg"),safariNegativeSpaceBug:true,safariWebFontSerif:[""]})},Opera:function(f){f.isMini=(navigator.appVersion.match("Opera Mini")!=null);e.config.styles[".MathJax .merror"]["vertical-align"]=null;e.Augment({useProcessingFrame:true,operaHeightBug:true,operaVerticalAlignBug:true,operaFontSizeBug:f.versionAtLeast("10.61"),negativeSkipBug:true,zeroWidthBug:true,FontFaceBug:true,PaddingWidthBug:true,allowWebFonts:(f.versionAtLeast("10.0")&&!f.isMini?"otf":false),adjustAvailableFonts:function(j){for(var h=0,g=j.length;h<g;h++){if(j[h]==="STIX"){j.splice(h,1);g--;h--}}if(this.config.preferredFont==="STIX"){this.config.preferredFont=j[0]}}})},Konqueror:function(f){e.Augment({konquerorVerticalAlignBug:true,noContextMenuBug:true})}})});MathJax.Hub.Register.StartupHook("End Cookie",function(){if(d.config.menuSettings.zoom!=="None"){c.Require("[MathJax]/extensions/MathZoom.js")}})})(MathJax.Ajax,MathJax.Hub,MathJax.OutputJax["HTML-CSS"]);
+
diff --git a/static/MathJax/jax/output/NativeMML/config.js b/static/MathJax/jax/output/NativeMML/config.js
new file mode 100644
index 0000000..9d03958
--- /dev/null
+++ b/static/MathJax/jax/output/NativeMML/config.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/NativeMML/config.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+MathJax.OutputJax.NativeMML=MathJax.OutputJax({id:"NativeMML",version:"1.1.4",directory:MathJax.OutputJax.directory+"/NativeMML",extensionDir:MathJax.OutputJax.extensionDir+"/NativeMML",config:{scale:100,showMathMenu:true,showMathMenuMSIE:true,styles:{"DIV.MathJax_MathML":{"text-align":"center",margin:".75em 0px"}}}});if(!MathJax.Hub.config.delayJaxRegistration){MathJax.OutputJax.NativeMML.Register("jax/mml")}MathJax.OutputJax.NativeMML.loadComplete("config.js");
+
diff --git a/static/MathJax/jax/output/NativeMML/jax.js b/static/MathJax/jax/output/NativeMML/jax.js
new file mode 100644
index 0000000..549741a
--- /dev/null
+++ b/static/MathJax/jax/output/NativeMML/jax.js
@@ -0,0 +1,16 @@
+/*
+ * /MathJax/jax/output/NativeMML/jax.js
+ *
+ * Copyright (c) 2010 Design Science, Inc.
+ *
+ * Part of the MathJax library.
+ * See http://www.mathjax.org for details.
+ *
+ * Licensed under the Apache License, Version 2.0;
+ * you may not use this file except in compliance with the License.
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+(function(b,e,d){var a,c=e.Browser.isMSIE;b.Augment({LEFTBUTTON:(c?1:0),MENUKEY:"altKey",noContextMenuBug:e.Browser.isKonequeror,msieQuirks:(c&&!(document.compatMode==="BackCompat")),msieEventBug:e.Browser.isIE9,config:{styles:{}},settings:e.config.menuSettings,Startup:function(){return MathJax.Ajax.Styles(this.config.styles)},Config:function(){this.SUPER(arguments).Config.call(this);if(this.settings.scale){this.config.scale=this.settings.scale}if(e.config.displayAlign!=="center"){var h=e.config.displayAlign,f=e.config.displayIndent;var g={"text-align":h+"!important"};g["margin-"+h]=f+"!important";MathJax.Hub.Insert(this.config.styles,{"div.MathJax_MathML":g,"div.MathJax_MathML math":{"text-align":h},"div.MathJax_MathContainer > span":{"text-align":h+"!important"}})}},InitializeMML:function(){this.initialized=true;if(MathJax.Hub.Browser.isMSIE){try{var f=document.createElement("object");f.id="mathplayer";f.classid="clsid:32F66A20-7614-11D4-BD11-00104BD3F987";document.getElementsByTagName("head")[0].appendChild(f);document.namespaces.add("mjx","http://www.w3.org/1998/Math/MathML");document.namespaces.mjx.doImport("#mathplayer")}catch(g){alert("MathJax was not able to set up MathPlayer.\n\nIf MathPlayer is not installed, you need to install it first.\nOtherwise, your security settings may be preventing ActiveX \ncontrols from running. Use the Internet Options item under\nthe Tools menu and select the Security tab, then press the\nCustom Level button. Check that the settings for\n'Run ActiveX Controls', and 'Binary and script behaviors'\nare enabled.\n\nCurrently you will see error messages rather than\ntypeset mathematics.")}}},Translate:function(g){if(!g.parentNode){return}if(!this.initialized){this.InitializeMML()}var k=g.previousSibling;if(k&&String(k.className).match(/^MathJax(_MathML|_Display)?$/)){k.parentNode.removeChild(k)}var j=g.MathJax.elementJax.root;var i=(j.Get("display")==="block"?"div":"span");var h=document.createElement(i),f=h;h.className="MathJax_MathML";h.style.fontSize=this.config.scale+"%";if(c&&this.config.showMathMenuMSIE){f=MathJax.HTML.addElement(h,"span",{className:"MathJax_MathContainer",style:{display:"inline-block",position:"relative"}})}j.toNativeMML(f);g.parentNode.insertBefore(h,g);if(c){if(this.config.showMathMenuMSIE){this.MSIEoverlay(h)}}else{j=h.firstChild;j.oncontextmenu=this.ContextMenu;j.onmouseover=this.Mouseover;j.onmousedown=this.Mousedown;j.onclick=this.Click;j.ondblclick=this.DblClick}},Remove:function(f){var g=f.SourceElement();if(!g){return}g=g.previousSibling;if(!g){return}if(g.className.match(/MathJax_MathML/)){g.parentNode.removeChild(g)}},MMLnamespace:"http://www.w3.org/1998/Math/MathML",MSIEoverlay:function(m){var l=m.firstChild;m.style.position="absolute";var n=m.scrollHeight,h=m.offsetWidth;var j=MathJax.HTML.addElement(m,"img",{src:"about:blank",style:{width:0,height:n+"px"}});var f=m.scrollHeight-n;m.removeChild(j);m.style.position="";var k,i,g=(m.parentNode.nodeName.toLowerCase()==="div");if(g&&this.quirks){k=-n;i=Math.floor(-h/2)}else{k=f-n,i=-h}MathJax.HTML.addElement(m,"span",{style:{display:"inline-block",width:0,height:0,position:"relative"}},[["span",{style:{display:"inline-block",position:"absolute",left:i+"px",top:k+"px",width:l.offsetWidth+"px",height:n+"px",cursor:"pointer","background-color":"white",filter:"alpha(opacity=0)"},onmousedown:this.MSIEevent,oncontextmenu:this.MSIEevent,onclick:this.MSIEevent,onmousemove:this.MSIEevent,ondblclick:this.MSIEevent,onmouseover:this.MSIEevent,onmouseout:this.MSIEevent}]])},MSIEmath:function(f){var g=f.parentNode.previousSibling.firstChild;return(g.nodeName.toLowerCase()==="span"?g.firstChild:g)},MSIEevent:function(){var g=b.MSIEmath(this);var f=window.event;var h=b["MSIE"+f.type];if(h&&h.call(b,f,g,this)){return false}g.fireEvent("on"+f.type,f);return false},MSIEmousedown:function(h,g,f){if(h[this.MENUKEY]&&h.button===this.LEFTBUTTON&&this.settings.context!=="MathJax"){this.trapUp=this.trapClick=true;this.ContextMenu.call(f,h,true);return true}if(this.MSIEzoomKeys&&this.MSIEzoomKeys(h)){this.trapUp=true;return true}return false},MSIEcontextmenu:function(h,g,f){if(this.settings.context==="MathJax"){this.trapUp=this.trapClick=true;this.ContextMenu.call(f,h,true);return true}return false},ContextMenu:function(i,j){if(b.config.showMathMenu&&(b.settings.context==="MathJax"||j)){if(b.safariContextMenuBug){setTimeout("window.getSelection().empty()",0)}if(!i||b.msieEventBug){i=window.event}var g=MathJax.Menu;if(g){if(document.selection){setTimeout("document.selection.empty()",0)}var f=(c?this.parentNode.parentNode.nextSibling:this.parentNode.nextSibling);g.jax=e.getJaxFor(f);g.menu.items[1].menu.items[1].name=(g.jax.inputJax.id==="MathML"?"Original":g.jax.inputJax.id);delete b.trapClick;delete b.trapUp;return g.menu.Post(i)}else{if(!d.loadingMathMenu){d.loadingMathMenu=true;var h={pageX:i.pageX,pageY:i.pageY,clientX:i.clientX,clientY:i.clientY};MathJax.Callback.Queue(d.Require("[MathJax]/extensions/MathMenu.js"),function(){delete d.loadingMathMenu},[this,arguments.callee,h,j])}if(!i){i=window.event}if(i.preventDefault){i.preventDefault()}if(i.stopPropagation){i.stopPropagation()}i.cancelBubble=true;i.returnValue=false;return false}}},Mousedown:function(f){if(b.config.showMathMenu){if(!f){f=window.event}if(b.settings.context==="MathJax"){if(!b.noContextMenuBug||f.button!==2){return}}else{if(!f[b.MENUKEY]||f.button!==b.LEFTBUTTON){return}}return b.ContextMenu.call(this,f,true)}},Mouseover:function(f){b.HandleEvent(f,"Mouseover",this)},Click:function(f){b.HandleEvent(f,"Click",this)},DblClick:function(f){b.HandleEvent(f,"DblClick",this)},HandleEvent:function(h,f,g){},NAMEDSPACE:{negativeveryverythinmathspace:"-.0556em",negativeverythinmathspace:"-.1111em",negativethinmathspace:"-.1667em",negativemediummathspace:"-.2222em",negativethickmathspace:"-.2778em",negativeverythickmathspace:"-.3333em",negativeveryverythickmathspace:"-.3889em"}});e.Register.StartupHook("mml Jax Ready",function(){a=MathJax.ElementJax.mml;a.mbase.Augment({toNativeMML:function(k){var h=this.NativeMMLelement(this.type);this.NativeMMLattributes(h);for(var j=0,g=this.data.length;j<g;j++){if(this.data[j]){this.data[j].toNativeMML(h)}else{h.appendChild(this.NativeMMLelement("mrow"))}}k.appendChild(h)},NativeMMLattributes:function(h){var l=this.defaults;var o=this.NativeMMLcopyAttributes,k=this.NativeMMLskipAttributes;if(this.type==="mstyle"){l=a.math.prototype.defaults}for(var n in l){if(!k[n]&&l.hasOwnProperty(n)){if(this[n]!=null){h.setAttribute(n,this.NativeMMLattribute(n,this[n]))}}}for(var j=0,g=o.length;j<g;j++){if(this[o[j]]!=null){h.setAttribute(o[j],this.NativeMMLattribute(o[j],this[o[j]]))}}},NativeMMLcopyAttributes:["fontfamily","fontsize","fontweight","fontstyle","color","background","id","class","href","style"],NativeMMLskipAttributes:{texClass:1,useHeight:1,texprimestyle:1},NativeMMLattribute:function(h,g){g=String(g);if(b.NAMEDSPACE[g]){g=b.NAMEDSPACE[g]}else{if(g.match(/^\s*([-+]?(\d+(\.\d*)?|\.\d+))\s*mu\s*$/)){g=((1/18)*RegExp.$1)+"em"}else{if(g==="-tex-caligraphic"){g="script"}else{if(g==="-tex-oldstyle"){g="normal"}}}}return g},NativeMMLelement:(c?function(g){return document.createElement("mjx:"+g)}:function(g){return document.createElementNS(b.MMLnamespace,g)})});a.mrow.Augment({toNativeMML:function(j){if(this.inferred&&this.parent.inferRow){for(var h=0,g=this.data.length;h<g;h++){if(this.data[h]){this.data[h].toNativeMML(j)}else{j.appendChild(this.NativeMMLelement("mrow"))}}}else{this.SUPER(arguments).toNativeMML.call(this,j)}}});a.msubsup.Augment({toNativeMML:function(l){var k=this.type;if(this.data[this.sup]==null){k="msub"}if(this.data[this.sub]==null){k="msup"}var h=this.NativeMMLelement(k);this.NativeMMLattributes(h);delete this.data[0].inferred;for(var j=0,g=this.data.length;j<g;j++){if(this.data[j]){this.data[j].toNativeMML(h)}}l.appendChild(h)}});a.munderover.Augment({toNativeMML:function(l){var k=this.type;if(this.data[this.under]==null){k="mover"}if(this.data[this.over]==null){k="munder"}var h=this.NativeMMLelement(k);this.NativeMMLattributes(h);delete this.data[0].inferred;for(var j=0,g=this.data.length;j<g;j++){if(this.data[j]){this.data[j].toNativeMML(h)}}l.appendChild(h)}});if(MathJax.Hub.Browser.isFirefox){a.mtable.Augment({toNativeMML:function(g){if(this.width){var h=(this.style||"").replace(/;\s*$/,"").split(";");h.push("width:"+this.width);this.style=h.join(";")}this.SUPER(arguments).toNativeMML.call(this,g)}});a.mlabeledtr.Augment({toNativeMML:function(k){var h=this.NativeMMLelement("mtr");this.NativeMMLattributes(h);for(var j=1,g=this.data.length;j<g;j++){if(this.data[j]){this.data[j].toNativeMML(h)}else{h.appendChild(this.NativeMMLelement("mrow"))}}k.appendChild(h)}});var f=MathJax.Hub.config.root+"/fonts/HTML-CSS/TeX/otf";b.Augment({config:{styles:{'[mathvariant="double-struck"]':{"font-family":"MathJax_AMS"},'[mathvariant="script"]':{"font-family":"MathJax_Script"},'[mathvariant="fraktur"]':{"font-family":"MathJax_Fraktur"},'[mathvariant="-tex-oldstyle"]':{"font-family":"MathJax_Caligraphic"},'[mathvariant="-tex-oldstyle-bold"]':{"font-family":"MathJax_Caligraphic","font-weight":"bold"},'[mathvariant="-tex-caligraphic"]':{"font-family":"MathJax_Caligraphic"},'[mathvariant="-tex-caligraphic-bold"]':{"font-family":"MathJax_Caligraphic","font-weight":"bold"},'[mathvariant="bold-script"]':{"font-family":"MathJax_Script","font-weight":"bold"},'[mathvariant="bold-fraktur"]':{"font-family":"MathJax_Fraktur","font-weight":"bold"},'[mathvariant="monospace"]':{"font-family":"monospace"},'[mathvariant="sans-serif"]':{"font-family":"sansserif"},'[mathvariant="bold-sans-serif"]':{"font-family":"sansserif","font-weight":"bold"},'[mathvariant="sans-serif-italic"]':{"font-family":"sansserif","font-style":"italic"},'[mathvariant="sans-serif-bold-italic"]':{"font-family":"sansserif","font-style":"italic","font-weight":"bold"},"@font-face /*1*/":{"font-family":"MathJax_AMS",src:"local('MathJax_AMS'), url('"+f+"/MathJax_AMS-Regular.otf')"},"@font-face /*2*/":{"font-family":"MathJax_Script",src:"local('MathJax_Script'), url('"+f+"/MathJax_Script-Regular.otf')"},"@font-face /*3*/":{"font-family":"MathJax_Fraktur",src:"local('MathJax_Fraktur'), url('"+f+"/MathJax_Fraktur-Regular.otf')"},"@font-face /*4*/":{"font-family":"MathJax_Caligraphic",src:"local('MathJax_Caligraphic'), url('"+f+"/MathJax_Caligraphic-Regular.otf')"},"@font-face /*5*/":{"font-family":"MathJax_Fraktur","font-weight":"bold",src:"local('MathJax_Fraktur-Bold'), url('"+f+"/MathJax_Fraktur-Bold.otf')"},"@font-face /*6*/":{"font-family":"MathJax_Caligraphic","font-weight":"bold",src:"local('MathJax_Caligraphic-Bold'), url('"+f+"/MathJax_Caligraphic-Bold.otf')"}}}})}a.TeXAtom.Augment({toNativeMML:function(h){var g=this.NativeMMLelement("mrow");this.data[0].toNativeMML(g);h.appendChild(g)}});a.chars.Augment({toNativeMML:function(g){g.appendChild(document.createTextNode(this.toString()))}});a.entity.Augment({toNativeMML:function(g){g.appendChild(document.createTextNode(this.toString()))}});a.xml.Augment({toNativeMML:function(j){for(var h=0,g=this.data.length;h<g;h++){j.appendChild(this.data[h].cloneNode(true))}}});e.Register.StartupHook("TeX mathchoice Ready",function(){a.TeXmathchoice.Augment({toNativeMML:function(g){this.Core().toNativeMML(g)}})});setTimeout(MathJax.Callback(["loadComplete",b,"jax.js"]),0)});e.Register.StartupHook("End Cookie",function(){if(e.config.menuSettings.zoom!=="None"){d.Require("[MathJax]/extensions/MathZoom.js")}})})(MathJax.OutputJax.NativeMML,MathJax.Hub,MathJax.Ajax);
+
diff --git a/static/MathJax/local/local.js b/static/MathJax/local/local.js
new file mode 100644
index 0000000..7bf733c
--- /dev/null
+++ b/static/MathJax/local/local.js
@@ -0,0 +1,37 @@
+/*************************************************************
+ *
+ * MathJax/config/local/local.js
+ *
+ * Include changes and configuration local to your installation
+ * in this file. For example, common macros can be defined here
+ * (see below). To use this file, add "local/local.js" to the
+ * config array in MathJax.js or your MathJax.Hub.Config() call.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * Copyright (c) 2009 Design Science, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+MathJax.Hub.Register.StartupHook("TeX Jax Ready",function () {
+ var TEX = MathJax.InputJax.TeX;
+
+ // place macros here. E.g.:
+ // TEX.Macro("R","{\\bf R}");
+ // TEX.Macro("op","\\mathop{\\rm #1}",1); // a macro with 1 parameter
+
+});
+
+MathJax.Ajax.loadComplete("[MathJax]/config/local/local.js");
diff --git a/static/MathJax/test/index.html b/static/MathJax/test/index.html
new file mode 100644
index 0000000..df61ee2
--- /dev/null
+++ b/static/MathJax/test/index.html
@@ -0,0 +1,179 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>MathJax Test Page</title>
+<!-- Copyright (c) 2009-2011 Design Science, Inc. -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
+
+<script type="text/x-mathjax-config">
+//
+// Do NOT use this page as a template for your own pages. It includes
+// code that is needed for testing your site's installation of MathJax,
+// and that should not be used in normal web pages. Use sample.html as
+// the example for how to call MathJax in your own pages.
+//
+ MathJax.HTML.Cookie.Set("menu",{});
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+ "HTML-CSS": {
+ availableFonts:[],
+ styles: {".MathJax_Preview": {visibility: "hidden"}}
+ }
+ });
+ MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function () {
+ var FONT = MathJax.OutputJax["HTML-CSS"].Font;
+ FONT.loadError = function (font) {
+ MathJax.Message.Set("Can't load web font TeX/"+font.directory,null,2000);
+ document.getElementById("noWebFont").style.display = "";
+ };
+ FONT.firefoxFontError = function (font) {
+ MathJax.Message.Set("Firefox can't load web fonts from a remote host",null,3000);
+ document.getElementById("ffWebFont").style.display = "";
+ };
+ });
+
+(function (HUB) {
+
+ var MINVERSION = {
+ Firefox: 3.0,
+ Opera: 9.52,
+ MSIE: 6.0,
+ Chrome: 0.3,
+ Safari: 2.0,
+ Konqueror: 4.0,
+ Unknown: 10000.0 // always disable unknown browsers
+ };
+
+ if (!HUB.Browser.versionAtLeast(MINVERSION[HUB.Browser]||0.0)) {
+ HUB.Config({
+ jax: [], // don't load any Jax
+ extensions: [], // don't load any extensions
+ "v1.0-compatible": false // skip warning message due to no jax
+ });
+ setTimeout('document.getElementById("badBrowser").style.display = ""',0);
+ }
+
+})(MathJax.Hub);
+
+MathJax.Hub.Register.StartupHook("End",function () {
+ var HTMLCSS = MathJax.OutputJax["HTML-CSS"];
+ if (HTMLCSS && HTMLCSS.imgFonts) {document.getElementById("imageFonts").style.display = ""}
+});
+
+</script>
+<script type="text/javascript" src="../MathJax.js"></script>
+
+<style>
+.warning {
+ color: #800020;
+ background-color: #FFF8F8;
+ border: 2px solid red;
+ margin: 1em 5em;
+ padding: 1em;
+}
+</style>
+</head>
+<body>
+
+<noscript>
+<div style="color:#CC0000; text-align:center">
+<b>Warning: <a href="http://www.mathjax.org/">MathJax</a>
+requires JavaScript to process the mathematics on this page.<br />
+If your browser supports JavaScript, be sure it is enabled.</b>
+</div>
+<hr>
+</noscript>
+
+<blockquote>
+
+<h1>MathJax Test Page</h1>
+
+<p>
+If you see typeset mathematics below, then MathJax is working. If you see
+TeX code instead, MathJax is not working for you.
+</p>
+<!------------------------------------------------------------------------>
+<hr>
+
+
+<p>
+\[
+\frac{-b\pm\sqrt{b^2-4ac}}{2a}
+\]
+</p>
+
+<div style="color:green">
+<div style="text-align:center; color:red; font-size:120%" class="MathJax_Preview">
+MathJax is not working!
+</div><script type="math/tex; mode=display">
+\bf MathJax\ Appears\ to\ be\ Working!
+</script>
+</div>
+
+<hr>
+
+<!------------------------------------------------------------------------>
+
+<div id="badBrowser" style="display:none">
+<div class="warning">
+<b>WARNING</b>: The browser you are using does not appear to support
+MathJax, so we can't test if MathJax is working. Please try a different
+browser, or a newer version of your browser in order to test MathJax.
+</div>
+<hr>
+</div>
+
+<!------------------------------------------------------------------------>
+
+<div id="imageFonts" style="display:none">
+<div class="warning">
+<b>WARNING</b>: The browser you are using does not seem to support web-based
+fonts, so we can't test the MathJax web fonts with this browser (image fonts
+have been used instead). Please try a different browser, or a newer version
+of your browser in order to test MathJax's web-based fonts.
+</div>
+<hr>
+</div>
+
+<!------------------------------------------------------------------------>
+
+<div id="noWebFont" style="display:none">
+<div class="warning">
+<b>WARNING</b>: MathJax's web fonts don't seem to be available. Be sure you have
+the <code>MathJax/fonts</code> directory in place before continuing.
+If you fail to install these fonts, MathJax will not
+work properly with some browsers. If you can't install the image fonts,
+be sure to set the <code>noImageFonts</code> parameter in your MathJax configuration
+(either <code>MathJax/config/MathJax.js</code>, or the
+<code>MathJax.Hub.Config()</code> call in your web page).
+</div>
+<hr>
+</div>
+
+<!------------------------------------------------------------------------>
+
+<div id="ffWebFont" style="display:none">
+<div class="warning">
+<b>WARNING</b>: You are trying to load MathJax from a remote site where the
+web-based fonts are not set up to be shipped to Firefox properly. See the
+<a href="../docs/html/installation.html#notes-about-shared-installations">discussion
+of Firefox's same-origin policy</a> in the MathJax documentation for more
+details.
+</div>
+<hr>
+</div>
+
+<!------------------------------------------------------------------------>
+
+<p>
+Once you have MathJax working properly, view the <a
+href="index-images.html">image mode test page</a> to make sure that the
+image fallback mode is working as well.
+</p>
+
+</blockquote>
+
+</body>
+</html>
diff --git a/static/MathJax/test/index2.html b/static/MathJax/test/index2.html
new file mode 100644
index 0000000..fa8d338
--- /dev/null
+++ b/static/MathJax/test/index2.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>MathJax Test Page</title>
+<!-- Copyright (c) 2009-2011 Design Science, Inc. -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+ "HTML-CSS": {
+ availableFonts:[],
+ styles: {".MathJax_Preview": {visibility: "hidden"}}
+ }
+ });
+</script>
+<script type="text/javascript" src="../MathJax.js"></script>
+
+<style>
+.warning {
+ color: #800020;
+ background-color: #FFF8F8;
+ border: 2px solid red;
+ margin: 1em 5em;
+ padding: 1em;
+}
+</style>
+</head>
+<body>
+
+<noscript>
+<div style="color:#CC0000; text-align:center">
+<b>Warning: <a href="http://www.mathjax.org/">MathJax</a>
+requires JavaScript to process the mathematics on this page.<br />
+If your browser supports JavaScript, be sure it is enabled.</b>
+</div>
+<hr>
+</noscript>
+
+<blockquote>
+
+<h1>MathJax Test Page</h1>
+
+<p>
+If you see typeset mathematics below, then MathJax is working. If you see
+TeX code instead, MathJax is not working for you.
+</p>
+<!------------------------------------------------------------------------>
+<hr>
+
+
+<p>
+$$
+\frac{-b\pm\sqrt{b^2-4ac}}{2a}
+$$
+</p>
+
+<div style="color:green">
+<div style="text-align:center; color:red; font-size:120%" class="MathJax_Preview">
+MathJax is not working!
+</div><script type="math/tex; mode=display">
+\bf MathJax\ Appears\ to\ be\ Working!
+</script>
+</div>
+
+<hr>
+
+<!------------------------------------------------------------------------>
+
+<div id="badBrowser" style="display:none">
+<div class="warning">
+<b>WARNING</b>: The browser you are using does not appear to support
+MathJax, so we can't test if MathJax is working. Please try a different
+browser, or a newer version of your browser in order to test MathJax.
+</div>
+<hr>
+</div>
+
+<!------------------------------------------------------------------------>
+
+<div id="imageFonts" style="display:none">
+<div class="warning">
+<b>WARNING</b>: The browser you are using does not seem to support web-based
+fonts, so we can't test the MathJax web fonts with this browser (image fonts
+have been used instead). Please try a different browser, or a newer version
+of your browser in order to test MathJax's web-based fonts.
+</div>
+<hr>
+</div>
+
+<!------------------------------------------------------------------------>
+
+<div id="noWebFont" style="display:none">
+<div class="warning">
+<b>WARNING</b>: MathJax's web fonts don't seem to be available. Be sure you have
+the <code>MathJax/fonts</code> directory in place before continuing.
+If you fail to install these fonts, MathJax will not
+work properly with some browsers. If you can't install the image fonts,
+be sure to set the <code>noImageFonts</code> parameter in your MathJax configuration
+(either <code>MathJax/config/MathJax.js</code>, or the
+<code>MathJax.Hub.Config()</code> call in your web page).
+</div>
+<hr>
+</div>
+
+<!------------------------------------------------------------------------>
+
+<div id="ffWebFont" style="display:none">
+<div class="warning">
+<b>WARNING</b>: You are trying to load MathJax from a remote site where the
+web-based fonts are not set up to be shipped to Firefox properly. See the
+<a href="../docs/html/installation.html#notes-about-shared-installations">discussion
+of Firefox's same-origin policy</a> in the MathJax documentation for more
+details.
+</div>
+<hr>
+</div>
+
+<!------------------------------------------------------------------------>
+
+<p>
+Once you have MathJax working properly, view the <a
+href="index-images.html">image mode test page</a> to make sure that the
+image fallback mode is working as well.
+</p>
+
+</blockquote>
+
+</body>
+</html>
diff --git a/static/MathJax/test/index3.html b/static/MathJax/test/index3.html
new file mode 100644
index 0000000..bf3fffc
--- /dev/null
+++ b/static/MathJax/test/index3.html
@@ -0,0 +1,24 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>MathJax Test Page</title>
+
+<script type="text/x-mathjax-config">
+ MathJax.Hub.Config({
+ extensions: ["tex2jax.js"],
+ jax: ["input/TeX","output/HTML-CSS"],
+ "HTML-CSS": {
+ availableFonts:[],
+ styles: {".MathJax_Preview": {visibility: "hidden"}}
+ }
+ });
+</script>
+<script type="text/javascript" src="http://localhost:8000/static/MathJax/MathJax.js"></script>
+</head>
+<body>
+
+<h1>MathJax Test Page</h1>
+
+$$ \frac{-b\pm\sqrt{b^2-4ac}}{2a} $$
+
+</body>
+</html>
diff --git a/static/about_en.html b/static/about_en.html
new file mode 100644
index 0000000..5677247
--- /dev/null
+++ b/static/about_en.html
@@ -0,0 +1,17 @@
+<html>
+<meta http-equiv="Content-Type" content="text/html;charset=utf8">
+<body>
+Wikipedia is a free multilingual, open
+content encyclopedia project operated by the United States-based non-profit
+Wikimedia Foundation. It attempts to collect and summarize all human
+knowledge in every major language. As of April 2008, Wikipedia had over 10
+million articles in 253 languages, about a quarter of which are in English.
+Wikipedia's articles have been written collaboratively by volunteers around
+the world, and nearly all of its articles can be edited by anyone with access
+to the Wikipedia website.
+<p>
+All text in Wikipedia is covered by GNU Free Documentation License (GFDL), a
+copyleft license permitting the redistribution, creation of derivative works,
+and commercial use of content while authors retain copyright of their work.
+</body>
+</html>
diff --git a/static/about_es.html b/static/about_es.html
new file mode 100644
index 0000000..93d1649
--- /dev/null
+++ b/static/about_es.html
@@ -0,0 +1,8 @@
+<html>
+<meta http-equiv="Content-Type" content="text/html;charset=utf8">
+<body>
+Wikipedia es un proyecto para escribir comunitariamente enciclopedias libres en todos los idiomas. El concepto wiki permite crear colectivamente documentos web sin que sea necesaria la revisión del contenido antes de su aceptación para ser publicado en la red. La versión en espanol comenzó en mayo de 2001. Tres años después, en septiembre de 2004, unos 10.000 editores activos trabajaban en 1.000.000 de artículos en más de 50 idiomas.
+<p>
+Todo el texto de Wikipedia, y la mayoría de imágenes y otros contenidos, está cubierto por la Licencia de documentación libre GNU (GFDL). Las contribuciones permanecen como propiedad de sus creadores y editores, mientras que la licencia GFDL asegura el carácter de libre distribución y reproducción de los artículos (véase la nota de copyright y de Limitación general de responsabilidad).
+</body>
+</html>
diff --git a/static/about_pl.html b/static/about_pl.html
new file mode 100644
index 0000000..435bb47
--- /dev/null
+++ b/static/about_pl.html
@@ -0,0 +1,18 @@
+<html>
+<meta http-equiv="Content-Type" content="text/html;charset=utf8">
+<body>
+Wikipedia to darmowy projekt wielojęzycznej encyklopedii z otwartą
+zawartością zarządzany przez amerykańską organizację non-profit
+Wikimedia Foundation. Stara się zbierać i podsumować całą
+ludzką wiedzę w każdym większym języku. Do kwietnia 2008, Wikipedia zawierała
+ponad 10 milionów artykułów w 253 językach, z czego jedna czwarta po angielsku.
+Artykuły Wikipedii zostały napisane wspólnie przez wolontairuszy z całego
+świata i prawie wszystkie jej artykuły mogą być edytowane przez każdego
+z dostępem do strony internetowej Wikipedii.
+<br/>
+Wszystkie teksty w Wikipedii objęte są
+licencjÄ… GNU Licencja Wolnej Dokumentacji (GFDL), rodzajem systemu
+licencjonowania praw autorskich zezwalajÄ…cym na redystrybucjÄ™, tworzenie prac pochodnych
+i wykorzystanie komercyjne materiałów pod warunkiem zachowania praw autorskich.
+</body>
+</html>
diff --git a/static/audio.png b/static/audio.png
new file mode 100755
index 0000000..1c56bdc
--- /dev/null
+++ b/static/audio.png
Binary files differ
diff --git a/static/biology.png b/static/biology.png
new file mode 100644
index 0000000..7af35af
--- /dev/null
+++ b/static/biology.png
Binary files differ
diff --git a/static/bullet.gif b/static/bullet.gif
new file mode 100644
index 0000000..b43de48
--- /dev/null
+++ b/static/bullet.gif
Binary files differ
diff --git a/static/common.css b/static/common.css
new file mode 100644
index 0000000..5188437
--- /dev/null
+++ b/static/common.css
@@ -0,0 +1,538 @@
+/* Common CSS for all skins */
+/*<pre><nowiki>*/
+
+/* Estilos para el CommonsTicker ([[Wikiproyecto:CommonsTicker]])
+ According to the CSS specs, @import rules must precede any other CSS rules in a stylesheet,
+ so this creates the need to place it in its own stylesheet for these purposes. */
+/*@import "/w/index.php?title=Wikiproyecto:CommonsTicker/styles.css&action=raw&ctype=text/css&smaxage=2678400";*/
+
+/*InterProject */
+
+.interProject {
+ display:none;
+ clear: both;
+ border-top: 2px dotted #AAAAAA;
+ margin-top: 2em;
+}
+
+/* Evitar la aparición del subrayado al pasar sobre la imagen cuande se usa {{tl|clic}} */
+.clic a:active, .clic a:hover {text-decoration:none}
+
+
+/* Style for "notices" */
+.notice {
+ text-align: justify;
+ margin: 1em;
+ padding: 0.2em;
+}
+
+#disambig {
+ border-top: 3px double #cccccc;
+ border-bottom: 3px double #cccccc;
+}
+
+#spoiler {
+ border-top: 2px solid #ddd;
+ border-bottom:2px solid #ddd;
+}
+
+/* Standard talk template style */
+
+.Talk-Notice {
+ border: 1px solid #C0C090;
+ background-color: #F8EABA;
+ margin-bottom: 3px;
+ width: 85%;
+ border-spacing: 3px;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+/* Make template background appear correctly on all browsers */
+.Talk-Notice td {
+ background: inherit;
+}
+
+/* Choose whether to have AD/BC dates or CE/BCE dates*/
+
+/* First, the default : display both : See templates ADCE and BCEBC for how these are used*/
+.Use_Default_Date_Convention { display: inline; }
+.Use_AD_and_BC { display: none; }
+.Use_BCE_and_CE { display: none; }
+
+/* If you want to display AD and BC add the following to User:You/monobook.css page */
+/*
+.Use_Default_Date_Convention { display: none; }
+.Use_AD_and_BC { display:inline; }
+.Use_BCE_and_CE { display:none; }
+*/
+
+/*If you want to display CE and BCE add the following to User:You/monobook.css page */
+/*
+.Use_Default_Date_Convention { display: none; }
+.Use_AD_and_BC { display:none; }
+.Use_BCE_and_CE {display:inline; }
+*/
+
+/*Add formatting to make sure that "external references" from [[Template:Ref]] do
+ not get URL expansion, not even when printed. The mechanism up to MediaWiki 1.4 was
+ that the HTML code contained a SPAN following the anchor A; this SPAN had the class
+ "urlexpansion", which was not displayed on screen, but was shown when the medium was
+ "print". The rules below ensure (a) that there is no extra padding to the right of
+ the anchor (displayed as "[<number>]"), (b) that there is no "external link arrow" for
+ the link, and (c) that this SPAN of class "urlexpansion" is never shown.
+ ~~~~
+*/
+
+.plainlinksneverexpand {
+ background: none ! important;
+ padding: 0 ! important;
+}
+
+.plainlinksneverexpand .urlexpansion {
+ display : none ! important;
+}
+
+/* Make sure that ext links displayed within "plainlinksneverexpand" don't get
+ the arrow...
+*/
+.plainlinksneverexpand a {
+ background: none !important;
+ padding: 0 !important
+}
+
+/* styles for geography infoboxes, e.g. countries, national subdivisions, cities, etc. */
+
+.InfoDerecha {
+ clear: right;
+ float: right;
+ margin: 0 0 1em 1em;
+}
+
+.infobox.geography {
+ border: 1px solid #ccd2d9;
+ text-align: left;
+ border-collapse: collapse;
+ line-height: 1.2em;
+ font-size: 90%;
+}
+
+.infobox.geography td,
+.infobox.geography th {
+ border-top: solid 1px #ccd2d9;
+ padding: 0.4em 0.2em 0.4em 0.8em;
+}
+.infobox.geography .mergedtoprow td,
+.infobox.geography .mergedtoprow th {
+ border-top: solid 1px #ccd2d9;
+ padding: 0.4em 0.2em 0.2em 0.8em;
+}
+
+.infobox.geography .mergedrow td,
+.infobox.geography .mergedrow th {
+ border: 0;
+ padding: 0 0.2em 0.2em 0.8em;
+}
+
+.infobox.geography .mergedbottomrow td,
+.infobox.geography .mergedbottomrow th {
+ border-top: 0;
+ border-bottom: solid 1px #ccd2d9;
+ padding: 0 0.2em 0.4em 0.8em;
+}
+
+.infobox.geography .maptable td,
+.infobox.geography .maptable th {
+ border: 0;
+ padding: 0 0 0 0;
+}
+
+/* With MediaWiki 1.5, the mechanism has changed: instead of a SPAN of class "urlexpansion"
+ following the anchor A, the anchor itself now has class "external autonumber" and the
+ expansion is inserted when printing (see the common printing style sheet at
+ http://en.wikipedia.org/skins-1.5/common/commonPrint.css) using the ":after" pseudo-
+ element of CSS. We have to switch this off for links due to Template:Ref!
+
+*/
+.plainlinksneverexpand a.external.text:after {
+ display: none !important;
+}
+.plainlinksneverexpand a.external.autonumber:after {
+ display: none !important;
+}
+
+/* Merge template style */
+
+.messagebox {
+ border: 1px solid #aaaaaa;
+ background-color: #f9f9f9;
+ width: 85%;
+ margin: 0 auto 1em auto;
+ padding: .2em;
+ text-align: justify;
+ font-size: 90%;
+}
+.messagebox.merge {
+ border: 1px solid #cf9fff;
+ background-color: #f5edf5;
+ text-align: center;
+}
+.messagebox.cleanup {
+ border: 1px solid #9f9fff;
+ background-color: #efefff;
+ text-align: center;
+}
+.messagebox.standard-talk {
+ border: 1px solid #c0c090;
+ background-color: #f8eaba;
+ text-align: center;
+}
+
+.messagebox.warning {
+ border: 1px solid #fcc;
+ background-color: #fee;
+ text-align: center;
+ font-size: 100%;
+}
+
+/* Article message box template styles */
+table.ambox {
+ margin: 0 10%; /* Will not overlap with other elements */
+ border-collapse: collapse;
+ background: #fbfbfb;
+ border: 1px solid #aaa;
+ border-left: 10px solid #1e90ff; /* Default "notice" blue */
+}
+table.ambox th.ambox-text, table.ambox td.ambox-text { /* The message body cell(s) */
+ padding: 0.25em 0.5em; /* 0.5em left/right */
+ width: 100%; /* Make all templates the same width regardless of text size */
+}
+table.ambox td.ambox-image { /* The left image cell */
+ padding: 2px 0px 2px 0.5em; /* 0.5em left, 0px right */
+ text-align: center;
+}
+table.ambox td.ambox-imageright { /* The right image cell */
+ padding: 2px 4px 2px 0px; /* 0px left, 4px right */
+ text-align: center;
+}
+table.ambox-notice {
+ border-left: 10px solid #1e90ff; /* Blue */
+/* border-right: 10px solid #1e90ff; */ /* If you want two blue bars */
+}
+table.ambox-delete,
+table.ambox-serious {
+ border-left: 10px solid #b22222; /* Red */
+}
+table.ambox-content {
+ border-left: 10px solid #f28500; /* Orange */
+}
+table.ambox-style {
+ border-left: 10px solid #f4c430; /* Yellow */
+}
+table.ambox-merge {
+ border-left: 10px solid #9932cc; /* Purple */
+}
+table.ambox-growth {
+ border-left: 10px solid #228b22; /* Green */
+}
+table.ambox-protection {
+ border-left: 10px solid #bba; /* Gray */
+}
+table.ambox.ambox-mini { /* Small floating box variant */
+ float: right;
+ clear: right;
+ margin: 0 0 0 1em;
+ width: 25%;
+}
+@media print { /* Do not print article message box */
+ .ambox {
+ display: none;
+ }
+}
+
+/* Infobox template style */
+.infobox {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ color: black;
+ margin-bottom: 0.5em;
+ margin-left: 1em;
+ padding: 0.2em;
+ float: right;
+ clear: right;
+}
+.infobox td,
+.infobox th {
+ vertical-align: top;
+}
+.infobox caption {
+ font-size: larger;
+ margin-left: inherit;
+}
+.infobox.bordered {
+ border-collapse: collapse;
+}
+.infobox.bordered td,
+.infobox.bordered th {
+ border: 1px solid #aaa;
+}
+.infobox.bordered .borderless td,
+.infobox.bordered .borderless th {
+ border: 0;
+}
+
+.infobox.sisterproject {
+ width: 20em;
+ font-size: 90%;
+}
+
+@media print {
+ .infobox.sisterproject {
+ display: none;
+ }
+}
+
+/* Importo formato para versos de WikiSource
+pre.verse {
+ background-color: #ffffff;
+ font-family:sans-serif;
+ line-height: 150%;
+ border: none;
+ padding-left: 2em;
+ margin: 0;
+ white-space: pre;
+}
+
+.IconoPlantillaMantenimiento {
+ float:left;
+ margin-left: 1em;
+ margin-right: 1em;
+}
+
+/* Support for Template:IPA, Template:Unicode and Template:Polytonic. The inherit declaration
+ resets the font for all browsers except MSIE6. The empty comment must remain. */
+.IPA {
+ font-family: Chrysanthi Unicode, Doulos SIL, Gentium, GentiumAlt, Code2000,
+ TITUS Cyberbit Basic, DejaVu Sans, Bitstream Vera Sans,
+ Bitstream Cyberbit, Arial Unicode MS, Lucida Sans Unicode,
+ Hiragino Kaku Gothic Pro, Matrix Unicode;
+ font-family /**/:inherit;
+}
+.Unicode {
+ font-family: TITUS Cyberbit Basic, Code2000, Doulos SIL, Chrysanthi Unicode,
+ Bitstream Cyberbit, Bitstream CyberBase, Thryomanes,
+ Gentium, GentiumAlt, Visual Geez Unicode, Lucida Grande,
+ Arial Unicode MS, Microsoft Sans Serif, Lucida Sans Unicode;
+ font-family /**/:inherit;
+}
+.polytonic {
+ font-family: Athena, Gentium, Palatino Linotype, Arial Unicode MS,
+ Lucida Sans Unicode, Lucida Grande, Code2000;
+ font-family /**/:inherit;
+}
+
+/** Estilos para tablas.
+ ** EXPERIMENTAL **
+ la idea es, si se quiere que la primera columna de la tabla esté alineada
+ a la derecha, la segunda centrada y la tercera a la izquierda, usar
+ {| class="col1der col2cen col3izq"
+ en vez de repetir "style='text-align:right'", etc, en '''cada''' celda
+**/
+table.col1der TD:first-child { text-align:right; }
+table.col1izq TD:first-child { text-align:left; }
+table.col1cen TD:first-child { text-align:center; }
+
+table.col2der TD:first-child + TD { text-align:right; }
+table.col2izq TD:first-child + TD { text-align:left; }
+table.col2cen TD:first-child + TD { text-align:center; }
+
+table.col3der TD:first-child + TD + TD { text-align:right; }
+table.col3izq TD:first-child + TD + TD { text-align:left; }
+table.col3cen TD:first-child + TD + TD { text-align:center; }
+
+table.col4der TD:first-child + TD + TD + TD { text-align:right; }
+table.col4izq TD:first-child + TD + TD + TD { text-align:left; }
+table.col4cen TD:first-child + TD + TD + TD { text-align:center; }
+
+table.col5der TD:first-child + TD + TD + TD + TD { text-align:right; }
+table.col5izq TD:first-child + TD + TD + TD + TD { text-align:left; }
+table.col5cen TD:first-child + TD + TD + TD + TD { text-align:center; }
+
+/* hiddenStructure importado de w:en para permitir esconder automáticamente
+ los parámetros vacíos en tablas */
+.hiddenStructure {
+ display: none;
+ speak: none;
+}
+
+/* Ayudita para [[Especial:Allpages]]: los redirects aparecen en cursiva */
+.allpagesredirect {font-style: italic;}
+
+/* Put a checker background at the image description page only visible
+ if the image has transparent background */
+
+#file img {
+ background: url(http://upload.wikimedia.org/wikipedia/commons/5/5d/Checker-16x16.png)
+ repeat;
+}
+
+form#upload,.UploadFormShowed {display: none;}
+
+/* Estilo para controlar el tamaño del texto citado.
+ Quien quiera cambiar el suyo no tiene más que editar su propia monobook.css */
+
+.citado {
+ font-size: 90%;
+ padding: 0.1em;
+}
+
+
+/* Disponibilidad para tareas de mantenimiento/Tablas por día/semana */
+
+table.user-availability {
+ text-align:center;
+ border:1px solid #333366;
+}
+table.user-availability th {
+ font-size:110%
+}
+table.user-availability .toprow td+td {
+ width:30px;
+ height:10px;
+ background-color:#eeeeee;
+ border:1px solid #aaaaaa
+}
+table.user-availability .off {
+ font-size:80%;
+ border:1px solid #aaaaaa;
+ background-color:#ffffff;
+}
+table.user-availability .onn {
+ font-size:80%;
+ border:1px solid #aaaaaa;
+ background-color:#ccffcc;
+}
+table.user-availability .wrk {
+ font-size:80%;
+ border:1px solid #aaaaaa;
+ background-color:#ccccff;
+}
+table.user-availability .cll {
+ font-size:80%;
+ border:1px solid #aaaaaa;
+ background-color:#ffffdd;
+}
+table.user-availability .key {
+ font-size:90%;
+ border-top:1px dashed black;
+ text-align:right
+}
+table.user-availability .key span {
+ padding:2px
+}
+
+/* Change the external link icon to an Adobe icon for all PDF files */
+/* (in browsers that support these CSS selectors, like Mozilla and Opera) */
+#bodyContent a[href$=".pdf"].external,
+#bodyContent a[href*=".pdf?"].external,
+#bodyContent a[href*=".pdf#"].external,
+#bodyContent a[href$=".PDF"].external,
+#bodyContent a[href*=".PDF?"].external,
+#bodyContent a[href*=".PDF#"].external {
+ background: url(http://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Icons-mini-file_acrobat.gif/15px-Icons-mini-file_acrobat.gif) center right no-repeat;
+ padding-right: 16px;
+}
+
+/* Change the external link icon to an Adobe icon anywhere the PDFlink class */
+/* is used (notably Template:PDFlink). This works in IE, unlike the above. */
+span.PDFlink a {
+ background: url(http://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Icons-mini-file_acrobat.gif/15px-Icons-mini-file_acrobat.gif) center right no-repeat !important;
+ padding-right: 17px !important;
+}
+
+/* make the list of references look smaller */
+ol.references {
+ font-size: 100%;
+}
+
+.references-small { font-size: 90%;}
+
+.references-2column {
+ font-size: 90%;
+}
+
+/* Highlight clicked reference in blue to help navigation */
+
+ol.references > li:target {
+background-color: #DEF;
+}
+
+sup.reference:target {
+background-color: #DEF;
+}
+
+/*** Llamadas al pie:
+ esto oculta los corchetes
+ (en los navegadores que entienden css)
+*/
+
+.corchete-llamada { display /**/: none; }
+
+/* Ocultar para los no bibliotecarios */
+.para_biblios { display: none }
+
+.rotate_0 { display: block }
+.rotate_1, .rotate_2, .rotate_3, .rotate_4, .rotate_5, .rotate_6, .rotate_7, .rotate_8, .rotate_9 { display: none }
+/* Geographical coordinates
+
+To display coordinates using the notation in the source code, write this in your User:Username/monobook.css:
+ .geo-default { display: inline } .geo-nondefault { display: none }
+ .geo-dec { display: inline } .geo-dms { display: inline }
+
+To display coordinates using decimal notation, write this in your User:Username/monobook.css:
+ .geo-default { display: inline } .geo-nondefault { display: inline }
+ .geo-dec { display: inline } .geo-dms { display: none }
+
+To display coordinates using DMS notation, write this in your User:Username/monobook.css:
+ .geo-default { display: inline } .geo-nondefault { display: inline }
+ .geo-dec { display: none } .geo-dms { display: inline }
+
+To display coordinates in both decimal and DMS notation, write this in your User:Username/monobook.css:
+ .geo-default { display: inline } .geo-nondefault { display: inline }
+ .geo-dec { display: inline } .geo-dms { display: inline }
+ .geo-multi-punct { display: inline }
+
+See [[Template:Coor link]] for how these are used.
+
+Note that the classes "geo", "longitude", and "latitude" are not just styles but also used by the [[Geo microformat]], so the names should not be changed.
+
+*/
+
+.geo-default { display: inline; }
+.geo-nondefault { display: none; }
+.geo-dms { display: inline; }
+.geo-dec { display: inline; }
+.geo-multi-punct { display: none; }
+
+.longitude .latitude {
+ white-space: nowrap;
+}
+
+/* This is used for the Geo microformat, but no style is needed for now other than .geo-dec. */
+.geo { }
+
+/***** end Geo-related */
+
+/*</nowiki></pre>*/
+
+/* [[Plantilla:Muchasref]] */
+@media screen, projection {
+
+ .listareferencias {
+ border: 1px solid #AAAAAA;
+ height: 220px;
+ overflow: auto;
+ padding: 3px;
+ }
+
+}
diff --git a/static/discussionitem_icon.gif b/static/discussionitem_icon.gif
new file mode 100755
index 0000000..baec471
--- /dev/null
+++ b/static/discussionitem_icon.gif
Binary files differ
diff --git a/static/document.png b/static/document.png
new file mode 100755
index 0000000..b48138e
--- /dev/null
+++ b/static/document.png
Binary files differ
diff --git a/static/earth.png b/static/earth.png
new file mode 100644
index 0000000..ff3abea
--- /dev/null
+++ b/static/earth.png
Binary files differ
diff --git a/static/es-gfdl.html b/static/es-gfdl.html
new file mode 100644
index 0000000..6767eff
--- /dev/null
+++ b/static/es-gfdl.html
@@ -0,0 +1,421 @@
+<html>
+<meta http-equiv="Content-Type" content="text/html;charset=utf8">
+<head>
+<title>Texto de la Licencia de documentación libre de GNU</title>
+</head>
+<body>
+
+<h4>Texto de la Licencia de documentación libre de GNU</h4>
+
+El texto que se reproduce debajo es una copia del texto de la Licencia de documentación libre GNU, bajo la que se encuentra el contenido de la Wikipedia y cuyo texto oficial se encuentra en http://www.gnu.org/copyleft/fdl.html
+Ésta última es la correcta en caso de diferencias entre las mismas.
+
+No es posible hacer traduciones oficiales de la licencia, la versión en inglés es la única con validez jurídica. No obstante, tiene disponible una traducción no oficial al español de la Licencia de documentación libre de GNU.
+
+Las condiciones de licenciamiento del texto de la licencia es el descrito en la misma. No se encuentra sometida a la GFDL como los artículos.
+
+<hr>
+
+
+<pre>
+ GNU Free Documentation License
+ Version 1.2, November 2002
+
+
+ Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+0. PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+
+1. APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The "Document", below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as "you". You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A "Secondary Section" is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject. (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not "Transparent" is called "Opaque".
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification. Examples of
+transparent image formats include PNG, XCF and JPG. Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".) To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+
+2. VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+3. COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+
+4. MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+A. Use in the Title Page (and on the covers, if any) a title distinct
+ from that of the Document, and from those of previous versions
+ (which should, if there were any, be listed in the History section
+ of the Document). You may use the same title as a previous version
+ if the original publisher of that version gives permission.
+B. List on the Title Page, as authors, one or more persons or entities
+ responsible for authorship of the modifications in the Modified
+ Version, together with at least five of the principal authors of the
+ Document (all of its principal authors, if it has fewer than five),
+ unless they release you from this requirement.
+C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+D. Preserve all the copyright notices of the Document.
+E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+F. Include, immediately after the copyright notices, a license notice
+ giving the public permission to use the Modified Version under the
+ terms of this License, in the form shown in the Addendum below.
+G. Preserve in that license notice the full lists of Invariant Sections
+ and required Cover Texts given in the Document's license notice.
+H. Include an unaltered copy of this License.
+I. Preserve the section Entitled "History", Preserve its Title, and add
+ to it an item stating at least the title, year, new authors, and
+ publisher of the Modified Version as given on the Title Page. If
+ there is no section Entitled "History" in the Document, create one
+ stating the title, year, authors, and publisher of the Document as
+ given on its Title Page, then add an item describing the Modified
+ Version as stated in the previous sentence.
+J. Preserve the network location, if any, given in the Document for
+ public access to a Transparent copy of the Document, and likewise
+ the network locations given in the Document for previous versions
+ it was based on. These may be placed in the "History" section.
+ You may omit a network location for a work that was published at
+ least four years before the Document itself, or if the original
+ publisher of the version it refers to gives permission.
+K. For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the section all
+ the substance and tone of each of the contributor acknowledgements
+ and/or dedications given therein.
+L. Preserve all the Invariant Sections of the Document,
+ unaltered in their text and in their titles. Section numbers
+ or the equivalent are not considered part of the section titles.
+M. Delete any section Entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+N. Do not retitle any existing section to be Entitled "Endorsements"
+ or to conflict in title with any Invariant Section.
+O. Preserve any Warranty Disclaimers.
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+
+5. COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications". You must delete all sections
+Entitled "Endorsements".
+
+
+6. COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+
+7. AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+
+8. TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+
+9. TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License. Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License. However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+
+10. FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+
+
+ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+ Copyright (c) YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.2
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+ A copy of the license is included in the section entitled "GNU
+ Free Documentation License".
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+
+ with the Invariant Sections being LIST THEIR TITLES, with the
+ Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+</pre>
+
+</body>
+</html>
diff --git a/static/external.png b/static/external.png
new file mode 100755
index 0000000..419c06f
--- /dev/null
+++ b/static/external.png
Binary files differ
diff --git a/static/file_icon.gif b/static/file_icon.gif
new file mode 100755
index 0000000..847f648
--- /dev/null
+++ b/static/file_icon.gif
Binary files differ
diff --git a/static/headbg.jpg b/static/headbg.jpg
new file mode 100644
index 0000000..5491c6e
--- /dev/null
+++ b/static/headbg.jpg
Binary files differ
diff --git a/static/humanities.png b/static/humanities.png
new file mode 100644
index 0000000..34736c1
--- /dev/null
+++ b/static/humanities.png
Binary files differ
diff --git a/static/index_en.html b/static/index_en.html
new file mode 100644
index 0000000..e4db5c2
--- /dev/null
+++ b/static/index_en.html
@@ -0,0 +1,255 @@
+<html>
+<meta http-equiv="Content-Type" content="text/html;charset=utf8">
+<head><title>Wikipedia: portal page</title></head>
+<center>
+
+<table>
+<tr><td width=45% style="background:#F1FAFF; border:2px solid #C6E4F2;">
+<span style="font-size:110%; font-weight:bold"><a href="/wiki/Wikipedia">Wikipedia</a>: The Free Encyclopedia</a>
+</td>
+<td width=10% style="background:#F1FAFF; border:2px solid #C6E4F2;"><center><img alt="" src="/static/wikipedia.png" height=40px border="0" /></center></td>
+<td width=45% style="background:#F1FAFF; border:2px solid #C6E4F2;"><center><a href="/static/about_en.html">About Wikipedia</a></center>
+</td>
+</tr>
+
+</table>
+
+<table>
+<tr>
+<td width=50% style="background:#F1FAFF; border:2px solid #C6E4F2;">
+<table><tr><td>
+<img alt="" src="/static/phys_science.png" width="60" border="0" /></td>
+<td><span align="center" style="font-size:100%"><a href="/wiki/Science" title="Science">Science</a>: <a href="/wiki/Astronomy" title="Astronomy">Astronomy</a>, <a href="/wiki/Physics" title=Physics>Physics</a> and <a href="/wiki/Chemistry" title=Chemistry">Chemistry</a></span>
+
+<hr />
+
+<center>
+<a href="/wiki/Star" title="Star">Star</a>
+· <a href="/wiki/Moon" title="Moon">Moon</a>
+· <a href="/wiki/Planet" title="Planet">Planet</a>
+· <a href="/wiki/Sun" title="Sun">Sun</a>
+· <a href="/wiki/Universe" title="Universe">Universe</a>
+<br />
+<a href="/wiki/Heat" title="Heat">Heat</a>
+· <a href="/wiki/Color" title="Color">Color</a>
+· <a href="/wiki/Energy" title="Energy">Energy</a>
+· <a href="/wiki/Force" title="Force">Force</a>
+· <a href="/wiki/Light" title="Light">Light</a>
+<br />
+<a href="/wiki/Sound" title="Sound">Sound</a>
+· <a href="/wiki/Time" title="Time">Time</a>
+. <a href="/wiki/Water" title="Water">Water</a>
+· <a href="/wiki/Atom" title="Atom">Atom</a>
+<br />
+· <a href="/wiki/Periodic_table" title="Elements">Elements</a>
+· <a href="/wiki/Fire" title="Fire">Fire</a>
+. <a href="/wiki/Matter" title="Matter">Matter</a>
+· <a href="/wiki/Metal" title="Metal">Metal</a>
+</center>
+</td></tr></table>
+</td>
+
+<td style="background:#F1FAFF; border:2px solid #C6E4F2;">
+
+<table><tr><td>
+<img alt="" src="/static/biology.png" width="60" border="0" />
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Science" title="Science">Science</a>: <a href="/wiki/Biology" name=Biology>Biology</a> and <a href="/wiki/Medicine" name="Medicine">Medicine</a></span>
+<hr />
+<center>
+<a href="/wiki/Animal" title="Animal">Animal</a>
+· <a href="/wiki/Bacteria" title="Bacteria">Bacteria</a>
+· <a href="/wiki/Cell (biology)" title="Cell">Cell</a>
+· <a href="/wiki/Fungi" title="Fungi">Fungi</a>
+<br />
+<a href="/wiki/Plant" title="Plant">Plant</a>
+· <a href="/wiki/Organism" title="Organism">Organism</a>
+· <a href="/wiki/Virus" title="Virus">Virus</a>
+. <a href="/wiki/Anatomy" title="Anatomy">Anatomy</a>
+<br />
+<a href="/wiki/Brain" title="Brain">Brain</a>
+· <a href="/wiki/Death" title="Death">Death</a>
+· <a href="/wiki/Health" title="Health">Health</a>
+<br />
+<a href="/wiki/Human" title="Human">Human</a>
+· <a href="/wiki/Life" title="Life">Life</a>
+<br />
+<a href="/wiki/Agriculture" title="Agriculture">Agriculture</a>
+· <a href="/wiki/Ecology" title="Ecology">Ecology</a>
+· <a href="/wiki/Nature" title="Nature">Nature</a>
+</center>
+</td></tr></table>
+</td>
+</tr>
+
+<tr>
+<td width=50% style="background:#F1FAFF; border:2px solid #C6E4F2">
+
+<table><tr><td>
+<img alt="" src="/static/socialscience.png" width="60" border="0" />
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Social Sciences" title="Social Sciences">Social Sciences</a></span>
+
+<hr />
+<center>
+<a href="/wiki/Anthropology" name="Anthropology">Anthropology</a>
+· <a href="/wiki/Archeology" name="Archeology">Archeology</a>
+· <a href="/wiki/Sociology" title="Sociology">Sociology</a>
+<br />
+<a href="/wiki/Law" title="Law">Law</a>
+· <a href="/wiki/Politics" title="Politics">Politics</a>
+. <a href="/wiki/Business" title="Business">Business</a>
+· <a href="/wiki/Money" title="Money">Money</a>
+. <a href="/wiki/Economy" title="Economy">Economy</a>
+<br />
+<a href="/wiki/Love" title="Love">Love</a>
+· <a href="/wiki/Emotion" title="Emotion">Emotion</a>
+· <a href="/wiki/Psychology" title="Psychology">Psychology</a>
+· <a href="/wiki/Sleep" title="Sleep">Sleep</a>
+</center>
+</td></tr></table>
+</td>
+
+<td style="background:#F1FAFF; border:2px solid #C6E4F2">
+
+<table><tr><td>
+<img alt="" src="/static/society.png" width="60" border="0" />
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Culture" title="Culture">Culture</a> and <a href="/wiki/Society" title="Society">Society</span>
+
+<hr />
+<center>
+<a href="/wiki/Food" title="Food">Food</a>
+· <a href="/wiki/Education" title="Education">Education</a>
+· <a href="/wiki/Clothing" title="Clothing">Clothing</a>
+<br />
+<a href="/wiki/City" title="City">City</a>
+· <a href="/wiki/Community" title="Community">Community</a>
+. <a href="/wiki/Sport" title="Sport">Sport</a>
+· <a href="/wiki/Game" title="Game">Game</a>
+
+</center>
+</td></tr></table>
+</td>
+</tr>
+
+<tr>
+<td width=50% style="background:#F1FAFF; border:2px solid #C6E4F2">
+<table><tr><td>
+
+<img alt="" src="/static/humanities.png" width="60" border="0" />
+</td><td>
+<span style="font-size:100%">Humanities</span>
+<hr />
+<center>
+<a href="/wiki/Alphabet" title="Alphabet">Alphabet</a>
+· <a href="/wiki/Communication" title="Communication">Communication</a>
+· <a href="/wiki/Language" title="Language">Language</a>
+<br />
+<a href="/wiki/Mass media" title="Mass media">Mass media</a>
+. <a href="/wiki/Philosophy" title="Philosophy">Philosophy</a>
+· <a href="/wiki/History" title="History">History</a>
+<br />
+<a href="/wiki/Mythology" title="Mythology">Mythology</a>
+· <a href="/wiki/Religion" title="Religion">Religion</a>
+. <a href="/wiki/Art" title="Art">Art</a
+<br />
+<a href="/wiki/Architecture" title="Architecture">Architecture</a>
+· <a href="/wiki/Painting" title="Painting">Painting</a>
+· <a href="/wiki/Sculpture" title="Sculpture">Sculpture</a>
+
+<br />
+<a href="/wiki/Film" title="Film">Film</a>
+· <a href="/wiki/Dance" title="Dance">Dance</a>
+· <a href="/wiki/Literature" title="Literature">Literature</a>
+<br /><a href="/wiki/Music" title="Music">Music</a>
+· <a href="/wiki/Poetry" title="Poetry">Poetry</a>
+· <a href="/wiki/Theater" title="Theater">Theater</a>
+
+</center>
+
+</td></tr></table>
+</td>
+
+<td style="background:#F1FAFF; border:2px solid #C6E4F2">
+<table><tr><td>
+<img alt="" src="/static/math.png" width="60" order="0" />
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Mathematics" name="Mathematics">Mathematics</a> and <a href="/wiki/Logic" name=Logic>Logic</A></span>
+<hr />
+<center>
+<a href="/wiki/Arithmetic" name="Arithmetic">Arithmetic</a>
+· <a href="/wiki/Geometry" title="Geometry">Geometry</a>
+<br />
+<a href="/wiki/Number" title="Number">Number</a>
+. <a href="/wiki/Addition" name="Addition">Addition</a>
+</center>
+</td></tr></table>
+</td>
+</tr>
+
+<tr>
+<td width=50% style="background:#F1FAFF; border:2px solid #C6E4F2">
+<table><tr><td>
+
+<img alt="" src="/static/technology.png" width="60" border="0" />
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Technology">Technology</a></span>
+<hr />
+<center>
+<a href="/wiki/Computer" title="Computer">Computer</a>
+· <a href="/wiki/Electronics" title="Electronics">Electronics</a>
+· <a href="/wiki/Internet" title="Internet">Internet</a>
+
+<br />
+<a href="/wiki/Radio" title="Radio">Radio</a>
+· <a href="/wiki/Telecommunication" title="Telecommunication">Telecommunication</a>
+<br />
+<a href="/wiki/Television" title="Television">Television</a>
+. <a href="/wiki/Car" title="Car">Car</a>
+· <a href="/wiki/Ship" title="Ship">Ship</a>
+· <a href="/wiki/Train" title="Train">Train</a>
+<br />
+<a href="/wiki/Fuel" title="Fuel">Fuel</a>
+· <a href="/wiki/Electricity" title="Electricity">Electricity</a>
+· <a href="/wiki/Engineering" title="Engineering">Engineering</a>
+
+</center>
+</td></tr></table>
+</td>
+
+<td style="background:#F1FAFF; border:2px solid #C6E4F2">
+<table><tr><td>
+<img alt="" src="/static/earth.png" width="60" border="0" />
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Earth" title="Earth">Earth</a> and <a href="/wiki/Geography" title="Geography">Geography</a></span>
+<hr />
+<center>
+<a href="/wiki/Continent" title="Continent">Continent</a>
+
+· <a href="/wiki/Geology" title="Geology">Geology</a>
+· <a href="/wiki/Mineral" title="Mineral">Mineral</a>
+· <a href="/wiki/Ocean" title="Ocean">Ocean</a>
+<br />
+<a href="/wiki/Climate" title="Climate">Climate</a>
+· <a href="/wiki/Weather" title="Weather">Weather</a>
+<br />
+<a href="/wiki/North America" title="North America">North America</a>
+· <a href="/wiki/South America" title="South America">South America</a>
+<br />
+<a href="/wiki/Africa" title="Africa">Africa</a>
+· <a href="/wiki/Antarctica" title="Antarctica">Antarctica</a>
+· <a href="/wiki/Asia" title="Asia">Asia</a>
+· <a href="/wiki/Europe" title="Europe">Europe</a>
+· <a href="/wiki/Oceania" title="Oceania">Oceania</a>
+</center>
+</td></tr></table>
+</td>
+</tr>
+
+
+</table>
+</center>
+</html>
+
+
diff --git a/static/index_es.html b/static/index_es.html
new file mode 100644
index 0000000..92ae0ca
--- /dev/null
+++ b/static/index_es.html
@@ -0,0 +1,278 @@
+<html>
+<meta http-equiv="Content-Type" content="text/html;charset=utf8">
+<head><title>Wikipedia: portada en su laptop</title></head>
+<center>
+
+<table>
+<tr><td width=45% style="background:#F1FAFF; border:2px solid #C6E4F2;">
+<span style="font-size:110%; font-weight:bold"><a href="/wiki/Wikipedia">Wikipedia</a>: la <a href="/wiki/Enciclopedia">enciclopedia</a> libre
+</td>
+<td width=10% style="background:#F1FAFF; border:2px solid #C6E4F2;"><center><img alt="" src="/static/wikipedia.png" height=40px border="0" /></center></td>
+<td width=45% style="background:#F1FAFF; border:2px solid #C6E4F2;"><center><a href="/static/about_es.html">Acerca de Wikipedia</a></center>
+</td>
+</tr>
+
+</table>
+
+<table>
+<tr>
+<td width=50% style="background:#F1FAFF; border:2px solid #C6E4F2;">
+<table><tr><td>
+<img alt="" src="/static/phys_science.png" width="60" border="0" /></td>
+<td><span align="center" style="font-size:100%"><a href="/wiki/Ciencia" title="Ciencia">Ciencia</a>: <a href="/wiki/Astronom%C3%ADa" title="Astronomía">Astronomía</a>, <a href="/wiki/F%C3%ADsica" title=Física>Física</a> y <a href="/wiki/Qu%C3%ADmica" title=Química">Química</a></span>
+
+<hr />
+
+<center>
+<a href="/wiki/Estrella" title="Estrella">Estrella</a>
+· <a href="/wiki/Luna" title="Luna">Luna</a>
+· <a href="/wiki/Planeta" title="Planeta">Planeta</a>
+· <a href="/wiki/Sol" title="Sol">Sol</a>
+· <a href="/wiki/Universo" title="Universo">Universo</a>
+<br />
+<a href="/wiki/Calor" title="Calor">Calor</a>
+· <a href="/wiki/Color" title="Color">Color</a>
+· <a href="/wiki/Energ%C3%ADa" title="Energía">Energía</a>
+· <a href="/wiki/Fuerza" title="Fuerza">Fuerza</a>
+· <a href="/wiki/Luz" title="Luz">Luz</a>
+<br />
+<a href="/wiki/Movimiento" title="Movimiento">Movimiento</a>
+· <a href="/wiki/Sonido" title="Sonido">Sonido</a>
+· <a href="/wiki/Tiempo" title="Tiempo">Tiempo</a>
+<br />
+<a href="/wiki/Agua" title="Agua">Agua</a>
+· <a href="/wiki/%C3%81tomo" title="Ãtomo">Ãtomo</a>
+· <a href="/wiki/Tabla_peri%C3%B3dica_de_los_elementos" title="Elementos">Elementos</a>
+· <a href="/wiki/Fuego" title="Fuego">Fuego</a>
+<br />
+<a href="/wiki/Materia" title="Materia">Materia</a>
+· <a href="/wiki/Medici%C3%B3n" title="Medición">Medición</a>
+· <a href="/wiki/Metal" title="Metal">Metal</a>
+</center>
+</td></tr></table>
+</td>
+
+<td style="background:#F1FAFF; border:2px solid #C6E4F2;">
+
+<table><tr><td>
+<img alt="" src="/static/biology.png" width="60" border="0" />
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Ciencia" title="Ciencia">Ciencia</a>: <a href="/wiki/Biolog%C3%ADa" name=Biología>Biología</a> y <a href="/wiki/Medicina" name="Medicina">Medicina</a></span>
+<hr />
+<center>
+<a href="/wiki/Animalia" title="Animalia">Animalia</a>
+· <a href="/wiki/Bacteria" title="Bacteria">Bacteria</a>
+· <a href="/wiki/C%C3%A9lula" title="Célula">Célula</a>
+· <a href="/wiki/Fungi" title="Fungi">Fungi</a>
+<br />
+<a href="/wiki/Plantae" title="Plantae">Plantae</a>
+· <a href="/wiki/Ser vivo" title="Ser vivo">Ser vivo</a>
+· <a href="/wiki/Virus" title="Virus">Virus</a>
+<br />
+<a href="/wiki/Anatom%C3%ADa" title="Anatomía">Anatomía</a>
+· <a href="/wiki/Cerebro" title="Cerebro">Cerebro</a>
+· <a href="/wiki/Muerte" title="Muerte">Muerte</a>
+· <a href="/wiki/Salud" title="Salud">Salud</a>
+<br />
+<a href="/wiki/Homo sapiens" title="Seres humanos">Seres humanos</a>
+· <a href="/wiki/Vida" title="Vida">Vida</a>
+<br />
+<a href="/wiki/Agricultura" title="Agricultura">Agricultura</a>
+· <a href="/wiki/Ecolog%C3%ADa" title="Ecología">Ecología</a>
+· <a href="/wiki/Naturaleza" title="Naturaleza">Naturaleza</a>
+</center>
+</td></tr></table>
+</td>
+</tr>
+
+<tr>
+<td width=50% style="background:#F1FAFF; border:2px solid #C6E4F2">
+
+<table><tr><td>
+<img alt="" src="/static/socialscience.png" width="60" border="0" />
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Ciencias Sociales" title="Ciencias Sociales">Ciencias Sociales</a></span>
+
+<hr />
+<center>
+<a href="/wiki/Antropolog%C3%ADa" name="Antropología">Antropología</a>
+· <a href="/wiki/Arqueolog%C3%ADa" name="Arqueología">Arqueología</a>
+· <a href="/wiki/Sociolog%C3%ADa" title="Sociología">Sociología</a>
+<br />
+<a href="/wiki/Derecho" title="Derecho">Derecho</a>
+· <a href="/wiki/Gobierno" title="Gobierno">Gobierno</a>
+· <a href="/wiki/Pa%C3%ADs" title="País">País</a>
+· <a href="/wiki/Pol%C3%ADtica" title="Política">Política</a>
+<br />
+<a href="/wiki/Comercio" title="Comercio">Comercio</a>
+· <a href="/wiki/Dinero" title="Dinero">Dinero</a>
+· <a href="/wiki/Econom%C3%ADa" title="Economía">Economía</a>
+<br />
+<a href="/wiki/Amor" title="Amor">Amor</a>
+· <a href="/wiki/Emoci%C3%B3n" title="Emoción">Emoción</a>
+· <a href="/wiki/Psicolog%C3%ADa" title="Psicología">Psicología</a>
+· <a href="/wiki/Sue%C3%B1o" title="Sueño">Sueño</a>
+</center>
+</td></tr></table>
+</td>
+
+<td style="background:#F1FAFF; border:2px solid #C6E4F2">
+
+<table><tr><td>
+<img alt="" src="/static/society.png" width="60" border="0" />
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Cultura" title="Cultura">Cultura</a> y <a href="/wiki/Sociedad" title="Sociedad">Sociedad</span>
+
+<hr />
+<center>
+<a href="/wiki/Alimento" title="Alimento">Alimento</a>
+· <a href="/wiki/Educaci%C3%B3n" title="Educación">Educación</a>
+· <a href="/wiki/Familia" title="Familia">Familia</a>
+· <a href="/wiki/Indumentaria" title="Ropa">Ropa</a>
+<br />
+<a href="/wiki/Ciudad" title="Ciudad">Ciudad</a>
+· <a href="/wiki/Comunidad" title="Comunidad">Comunidad</a>
+· <a href="/wiki/Tradici%C3%B3n" name="Tradición">Tradición</a>
+<br />
+
+<a href="/wiki/Deporte" title="Deporte">Deporte</a>
+· <a href="/wiki/Humor" title="Humor">Humor</a>
+· <a href="/wiki/Juego" title="Juego">Juego</a>
+
+</center>
+</td></tr></table>
+</td>
+</tr>
+
+<tr>
+<td width=50% style="background:#F1FAFF; border:2px solid #C6E4F2">
+<table><tr><td>
+
+<img alt="" src="/static/humanities.png" width="60" border="0" />
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Humanidades" title="Humanidades">Humanidades</span>
+<hr />
+<center>
+<a href="/wiki/Alfabeto" title="Alfabeto">Alfabeto</a>
+· <a href="/wiki/Comunicaci%C3%B3n" title="Comunicación">Comunicación</a>
+· <a href="/wiki/Lenguaje" title="Lenguaje">Lenguaje</a>
+<br />
+<a href="/wiki/Medio de comunicación" title="Medio de comunicación">Medio de comunicación</a>
+
+<br />
+<a href="/wiki/Filosof%C3%ADa" title="Filosofía">Filosofía</a>
+· <a href="/wiki/Historia" title="Historia">Historia</a>
+· <a href="/wiki/Historia universal" title="Historia universal">Historia universal</a>
+<br />
+<a href="/wiki/Mitolog%C3%ADa" title="Mitología">Mitología</a>
+· <a href="/wiki/Religi%C3%B3n" title="Religión">Religión</a>
+<br />
+
+<a href="/wiki/Arte" title="Arte">Arte</a>
+· <a href="/wiki/Arquitectura" title="Arquitectura">Arquitectura</a>
+· <a href="/wiki/Arte Visual" title="Dibujo">Dibujo</a>
+· <a href="/wiki/Escultura" title="Escultura">Escultura</a>
+
+<br />
+<a href="/wiki/Cine" title="Cine">Cine</a>
+· <a href="/wiki/Danza" title="Danza">Danza</a>
+· <a href="/wiki/Literatura" title="Literatura">Literatura</a>
+<br /><a href="/wiki/M%C3%BAsica" title="Música">Música</a>
+· <a href="/wiki/Poes%C3%ADa" title="Poesía">Poesía</a>
+· <a href="/wiki/Teatro" title="Teatro">Teatro</a>
+
+</center>
+
+</td></tr></table>
+</td>
+
+<td style="background:#F1FAFF; border:2px solid #C6E4F2">
+<table><tr><td>
+<img alt="" src="/static/math.png" width="60" order="0" />
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Matem%C3%A1tica" name="Matemática">Matemática</a> y <a href="/wiki/L%C3%B3gica" name=Lógica>Lógica</A></span>
+<hr />
+<center>
+<a href="/wiki/Aritm%C3%A9tica" name="Aritmética">Aritmética</a>
+· <a href="/wiki/Geometr%C3%ADa" title="Geometría">Geometría</a>
+· <a href="/wiki/N%C3%BAmero" title="Número">Número</a>
+<br />
+<a href="/wiki/Suma" name="Suma">Suma</a>
+· <a href="/wiki/Resta" title="Resta">Resta</a>
+· <a href="/wiki/Fracci%C3%B3n" title="Fracción">Fracción</a>
+<br />
+<a href="/wiki/Multiplicaci%C3%B3n" title="Multiplicación">Multiplicación</a>
+· <a href="/wiki/Divisi%C3%B3n_%28matem%C3%A1ticas%29" title="División">División</a>
+</center>
+</td></tr></table>
+</td>
+</tr>
+
+<tr>
+<td width=50% style="background:#F1FAFF; border:2px solid #C6E4F2">
+<table><tr><td>
+
+<img alt="" src="/static/technology.png" width="60" border="0" />
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Tecnolog%C3%ADa">Tecnología</a></span>
+<hr />
+<center>
+<a href="/wiki/Computadora" title="Computadora">Computadora</a>
+· <a href="/wiki/Electr%C3%B3nica" title="Electrónica">Electrónica</a>
+· <a href="/wiki/Internet" title="Internet">Internet</a>
+
+<br />
+<a href="/wiki/Radio %28medio de comunicaci%C3%B3n%29" title="Radio">Radio</a>
+· <a href="/wiki/Telecomunicaci%C3%B3n" title="Telecomunicación">Telecomunicación</a>
+· <a href="/wiki/Televisi%C3%B3n" title="Televisión">Televisión</a>
+<br />
+<a href="/wiki/Avi%C3%B3n" title="Avión">Avión</a>
+· <a href="/wiki/Autom%C3%B3vil" title="Automóvil">Automóvil</a>
+· <a href="/wiki/Barco" title="Barco">Barco</a>
+· <a href="/wiki/Tren" title="Tren">Tren</a>
+<br />
+<a href="/wiki/Combustible" title="Combustible">Combustible</a>
+· <a href="/wiki/Electricidad" title="Electricidad">Electricidad</a>
+· <a href="/wiki/Ingenier%C3%ADa" title="Ingeniería">Ingeniería</a>
+
+</center>
+</td></tr></table>
+</td>
+
+<td style="background:#F1FAFF; border:2px solid #C6E4F2">
+<table><tr><td>
+<img alt="" src="/static/earth.png" width="60" border="0" />
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Tierra" title="Tierra">Tierra</a> y <a href="/wiki/Geografía" title="Geografía">Geografía</a></span>
+<hr />
+<center>
+<a href="/wiki/Continente" title="Continente">Continente</a>
+
+· <a href="/wiki/Geolog%C3%ADa" title="Geología">Geología</a>
+· <a href="/wiki/Mineral" title="Mineral">Mineral</a>
+· <a href="/wiki/Oc%C3%A9ano" title="Océano">Océano</a>
+<br />
+<a href="/wiki/Clima" title="Clima">Clima</a>
+· <a href="/wiki/Desastre natural" title="Desastre natural">Desastre natural</a>
+· <a href="/wiki/Meteorolog%C3%ADa" title="Meteorología">Meteorología</a>
+
+<br />
+<a href="/wiki/Am%C3%A9rica del Norte" title="América del Norte">América del Norte</a>
+· <a href="/wiki/Am%C3%A9rica del Sur" title="América del Sur">América del Sur</a>
+<br />
+<a href="/wiki/Africa" title="Africa">Africa</a>
+· <a href="/wiki/Ant%C3%A1rtida" title="Antártida">Antártida</a>
+· <a href="/wiki/Asia" title="Asia">Asia</a>
+· <a href="/wiki/Europa" title="Europa">Europa</a>
+· <a href="/wiki/Ocean%C3%ADa" title="Oceanía">Oceanía</a>
+</center>
+</td></tr></table>
+</td>
+</tr>
+
+
+</table>
+</center>
+</html>
+
+
diff --git a/static/index_fr.html b/static/index_fr.html
new file mode 100644
index 0000000..1aa239c
--- /dev/null
+++ b/static/index_fr.html
@@ -0,0 +1,255 @@
+<html>
+<meta http-equiv="Content-Type" content="text/html;charset=utf8">
+<head><title>Wikipédia: page du portail</title></head>
+<center>
+
+<table>
+<tr><td width=45% style="background:#F1FAFF; border:2px solid #C6E4F2;">
+<span style="font-size:110%; font-weight:bold"><a href="/wiki/Wikipedia">Wikipedia</a>: L'encyclopédie libre</a>
+</td>
+<td width=10% style="background:#F1FAFF; border:2px solid #C6E4F2;"><center><img alt="" src="/static/wikipedia.png" height=40px border="0" /></center></td>
+<td width=45% style="background:#F1FAFF; border:2px solid #C6E4F2;"><center><a href="/static/about_fr.html">À propos de Wikipédia</a></center>
+</td>
+</tr>
+
+</table>
+
+<table>
+<tr>
+<td width=50% style="background:#F1FAFF; border:2px solid #C6E4F2;">
+<table><tr><td>
+<img alt="" src="/static/phys_science.png" width="60" border="0" /></td>
+<td><span align="center" style="font-size:100%"><a href="/wiki/Science" title="Science">Science</a>: <a href="/wiki/Astronomie" title="Astronomie">Astronomie</a>, <a href="/wiki/Physique" title=Physique>Physique</a> and <a href="/wiki/Chimie" title=Chimie">Chimie</a></span>
+
+<hr />
+
+<center>
+<a href="/wiki/Étoile" title="Étoile">Étoile</a>
+· <a href="/wiki/Lune" title="Lune">Lune</a>
+· <a href="/wiki/Planète" title="Planète">Planète</a>
+· <a href="/wiki/Soleil" title="Soleil">Soleil</a>
+· <a href="/wiki/Univers" title="Univers">Univers</a>
+<br />
+<a href="/wiki/Chaleur" title="Chaleur">Chaleur</a>
+· <a href="/wiki/Couleur" title="Couleur">Couleur</a>
+· <a href="/wiki/Énergie" title="Énergie">Énergie</a>
+· <a href="/wiki/Force_(physique)" title="Force_(physique)">Force</a>
+· <a href="/wiki/Lumière" title="Lumière">Lumière</a>
+<br />
+
+<a href="/wiki/Son_(physique)" title="Son_(physique)">Son</a>
+· <a href="/wiki/Temps" title="Temps">Temps</a>
+. <a href="/wiki/Eau" title="Eau">Eau</a>
+· <a href="/wiki/Atome" title="Atome">Atome</a>
+<br />
+· <a href="/wiki/Tableau_périodique_des_éléments" title="Éléments">Élements</a>
+· <a href="/wiki/Feu" title="Feu">Feu</a>
+. <a href="/wiki/Matière" title="Matière">Matière</a>
+· <a href="/wiki/Métal" title="Métal">Métal</a>
+</center>
+</td></tr></table>
+</td>
+
+<td style="background:#F1FAFF; border:2px solid #C6E4F2;">
+
+<table><tr><td>
+<img alt="" src="/static/biology.png" width="60" border="0" />
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Science" title="Science">Science</a>: <a href="/wiki/Biologie" name=Biologie>Biologie</a> and <a href="/wiki/Médecine" name="Médecine">Médecine</a></span>
+<hr />
+<center>
+<a href="/wiki/Animalia" title="Animal">Animal</a>
+· <a href="/wiki/Bacterie" title="Bacterie">Bacterie</a>
+· <a href="/wiki/Cellule_(biologie)" title="Cell">Cell</a>
+· <a href="/wiki/Fungi" title="Fungi">Fungi</a>
+<br />
+<a href="/wiki/Plante" title="Plante">Plante</a>
+· <a href="/wiki/Origine_de_la_vie" title="Origine_de_la_vie">Origine de la vie</a>
+· <a href="/wiki/Virus" title="Virus">Virus</a>
+. <a href="/wiki/Anatomie" title="Anatomie">Anatomie</a>
+<br />
+<a href="/wiki/Cerveau" title="Cerveau">Cerveau</a>
+· <a href="/wiki/Mort" title="Mort">Mort</a>
+· <a href="/wiki/Santé" title="Santé">Santé</a>
+<br />
+<a href="/wiki/Humanité" title="Humanité">Humanité</a>
+· <a href="/wiki/Vie" title="Vie">Vie</a>
+<br />
+<a href="/wiki/Agriculture" title="Agriculture">Agriculture</a>
+· <a href="/wiki/Ecologie" title="Ecologie">Ecologie</a>
+· <a href="/wiki/Nature" title="Nature">Nature</a>
+</center>
+</td></tr></table>
+</td>
+</tr>
+
+<tr>
+<td width=50% style="background:#F1FAFF; border:2px solid #C6E4F2">
+
+<table><tr><td>
+<img alt="" src="/static/socialscience.png" width="60" border="0" />
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Sciences_sociales" title="Sciences sociales">Sciences sociales</a></span>
+
+<hr />
+<center>
+<a href="/wiki/Anthropologie" name="Anthropologie">Anthropologie</a>
+· <a href="/wiki/Archéologie" name="Archéologie">Archéologie</a>
+· <a href="/wiki/Sociologie" title="Sociologie">Sociologie</a>
+<br />
+<a href="/wiki/Loi" title="Loi">Loi</a>
+· <a href="/wiki/Politique" title="Politique">Politique</a>
+. <a href="/wiki/Économie" title="Économie">Économie</a>
+<br />
+<a href="/wiki/Amour" title="Amour">Amour</a>
+· <a href="/wiki/Émotion" title="Émotion">Émotion</a>
+· <a href="/wiki/Psychologie" title="Psychologie">Psychologie</a>
+· <a href="/wiki/Sommeil" title="Sommeil">Sommeil</a>
+</center>
+</td></tr></table>
+</td>
+
+<td style="background:#F1FAFF; border:2px solid #C6E4F2">
+
+<table><tr><td>
+<img alt="" src="/static/society.png" width="60" border="0" />
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Culture" title="Culture">Culture</a> and <a href="/wiki/Société_(sciences_sociales)" title="Société">Société</span>
+
+<hr />
+<center>
+<a href="/wiki/Nourriture" title="Nourriture">Nourriture</a>
+· <a href="/wiki/Education" title="Education">Education</a>
+· <a href="/wiki/Vêtement" title="Vêtement">Vêtement</a>
+<br />
+<a href="/wiki/Cité" title="Cité">Cité</a>
+· <a href="/wiki/Communauté" title="Communauté">Communauté</a>
+. <a href="/wiki/Sport" title="Sport">Sport</a>
+· <a href="/wiki/Jeu" title="Jeu">Jeu</a>
+
+</center>
+</td></tr></table>
+</td>
+</tr>
+
+<tr>
+<td width=50% style="background:#F1FAFF; border:2px solid #C6E4F2">
+<table><tr><td>
+
+<img alt="" src="/static/humanities.png" width="60" border="0" />
+</td><td>
+<span style="font-size:100%">Humanities</span>
+<hr />
+<center>
+<a href="/wiki/Alphabet" title="Alphabet">Alphabet</a>
+· <a href="/wiki/Communication" title="Communication">Communication</a>
+· <a href="/wiki/Langage" title="Langage">Langage</a>
+<br />
+<a href="/wiki/Média" title="Média">Média</a>
+. <a href="/wiki/Philosophie" title="Philosophie">Philosophie</a>
+· <a href="/wiki/Histoire" title="Histoire">Histoire</a>
+<br />
+<a href="/wiki/Mythologie" title="Mythologie">Mythologie</a>
+· <a href="/wiki/Religion" title="Religion">Religion</a>
+. <a href="/wiki/Art" title="Art">Art</a
+<br />
+<a href="/wiki/Architecture" title="Architecture">Architecture</a>
+· <a href="/wiki/Peinture" title="Peinture">Peinture</a>
+· <a href="/wiki/Sculpture" title="Sculpture">Sculpture</a>
+
+<br />
+<a href="/wiki/Cinéma" title="Cinéma">Cinéma</a>
+· <a href="/wiki/Dance" title="Dance">Dance</a>
+· <a href="/wiki/Littérature" title="Littérature">Littérature</a>
+<br /><a href="/wiki/Musique" title="Musique">Musique</a>
+· <a href="/wiki/Poésie" title="Poésie">Poésie</a>
+· <a href="/wiki/Théâtre" title="Théâtre">Théâtre</a>
+
+</center>
+
+</td></tr></table>
+</td>
+
+<td style="background:#F1FAFF; border:2px solid #C6E4F2">
+<table><tr><td>
+<img alt="" src="/static/math.png" width="60" order="0" />
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Mathématiques" name="Mathématiques">Mathématiques</a> and <a href="/wiki/Logique" name="Logique">Logique</A></span>
+<hr />
+<center>
+<a href="/wiki/Arithmétique" name="Arithmétique">Arithmétique</a>
+· <a href="/wiki/Géométrie" title="Géométrie">Géométrie</a>
+<br />
+<a href="/wiki/Chiffre" title="Chiffre">Chiffre</a>
+. <a href="/wiki/Addition" name="Addition">Addition</a>
+</center>
+</td></tr></table>
+</td>
+</tr>
+
+<tr>
+<td width=50% style="background:#F1FAFF; border:2px solid #C6E4F2">
+<table><tr><td>
+
+<img alt="" src="/static/technology.png" width="60" border="0" />
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Technologie">Technologie</a></span>
+<hr />
+<center>
+<a href="/wiki/Ordinateur" title="Ordinateur">Ordinateur</a>
+· <a href="/wiki/Électronique" title="Électronique">Électronique</a>
+· <a href="/wiki/Internet" title="Internet">Internet</a>
+
+<br />
+<a href="/wiki/Radiodiffusion" title="Radiodiffusion">Radiodiffusion</a>
+· <a href="/wiki/Télécommunications" title="Télécommunications">Télécommunications</a>
+<br />
+<a href="/wiki/Télévision" title="Télévision">Télévision</a>
+. <a href="/wiki/Automobile" title="Automobile">Automobile</a>
+· <a href="/wiki/Bateau" title="Bateau">Bateau</a>
+· <a href="/wiki/Train" title="Train">Train</a>
+<br />
+<a href="/wiki/Combustible" title="Combustible">Combustible</a>
+· <a href="/wiki/Électricité" title="Électricité">Électricité</a>
+· <a href="/wiki/Ingénierie" title="Ingénierie">Ingénierie</a>
+
+</center>
+</td></tr></table>
+</td>
+
+<td style="background:#F1FAFF; border:2px solid #C6E4F2">
+<table><tr><td>
+<img alt="" src="/static/earth.png" width="60" border="0" />
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Terre" title="Terre">Terre</a> and
+<a href="/wiki/Géographie" title="Géographie">Géographie</a></span>
+<hr />
+<center>
+<a href="/wiki/Continent" title="Continent">Continent</a>
+
+· <a href="/wiki/Géologie" title="Géologie">Géologie</a>
+· <a href="/wiki/Minéral" title="Minéral">Minéral</a>
+· <a href="/wiki/Océan" title="Océan">Océan</a>
+<br />
+<a href="/wiki/Climat" title="Climat">Climat</a>
+· <a href="/wiki/Météorologie" title="Météorologie">Météorologie</a>
+<br />
+<a href="/wiki/Amérique_du_Nord" title="Amérique du Nord">Amérique du Nord</a>
+· <a href="/wiki/Amérique_du_Sud" title="Amérique du Sud">Amérique du Sud</a>
+<br />
+<a href="/wiki/Afrique" title="Afrique">Afrique</a>
+· <a href="/wiki/Antarctique" title="Antarctique">Antarctique</a>
+· <a href="/wiki/Asie" title="Asie">Asie</a>
+· <a href="/wiki/Europe" title="Europe">Europe</a>
+· <a href="/wiki/Oceanie" title="Oceanie">Oceanie</a>
+</center>
+</td></tr></table>
+</td>
+</tr>
+
+
+</table>
+</center>
+</html>
+
+
diff --git a/static/index_gn.html b/static/index_gn.html
new file mode 100644
index 0000000..07ec033
--- /dev/null
+++ b/static/index_gn.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="gn" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Vikipetã</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<meta http-equiv="Content-Style-Type" content="text/css" />
+<meta name="generator" content="MediaWiki 1.18wmf1" />
+<style type="text/css" media="all">a:lang(ar),a:lang(ckb),a:lang(fa),a:lang(kk-arab),a:lang(mzn),a:lang(ps),a:lang(ur){text-decoration:none}a.new,#quickbar a.new{color:#ba0000}
+</style>
+<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-Ape action-view skin-vector">
+ <div id="content">
+ <a id="top"></a>
+ <div id="bodyContent">
+ <div id="contentSub"></div>
+<table class="radius" cellspacing="10" cellpadding="0">
+<tr>
+<td colspan="2" style="background:#ffffff; border:1px solid #eeeeee; -moz-border-radius-topleft:0px; -moz-border-radius-bottomleft:0px; padding:10px 10px 10px 10px;" valign="top">
+<center>
+<table width="100%" style="background:transparent; font-size:100%">
+<tr>
+<td width="58%" align="center" valign="center">
+<p><span style="text-align: center; font-size: 140%;line-height: 1.3">Tapeg̃uahe porãite <a href="/wiki/Wikipedia" title="Wikipedia" class="mw-redirect">Vikipetã</a>!</span><br />
+<span style="text-align: center;"><a href="/wiki/Ava%C3%B1e%27%E1%BA%BD" title="Avañe'ẽ">Avañe'ẽ</a> Wikipedia (<a href="/wiki/2005" title="2005">2005</a> ary -<a href="/wiki/2012" title="2012">2012</a> ary)<br /></span></p>
+<div style="text-align:center"><b><a href="/wiki/Pytyv%C3%B5:Pytyv%C3%B5h%C3%A1ra" title="Pytyvõ:Pytyvõhára">Pytyvõhára · Ayuda · Help</a></b></div>
+</td>
+</tr>
+</table>
+</center>
+</td>
+</tr>
+<tr>
+<td width="52%" style="background:#f5fffa; border:1px solid #e1eaee; font-size:100%; -moz-border-radius-topleft:0px; -moz-border-radius-bottomleft:0px; padding:7px 7px 7px 7px;" valign="top">
+<table width="100%" cellpadding="0" cellspacing="0" style="background:#F1FAFF;">
+<tr>
+</tr>
+<tr>
+<td style="background:#f5fffa; padding-left:0px; padding-top:2px; padding-bottom:2px;">
+<table width="100%" style="background:transparent; font-size:8pt" cellspacing="10">
+<tr>
+<td valign="top">
+<b><a href="/wiki/Paraguai" title="Paraguai">Paraguai</a></b><br /></td>
+<td valign="top">
+<b><a href="/wiki/Argentina" title="Argentina">Argentina</a></b><br /></td>
+<td valign="top">
+<b><a href="/wiki/Volívia" title="Volívia">Volívia</a></b><br /></td>
+</tr>
+<tr>
+<td valign="top">
+<b><a href="/wiki/Brasil" title="Brasil">Brasil</a></b><br /></td>
+<td valign="top">
+<b><a href="/wiki/Uruguái" title="Uruguái">Uruguái</a></b><br /></td>
+<td valign="top">
+<b><a href="/wiki/Chile" title="Chile">Chile</a></b><br /></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+<tr>
+<td width="48%" style="background:#fffff3; border:1px solid #eeeed1; font-size:100%; -moz-border-radius-topright:0px; -moz-border-radius-bottomright:0px; padding:7px 7px 7px 7px;" valign="top">
+<table width="100%" cellpadding="0" cellspacing="0" style="background:#fffff3;">
+<tr>
+<td style="padding-bottom:5px;"></td>
+</tr>
+</table>
+<table width="100%" cellpadding="0" cellspacing="0" style="background:#fffff3;">
+<tr>
+<th style="background:#F0F3CD; border:1px solid #ddddc0; text-align:center;">
+<div style="font-size:120%">Ñañepyrũ!</div>
+</th>
+</tr>
+<tr>
+<td style="background:#fffff3; padding-left:0px; padding-top:2px; padding-bottom:2px; padding-right:0px;">
+<center><font color="green"><b>Artículos seleccionados</b></font></center>
+<hr />
+<div class="references-small" style="-moz-column-count:4; column-count:2;">
+<p><b>Tekove</b></p>
+<ul>
+<li><a href="/wiki/Gabriel_Casaccia" title="Gabriel Casaccia">Gabriel Casaccia</a></li>
+<li><a href="/wiki/Agust%C3%ADn_Barboza" title="Agustín Barboza">Agustín Barboza</a></li>
+<li><a href="/wiki/Carlos_Lara_Bareiro" title="Carlos Lara Bareiro">Carlos Lara Bareiro</a></li>
+<li><a href="/wiki/Cayo_Sila_Godoy" title="Cayo Sila Godoy">Cayo Sila Godoy</a></li>
+<li><a href="/wiki/Maneco_Galeano" title="Maneco Galeano">Maneco Galeano</a></li>
+<li><a href="/wiki/Augusto_Roa_Bastos" title="Augusto Roa Bastos">Augusto Roa Bastos</a></li>
+<li><a href="/wiki/F%C3%A9lix_P%C3%A9rez_Cardozo" title="Félix Pérez Cardozo">Félix Pérez Cardozo</a></li>
+<li><a href="/wiki/Edda_de_los_R%C3%ADos" title="Edda de los Ríos">Edda de los Ríos</a></li>
+</ul>
+<p><b>Ñe'ẽnguéra</b></p>
+<ul>
+<li><a href="/wiki/%C3%91e%27%E1%BA%BDkuaaty_ha_%C3%91e%27%E1%BA%BDtekuaa" title="Ñe'ẽkuaaty ha Ñe'ẽtekuaa">Ñe'ẽkuaaty ha Ñe'ẽtekuaa</a></li>
+<li><a href="/wiki/%C3%91e%27%E1%BA%BDt%C3%A9va_Guaran%C3%ADme" title="Ñe'ẽtéva Guaraníme">Ñe'ẽtéva Guaraníme</a></li>
+<li><a href="/wiki/Ava%C3%B1e%27%E1%BA%BD" title="Avañe'ẽ">Avañe'ẽ</a></li>
+<li><a href="/wiki/Guarani_reko_ha_%C3%B1e%27%E1%BA%BD" title="Guarani reko ha ñe'ẽ">Guarani reko ha ñe'ẽ</a></li>
+<li><a href="/wiki/Guarani_%C3%91e%27%E1%BA%BDpukuaa" title="Guarani Ñe'ẽpukuaa">Guarani Ñe'ẽpukuaa</a></li>
+<li><a href="/wiki/K%C3%A1so_%C3%91emombe%27u" title="Káso Ñemombe'u">Káso Ñemombe'u</a></li>
+<li><a href="/wiki/Pukar%C3%A3" title="Pukarã">Pukarã</a></li>
+<li><a href="/wiki/Tero_Guaran%C3%ADme" title="Tero Guaraníme">Tero Guaraníme</a></li>
+<li><a href="/wiki/Teroja_Guaran%C3%ADme" title="Teroja Guaraníme">Teroja Guaraníme</a></li>
+<li><a href="/wiki/%C3%91e%27%E1%BA%BDjoaju_Guaran%C3%ADme" title="Ñe'ẽjoaju Guaraníme">Ñe'ẽjoaju Guaraníme</a></li>
+<li><a href="/wiki/%C3%91e%27%E1%BA%BDpoty_Guaran%C3%ADme" title="Ñe'ẽpoty Guaraníme">Ñe'ẽpoty Guaraníme</a></li>
+<li><a href="/wiki/%C3%91e%27%E1%BA%BDpykuaa_Guaran%C3%ADme" title="Ñe'ẽpykuaa Guaraníme">Ñe'ẽpykuaa Guaraníme</a></li>
+<li><a href="/wiki/%C3%91e%27%E1%BA%BDteja_Guaran%C3%ADme" title="Ñe'ẽteja Guaraníme">Ñe'ẽteja Guaraníme</a></li>
+<li><b><a href="/wiki/%C3%91emohenda:Ava%C3%B1e%27%E1%BA%BD" title="Ñemohenda:Avañe'ẽ">Veáse más sobre ñe'ẽ</a></b></li>
+</ul>
+<p><b>Mombe'ugua'ukuéra</b></p>
+<ul>
+<li><a href="/wiki/Teju_jagua" title="Teju jagua">Teju jagua</a></li>
+<li><a href="/wiki/Mb%C3%B3i_tu%27%C4%A9" title="Mbói tu'ĩ">Mbói tu'ĩ</a></li>
+<li><a href="/wiki/Kurupi" title="Kurupi">Kurupi</a></li>
+<li><a href="/wiki/Ao_ao" title="Ao ao">Ao ao</a></li>
+<li><a href="/wiki/Mo%C3%B1%C3%A1i" title="Moñái">Moñái</a></li>
+<li><a href="/wiki/Jasy_jatere" title="Jasy jatere">Jasy jatere</a></li>
+<li><a href="/wiki/Luis%C3%B5" title="Luisõ">Luisõ</a></li>
+</ul>
+</div>
+</td>
+</tr>
+<tr>
+<td style="padding-bottom:5px;"></td>
+</tr>
+</table>
+</td>
+</tr>
+
+</div>
+
+ </div>
+ </div>
+
+ </body>
+</html>
diff --git a/static/index_pl.html b/static/index_pl.html
new file mode 100644
index 0000000..32fc2b5
--- /dev/null
+++ b/static/index_pl.html
@@ -0,0 +1,276 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><META http-equiv="Content-Type" content="text/html; charset=utf-8"></head>
+<body>
+
+<center>
+
+<table>
+<tr><td width="45%" style="background:#f1faff;border:2px solid #c6e4f2">
+<span style="font-size:110%;font-weight:bold"><a href="/wiki/Wikipedia" target="_blank">Wikipedia</a>: Wolna Encyklopedia
+</span></td>
+<td width="10%" style="background:#f1faff;border:2px solid #c6e4f2"><center><img alt="" src="/static/wikipedia.png" height="40px" border="0"></center></td>
+<td width="45%" style="background:#f1faff;border:2px solid #c6e4f2"><center><a href="/static/about_pl.html" target="_blank">About Wikipedia</a></center>
+</td>
+</tr>
+
+</table>
+
+<table>
+<tr>
+<td width="50%" style="background:#f1faff;border:2px solid #c6e4f2">
+<table><tr><td>
+<img alt="" src="/static/phys_science.png" width="60" border="0"></td>
+<td><span align="center" style="font-size:100%"><a href="/wiki/Nauka" title="Nauka" target="_blank">Nauka</a>: <a href="/wiki/Astronomia" title="Astronomia" target="_blank">Astronomia</a>, <a href="/wiki/Fizyka" title="Fizyka" target="_blank">Fizyka</a> i <a href="/wiki/Chemia" title="Chemia&quot;" target="_blank">Chemia</a></span>
+
+<hr>
+
+<center>
+<a href="/wiki/Gwiazda" title="Gwiazda" target="_blank">Gwiazda</a>
+· <a href="/wiki/Księżyc" title="Księżyc" target="_blank">Księżyc</a>
+· <a href="/wiki/Planeta" title="Planeta" target="_blank">Planeta</a>
+· <a href="/wiki/Słońce" title="Słońce" target="_blank">Słońce</a>
+· <a href="/wiki/Wszechświat" title="Wszechświat" target="_blank">Wszechświat</a>
+
+<br>
+<a href="/wiki/Ciepło" title="Ciepło" target="_blank">Ciepło</a>
+· <a href="/wiki/Barwa" title="Barwa" target="_blank">Barwa</a>
+· <a href="/wiki/Energia_(fizyka)" title="Energia" target="_blank">Energia</a>
+· <a href="/wiki/Siła" title="Siła" target="_blank">Siła</a>
+· <a href="/wiki/Światło" title="Światło" target="_blank">Światło</a>
+<br>
+<a href="/wiki/Dźwięk" title="Dźwięk" target="_blank">Dźwięk</a>
+
+· <a href="/wiki/Czas" title="Czas" target="_blank">Czas</a>
+. <a href="/wiki/Woda" title="Woda" target="_blank">Woda</a>
+· <a href="/wiki/Atomy" title="Atomy" target="_blank">Atomy</a>
+<br>
+· <a href="/wiki/Pierwiastek_chemiczny" title="Pierwiastki" target="_blank">Pierwiastki</a>
+· <a href="/wiki/Ogień" title="Ogień" target="_blank">Ogień</a>
+. <a href="/wiki/Materia_(fizyka)" title="Materia" target="_blank">Materia</a>
+
+· <a href="/wiki/Metale" title="Metale" target="_blank">Metale</a>
+</center>
+</td></tr></table>
+</td>
+
+<td style="background:#f1faff;border:2px solid #c6e4f2">
+
+<table><tr><td>
+<img alt="" src="/static/biology.png" width="60" border="0">
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Nauka" title="Nauka" target="_blank">Nauka</a>: <a href="/wiki/Biologia" name="0.1_Biologia" target="_blank">Biologia</a> i <a href="/wiki/Medycyna" name="0.1_Medycyna" target="_blank">Medycyna</a></span>
+
+<hr>
+<center>
+<a href="/wiki/Zwierzęta" title="Zwierzęta" target="_blank">Zwierzęta</a>
+· <a href="/wiki/Bakterie" title="Bakteria" target="_blank">Bakterie</a>
+· <a href="/wiki/Komórka" title="Komórka" target="_blank">Komórka</a>
+· <a href="/wiki/Grzyby" title="Grzyby" target="_blank">Grzyby</a>
+<br>
+<a href="/wiki/Rośliny" title="Rośliny" target="_blank">Rośliny</a>
+· <a href="/wiki/Organizmy" title="Organizmy" target="_blank">Organizmy</a>
+
+· <a href="/wiki/Wirusy" title="Wirusy" target="_blank">Wirusy</a>
+. <a href="/wiki/Anatomia" title="Anatomia" target="_blank">Anatomia</a>
+<br>
+<a href="/wiki/Mózgowie" title="Mózgowie" target="_blank">Mózgowie</a>
+· <a href="/wiki/Śmierć" title="Śmierć" target="_blank">Śmierć</a>
+· <a href="/wiki/Zdrowie" title="Zdrowie" target="_blank">Zdrowie</a>
+<br>
+<a href="/wiki/Homo_sapiens" title="Człowiek" target="_blank">Człowiek</a>
+
+· <a href="/wiki/Życie" title="Życie" target="_blank">Życie</a>
+<br>
+<a href="/wiki/Rolnictwo" title="Rolnictwo" target="_blank">Rolnictwo</a>
+· <a href="/wiki/Ekologia" title="Ekologia" target="_blank">Ekologia</a>
+· <a href="/wiki/Natura" title="Natura" target="_blank">Natura</a>
+</center>
+</td></tr></table>
+</td>
+</tr>
+
+<tr>
+<td width="50%" style="background:#f1faff;border:2px solid #c6e4f2">
+
+<table><tr><td>
+<img alt="" src="/static/socialscience.png" width="60" border="0">
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Nauki_społeczne" title="Nauki Społeczne" target="_blank">Nauki Społeczne</a></span>
+
+<hr>
+<center>
+<a href="/wiki/Antropologia" name="Antropologia" target="_blank">Antropologia</a>
+· <a href="/wiki/Archeologia" name="Archeologia" target="_blank">Archeologia</a>
+· <a href="/wiki/Etnologia" name="Etnologia" target="_blank">Etnologia</a>
+
+· <a href="/wiki/Socjologia" title="Socjologia" target="_blank">Socjologia</a>
+<br>
+<a href="/wiki/Prawo" title="Prawo" target="_blank">Prawo</a>
+· <a href="/wiki/Polityka" title="Polityka" target="_blank">Polityka</a>
+. <a href="/wiki/ZarzÄ…dzanie" title="ZarzÄ…dzanie" target="_blank">ZarzÄ…dzanie</a>
+· <a href="/wiki/Pieniądze" title="Pieniądze" target="_blank">Pieniądze</a>
+. <a href="/wiki/Ekonomia" title="Ekonomia" target="_blank">Ekonomia</a>
+
+<br>
+<a href="/wiki/Miłość" title="Miłość" target="_blank">Miłość</a>
+· <a href="/wiki/Emocje" title="Emocje" target="_blank">Emocje</a>
+· <a href="/wiki/Psychologia" title="Psychologia" target="_blank">Psychologia</a>
+· <a href="/wiki/Sen" title="Sen" target="_blank">Sen</a>
+</center>
+</td></tr></table>
+</td>
+
+<td style="background:#f1faff;border:2px solid #c6e4f2">
+
+<table><tr><td>
+<img alt="" src="/static/society.png" width="60" border="0">
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Kultura" title="Kultura" target="_blank">Kultura</a> i <a href="/wiki/Społeczeństwo" title="Społeczeństwo" target="_blank">Społeczeństwo</a></span>
+
+<hr>
+<center>
+<a href="/wiki/Żywność" title="Żywność" target="_blank">Żywność</a>
+· <a href="/wiki/Edukacja" title="Edukacja" target="_blank">Edukacja</a>
+
+· <a href="/wiki/Odzież" title="Odzież" target="_blank">Odzież</a>
+<br>
+<a href="/wiki/Miasto" title="Miasto" target="_blank">Miasto</a>
+· <a href="/wiki/Społeczność" title="Społeczność" target="_blank">Społeczność</a>
+. <a href="/wiki/Sport" title="Sport" target="_blank">Sport</a>
+· <a href="/wiki/Gra" title="Gra" target="_blank">Gra</a>
+
+</center>
+
+</td></tr></table>
+</td>
+</tr>
+
+<tr>
+<td width="50%" style="background:#f1faff;border:2px solid #c6e4f2">
+<table><tr><td>
+
+<img alt="" src="/static/humanities.png" width="60" border="0">
+</td><td>
+<a href="/wiki/Nauki_humanistyczne" title="Nauki humanistyczne" target="_blank">Nauki humanistyczne</a>
+<hr>
+<center>
+<a href="/wiki/Alfabet" title="Alfabet" target="_blank">Alfabet</a>
+· <a href="/wiki/Komunikacja" title="Komunikacja" target="_blank">Komunikacja</a>
+
+· <a href="/wiki/Język_(mowa)" title="Język" target="_blank">Język</a>
+<br>
+<a href="/wiki/Åšrodki_masowego_przekazu" title="Media" target="_blank">Media</a>
+. <a href="/wiki/Filozofia" title="Filozofia" target="_blank">Filozofia</a>
+· <a href="/wiki/Historia" title="Historia" target="_blank">Historia</a>
+<br>
+<a href="/wiki/Mitologia" title="Mitologia" target="_blank">Mitologia</a>
+· <a href="/wiki/Religia" title="Religia" target="_blank">Religia</a>
+
+. <a href="/wiki/Sztuka" title="Sztuka" target="_blank">Sztuka</a><br>
+<a href="/wiki/Architektura" title="Architektura" target="_blank">Architektura</a>
+· <a href="/wiki/Malarstwo" title="Malarstwo" target="_blank">Malarstwo</a>
+· <a href="/wiki/Rzeźba" title="Rzeźba" target="_blank">Rzeźba</a>
+
+<br>
+<a href="/wiki/Film" title="Film" target="_blank">Film</a>
+· <a href="/wiki/Taniec" title="Taniec" target="_blank">Taniec</a>
+
+· <a href="/wiki/Literatura" title="Literatura" target="_blank">Literatura</a>
+<br><a href="/wiki/Muzyka" title="Muzyka" target="_blank">Muzyka</a>
+· <a href="/wiki/Poezja" title="Poezja" target="_blank">Poezja</a>
+· <a href="/wiki/Teatr" title="Teatr" target="_blank">Teatr</a>
+
+</center>
+
+</td></tr></table>
+</td>
+
+<td style="background:#f1faff;border:2px solid #c6e4f2">
+<table><tr><td>
+<img alt="" src="/static/math.png" width="60">
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Matematyka" name="0.1_Matematyka" target="_blank">Matematyka</a> i <a href="/wiki/Logika" name="0.1_Logika" target="_blank">Logika</a></span>
+<hr>
+<center>
+<a href="/wiki/Arytmetyka" name="0.1_Arytmetyka" target="_blank">Arytmetyka</a>
+· <a href="/wiki/Geometria" title="Geometria" target="_blank">Geometria</a>
+<br>
+
+<a href="/wiki/Liczby" title="Liczby" target="_blank">Liczby</a>
+. <a href="/wiki/Dodawanie" name="0.1_Dodawanie" target="_blank">Dodawanie</a>
+</center>
+</td></tr></table>
+</td>
+</tr>
+
+<tr>
+<td width="50%" style="background:#f1faff;border:2px solid #c6e4f2">
+<table><tr><td>
+
+<img alt="" src="/static/technology.png" width="60" border="0">
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Technologia" target="_blank">Technologia</a></span>
+
+<hr>
+<center>
+<a href="/wiki/Komputer" title="Komputer" target="_blank">Komputer</a>
+· <a href="/wiki/Elektronika" title="Elektronika" target="_blank">Elektronika</a>
+· <a href="/wiki/Internet" title="Internet" target="_blank">Internet</a>
+
+<br>
+<a href="/wiki/Radio" title="Radio" target="_blank">Radio</a>
+· <a href="/wiki/Telekomunikacja" title="Telekomunikacja" target="_blank">Telekomunikacja</a>
+
+<br>
+<a href="/wiki/Telewizja" title="Telewizja" target="_blank">Telewizja</a>
+. <a href="/wiki/Samochód" title="Samochód" target="_blank">Samochód</a>
+· <a href="/wiki/Statek" title="Statek" target="_blank">Statek</a>
+· <a href="/wiki/Pociąg" title="Pociąg" target="_blank">Pociąg</a>
+<br>
+<a href="/wiki/Paliwo" title="Paliwo" target="_blank">Paliwo</a>
+· <a href="/wiki/Elektryczność" title="Elektryczność" target="_blank">Elektryczność</a>
+
+· <a href="/wiki/Inżynieria" title="Inżynieria" target="_blank">Inżynieria</a>
+
+</center>
+</td></tr></table>
+</td>
+
+<td style="background:#f1faff;border:2px solid #c6e4f2">
+<table><tr><td>
+<img alt="" src="/static/earth.png" width="60" border="0">
+</td><td>
+<span style="font-size:100%"><a href="/wiki/Ziemia" title="Ziemia" target="_blank">Ziemia</a> i <a href="/wiki/Geografia" title="Geografia" target="_blank">Geografia</a></span>
+
+<hr>
+<center>
+<a href="/wiki/Kontynent" title="Kontynent" target="_blank">Kontynent</a>
+
+· <a href="/wiki/Geologia" title="Geologia" target="_blank">Geologia</a>
+· <a href="/wiki/Minerały" title="Minerały" target="_blank">Minerały</a>
+· <a href="/wiki/Ocean" title="Ocean" target="_blank">Ocean</a>
+<br>
+<a href="/wiki/Klimat" title="Klimat" target="_blank">Klimat</a>
+
+· <a href="/wiki/Pogoda" title="Pogoda" target="_blank">Pogoda</a>
+<br>
+<a href="/wiki/Ameryka_Północna" title="Ameryka Północna" target="_blank">Ameryka_Północna</a>
+· <a href="/wiki/Ameryka_Południowa" title="Ameryka Południowa" target="_blank">Ameryka Południowa</a>
+<br>
+<a href="/wiki/Afryka" title="Afryka" target="_blank">Afryka</a>
+· <a href="/wiki/Antarktyda" title="Antarktyda" target="_blank">Antarktyda</a>
+· <a href="/wiki/Azja" title="Azja" target="_blank">Azja</a>
+
+· <a href="/wiki/Europa" title="Europa" target="_blank">Europa</a>
+· <a href="/wiki/Oceania" title="Oceania" target="_blank">Oceania</a>
+</center>
+</td></tr></table>
+</td>
+</tr>
+
+
+</table>
+</center>
+
+
+</body></html>
diff --git a/static/index_qu.html b/static/index_qu.html
new file mode 100644
index 0000000..b4813a9
--- /dev/null
+++ b/static/index_qu.html
@@ -0,0 +1,144 @@
+<html lang="qu" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <title>Wikipedia</title>
+ <meta http-equiv="Content-Type" content= "text/html; charset=us-ascii" />
+</head>
+<body>
+ <table width="100%" style="background:transparent; font-size:100%">
+ <tr>
+ <td width="100%" align="center" valign="center">
+ <p><span style="text-align: center; font-size: 140%;line-height: 1.3"><a href="/wiki/Wikipidiya" title="Wikipidiya">Wikipidiyaman</a> allinmi hamusqaykichik</span><br />
+ <span style="text-align: center;">Kay <a href="/wiki/Qhichwa_simi" title="Qhichwa simi">qhichwa simipi</a> <a href="/wiki/Wikipidiya" title="Wikipidiya">Wikipidiyaqa</a> <a href="/wiki/2003" title="2003">2003</a> watapim tiksipusqa.<br /></span></p>
+ <div style="text-align:center"><b><a href="/wiki/Wikipidiya:Yanapana" title="Wikipidiya:Yanapana">Qampas&#160;llamk'apuysiyta atinkim</a></b></div>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="52%" style="background:#EAF5FB; border:1px solid #e1eaee; font-size:100%; -moz-border-radius-topleft:0px; -moz-border-radius-bottomleft:0px; padding:7px 7px 7px 7px;" valign="top">
+ <table width="100%" cellpadding="0" cellspacing="0" style="background:#F1FAFF;">
+ <tr>
+ <th style="background:#cedff2; border:1px solid #d0d9dd; text-align:center">
+ <div style="font-size:120%">Katiguriyakuna</div>
+ </th>
+ </tr>
+ <tr>
+ <td style="background:#EAF5FB; padding-left:0px; padding-top:2px; padding-bottom:2px;">
+ <table width="100%" style="background:transparent; font-size:8pt" cellspacing="10">
+ <tr>
+ <td valign="top">
+ <b><a href="/wiki/Punku_p%27anqa:_Wi%C3%B1ay_kawsay" title="Punku p'anqa: Wiñay kawsay">Wiñay kawsay</a></b><br /></td>
+ <td valign="top">
+ <b><a href="/wiki/Punku_p%27anqa:_Yachay" title="Punku p'anqa: Yachay">Yachay</a></b><br /></td>
+ <td valign="top">
+ <b><a href="/wiki/Punku_p%27anqa:_Allpa_llamk%27ay" title="Punku p'anqa: Allpa llamk'ay">Allpa llamk'ay</a></b><br /></td>
+ <td valign="top">
+ <b><a href="/wiki/Punku_p%27anqa:_Yachay_tarpuy" title="Punku p'anqa: Yachay tarpuy">Kultura</a></b><br /></td>
+ </tr>
+ <tr>
+ <td valign="top">
+ <b><a href="/wiki/Punku_p%27anqa:_Allpa_saywachi" title="Punku p'anqa: Allpa saywachi">Allpa saywachi</a></b><br /></td>
+ <td valign="top">
+ <b><a href="/wiki/Punku_p%27anqa:_Kawsay_yachay" title="Punku p'anqa: Kawsay yachay">Kawsay yachay</a></b><br /></td>
+ <td valign="top">
+ <b><a href="/wiki/Punku_p%27anqa:_Kurku_kallpanchay" title="Punku p'anqa: Kurku kallpanchay">Kurku kallpanchay</a></b><br /></td>
+ <td valign="top">
+ <b><a href="/wiki/Punku_p%27anqa:_Taki_kapchiy" title="Punku p'anqa: Taki kapchiy">Taki kapchiy</a></b><br /></td>
+ </tr>
+ <tr>
+ <td valign="top">
+ <b><a href="/wiki/Katiguriya:Llup%27ina" title="Katiguriya:Llup'ina">Llup'ina</a></b><br /></td>
+ <td valign="top">
+ <b><a href="/wiki/Punku_p%27anqa:_Hampi_yachay" title="Punku p'anqa: Hampi yachay">Hampi yachay</a></b><br /></td>
+ <td valign="top">
+ <b><a href="/wiki/Punku_p%27anqa:_Pachaykamay" title="Punku p'anqa: Pachaykamay">Pachaykamay</a></b><br /></td>
+ <td valign="top">
+ <b><a href="/wiki/Punku_p%27anqa:_Kapchiy" title="Punku p'anqa: Kapchiy">Kapchiy</a></b><br /></td>
+ </tr>
+ <tr>
+ <td valign="top">
+ <b><a href="/wiki/Punku_p%27anqa:_I%C3%B1iy" title="Punku p'anqa: Iñiy">Iñiy</a></b><br /></td>
+ <td valign="top">
+ <b><a href="/wiki/Punku_p%27anqa:_Simi_kapchiy" title="Punku p'anqa: Simi kapchiy">Simi kapchiy</a></b><br /></td>
+ <td valign="top">
+ <b><a href="/wiki/Punku_p%27anqa:_Kawpay" title="Punku p'anqa: Kawpay">Kawpay</a></b><br /></td>
+ <td valign="top">
+ <b><a href="/wiki/Punku_p%27anqa:_Yupay_yachay" title="Punku p'anqa: Yupay yachay">Yupana</a></b><br /></td>
+ </tr>
+ <tr>
+ <td valign="top">
+ <b><a href="/wiki/Katiguriya:Llamk%27ana" title="Katiguriya:Llamk'ana">Llamk'ana</a></b><br /></td>
+ <td valign="top">
+ <b><a href="/wiki/Punku_p%27anqa:_Quyllur_yachay" title="Punku p'anqa: Quyllur yachay">Quyllur yachay</a></b><br /></td>
+ <td valign="top">
+ <b><a href="/wiki/Katiguriya:Kuyu_walltay" title="Katiguriya:Kuyu walltay">Kuyu walltay</a></b><br /></td>
+ <td valign="top">
+ <b><a href="/wiki/Punku_p%27anqa:_Rimay" title="Punku p'anqa: Rimay">Rimay</a></b><br /></td>
+ </tr>
+ <tr>
+ <td valign="top">
+ <b><a href="/wiki/Punku_p%27anqa:_Yachachiy" title="Punku p'anqa: Yachachiy">Yachachiy</a></b><br /></td>
+ <td valign="top">
+ <b><a href="/wiki/Punku_p%27anqa:_Chaqllisinchi" title="Punku p'anqa: Chaqllisinchi">Chaqllisinchi</a></b><br /></td>
+ <td valign="top">
+ <b><a href="/wiki/Nuna_yachay" title="Nuna yachay">Nuna yachay</a></b><br /></td>
+ <td valign="top">
+ <b><a href="/wiki/Katiguriya:Musiku" title="Katiguriya:Musiku">Musiku</a></b><br /></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ <table width="100%" cellpadding="0" cellspacing="0" style="background:#F1FAFF;">
+ <tr>
+ <th style="background:#cedff2; border:1px solid #d0d9dd; text-align:center">
+ <div style="font-size:120%">Punku p'anqakuna</div>
+ </th>
+ </tr>
+ <tr>
+ <td style="background:#EAF5FB; padding-left:0px; padding-top:10px; padding-bottom:10px; padding-right:0px;">
+ <table width="100%" style="background:transparent; font-size:8pt" cellspacing="10">
+ <tr>
+ <td valign="top">
+ <a href="/wiki/Punku_p%27anqa:_Arhintina" title="Punku p'anqa: Arhintina">Arhintina</a><br /></td>
+ <td valign="top">
+ <a href="/wiki/Punku_p%27anqa:_Buliwya" title="Punku p'anqa: Buliwya">Buliwya</a><br /></td>
+ <td valign="top">
+ <a href="/w/index.php?title=Punku_p%27anqa:_Brasil&amp;action=edit&amp;redlink=1" class="new" title="Punku p'anqa: Brasil (manaraqmi p'anqachu)">Brasil</a><br /></td>
+ <td valign="top">
+ <a href="/wiki/Punku_p%27anqa:_Chili" title="Punku p'anqa: Chili">Chili</a><br /></td>
+ </tr>
+ <tr>
+ <td valign="top">
+ <a href="/wiki/Punku_p%27anqa:_Ikwadur" title="Punku p'anqa: Ikwadur">Ikwadur</a><br /></td>
+ <td valign="top">
+ <a href="/wiki/Punku_p%27anqa:Kulumbya" title="Punku p'anqa:Kulumbya">Kulumbya</a><br /></td>
+ <td valign="top">
+ <a href="/wiki/Punku_p%27anqa:_Mishiku" title="Punku p'anqa: Mishiku">Mishiku</a><br /></td>
+ <td valign="top">
+ <a href="/wiki/Punku_p%27anqa:_Piruw" title="Punku p'anqa: Piruw">Piruw</a><br /></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </tr>
+ </table>
+
+ <div id="footer">
+ <ul id="footer-info">
+ <li id="footer-info-lastmod"> Kay p'anqaqa 19:13, 31 dis 2011 qhipaq kutitam hukchasqa karqan.</li>
+ <li id="footer-info-copyright">Kay qillqataqa <a href="//creativecommons.org/licenses/by-sa/3.0/">Creative Commons Attribution/Share-Alike License</a> nisqapi ch'uyanchasqa saqillaykamam chaskinki;
+ yapasqa phatakunachá kanqaku.
+ </ul>
+ </div>
+ </body>
+</html>
diff --git a/static/index_rw.html b/static/index_rw.html
new file mode 100644
index 0000000..d408321
--- /dev/null
+++ b/static/index_rw.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html dir="ltr" class="client-js" xmlns="http://www.w3.org/1999/xhtml" lang="rw"><head>
+<title>Wikipedia</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<meta name="generator" content="MediaWiki 1.18wmf1">
+<link rel="apple-touch-icon" href="http://rw.wikipedia.org/apple-touch-icon.png">
+<link rel="shortcut icon" href="http://rw.wikipedia.org/favicon.ico">
+<link rel="search" type="application/opensearchdescription+xml" href="http://rw.wikipedia.org/w/opensearch_desc.php" title="Wikipedia (rw)">
+<link rel="EditURI" type="application/rsd+xml" href="http://rw.wikipedia.org/w/api.php?action=rsd">
+<link rel="copyright" href="http://creativecommons.org/licenses/by-sa/3.0/">
+<link rel="alternate" type="application/atom+xml" title="Wikipedia Atom feed" href="http://rw.wikipedia.org/w/index.php?title=Special:RecentChanges&amp;feed=atom">
+
+<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-Main_Page action-view skin-vector">
+
+<table style="font-size: 90%; text-align: center; margin-top: 8px;" width="100%" cellspacing="0" align="center">
+<tbody><tr valign="top">
+<td width="100%" bgcolor="#EAF5FF">
+<table id="EnWpMpBook2" style="width: 100%; border-width: 1px 1px 0pt; border-style: solid solid none; border-color: rgb(209, 208, 245) rgb(209, 208, 245) -moz-use-text-color; -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; -moz-border-image: none; background-repeat: no-repeat; background-position: 0% 20%; background-color: rgb(255, 255, 255);">
+<tbody><tr>
+<td style="width: 30%;">
+<div id="accueil_titre">
+<center><big><big><big><font color="green"><b>Murakaza neza ku rubuga ruhariwe Wikipediya mu Kinyarwanda</b></font></big></big></big><br>
+<p><big><font color="grey"><i>Niba muvuga ikinyarwanda, iyi Nkoranya nzimbuzi nibe iyanyu</i></font></big><br></p>
+</center>
+</div>
+<table style="margin-top: 0.6em;" width="100%" cellpadding="0" cellspacing="0">
+<tbody>
+<tr>
+<td valign="top">
+<div class="cadregris" style="margin-bottom:0.6em;border:1px solid #AAAAAA;background-color:#FCFCFC;padding:7px;vertical-align:top">
+<h2 class="headergris"><span class="mw-headline" id="Urubuga_rw.27amasite_ashingiye_ku_byiciro">Urubuga rw'amasite ashingiye ku byiciro</span></h2>
+<div class="accueil_contenu">
+<table style="background: none repeat scroll 0% 0% transparent;" width="100%" border="0" cellpadding="5" cellspacing="0">
+<tbody>
+<td style="padding: 4px; font-size: 1px;">&nbsp;</td>
+<td valign="top" width="100%">
+<div class="cadregris" style="margin-bottom:0.6em;border:1px solid #AAAAAA;background-color:#FCFCFC;padding:7px;vertical-align:top">
+<h3 class="headergris"><span class="mw-headline" id="Amakuru_arambuye_kuri...">Amakuru arambuye kuri...</span></h3>
+<div class="accueil_contenu">
+<ul>
+<li><a href="/wiki/Rwanda" title="Rwanda">Rwanda</a> · <a href="/wiki/Imirenge_y%E2%80%99u_Rwanda" title="Imirenge y’u Rwanda">Imirenge y’u Rwanda</a> · <a href="/wiki/Burundi" title="Burundi" class="mw-redirect">Burundi</a> · <a href="/wiki/Nijeriya" title="Nijeriya">Nijeriya</a>
+<li><a href="/wiki/Leta_Zunze_Ubumwe_z%E2%80%99Amerika" title="Leta Zunze Ubumwe z’Amerika">Leta Zunze Ubumwe z’Amerika</a> ·
+<a href="/wiki/Kanada" title="Kanada">Kanada</a></li>
+
+<li><a href="/wiki/Pariki_ya_Nyungwe" title="Pariki ya Nyungwe">Pariki ya Nyungwe</a> · <a href="/wiki/Pariki_y%E2%80%99_Igihugu_y%E2%80%99_Ibirunga" title="Pariki y’ Igihugu y’ Ibirunga" class="mw-redirect">Pariki y’ Igihugu y’ Ibirunga</a></li>
+<li><a href="/wiki/Ikiyaga_cya_Kivu" title="Ikiyaga cya Kivu">Ikiyaga cya Kivu</a></li>
+<li><a href="/wiki/Inyamaswa" title="Inyamaswa">Inyamaswa</a> · <a href="/wiki/Ingagi_zo_mu_birunga" title="Ingagi zo mu birunga">Ingagi zo mu birunga</a> · <a href="/wiki/Uruyuki" title="Uruyuki">Uruyuki</a></li>
+<li><a href="/wiki/Ubuzima" title="Ubuzima">Ubuzima</a> · <a href="/wiki/Ikawa" title="Ikawa">Ikawa</a> · <a href="/wiki/Makadamiya" title="Makadamiya">Makadamiya</a> · <a href="/wiki/Lotusi_y%E2%80%99ubuhinde" title="Lotusi y’ubuhinde">Lotusi y’ubuhinde</a></li>
+<li><a href="/wiki/Ikinyarwanda" title="Ikinyarwanda">Ikinyarwanda</a> · <a href="/wiki/Ikirundi" title="Ikirundi">Ikirundi</a></li>
+<li><a href="/wiki/Inkoranyamagambo_y%27Igiholandi_n%27Ikinyarwanda_yakozwe_na_Emmanuel_Habumuremyi" title="Inkoranyamagambo y'Igiholandi n'Ikinyarwanda yakozwe na Emmanuel Habumuremyi" class="mw-redirect">Inkoranyamagambo y'Igiholandi n'Ikinyarwanda yakozwe na Emmanuel Habumuremyi</a></li>
+<li><a href="/wiki/Indimi_mu_kinyarwanda" title="Indimi mu kinyarwanda" class="mw-redirect">Indimi mu kinyarwanda</a></li>
+<li><a href="/wiki/Imigani_migufi_y%E2%80%99Ikinyarwanda" title="Imigani migufi y’Ikinyarwanda">Imigani migufi y’Ikinyarwanda</a></li>
+<li> · <a href="/wiki/Abatutsi" title="Abatutsi">Abatutsi</a> · <a href="/wiki/Abatwa" title="Abatwa">Abatwa</a></li>
+<li><a href="/wiki/Interahamwe" title="Interahamwe">Interahamwe</a> · </li>
+<li><a href="/wiki/Kanseri" title="Kanseri">Kanseri</a> · </li>
+<li><a href="/wiki/Ubukirisitu" title="Ubukirisitu">Ubukirisitu</a> · <a href="/wiki/Bibiliya" title="Bibiliya">Bibiliya</a> · <a href="/wiki/Yesu_Kristo" title="Yesu Kristo" class="mw-redirect">Yesu Kristo</a> · <a href="/wiki/Adamu" title="Adamu">Adamu</a> · <a href="/wiki/Category:Abagatifu" title="Category:Abagatifu">Abagatifu</a> · <a href="/wiki/Igisibo" title="Igisibo">Igisibo</a> · <a href="/wiki/Gusiramura" title="Gusiramura">Gusiramura</a></li>
+</ul>
+</div>
+</div>
+</td>
+</tr>
+</tbody></table>
+</tbody></table>
+<p><br></p>
+</div>
+</div>
+</td>
+</tr>
+</tbody></table>
+</td>
+</tr>
+</tbody></table>
+
+
+ <div id="footer">
+ <ul id="footer-info">
+ <li id="footer-info-lastmod"> This page was last modified on 5 March 2011, at 18:25.</li>
+ <li id="footer-info-copyright">Text is available under the <a href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons Attribution/Share-Alike License</a>;
+additional terms may apply.</li>
+ <li id="footer-places-about"><a href="/wiki/Wikipedia:About" title="Wikipedia:About">About Wikipedia</a></li>
+ </ul>
+ </div>
+
+<div class="suggestions" style="top: 74px; width: 204px; display: none; left: auto; right: 29px;"><div class="suggestions-results"></div><div class="suggestions-special"></div></div></body></html>
diff --git a/static/link_icon.gif b/static/link_icon.gif
new file mode 100755
index 0000000..815ccb1
--- /dev/null
+++ b/static/link_icon.gif
Binary files differ
diff --git a/static/lock_icon.gif b/static/lock_icon.gif
new file mode 100755
index 0000000..8a87e28
--- /dev/null
+++ b/static/lock_icon.gif
Binary files differ
diff --git a/static/magnify-clip.png b/static/magnify-clip.png
new file mode 100644
index 0000000..992aa2e
--- /dev/null
+++ b/static/magnify-clip.png
Binary files differ
diff --git a/static/mail_icon.gif b/static/mail_icon.gif
new file mode 100755
index 0000000..50a87a9
--- /dev/null
+++ b/static/mail_icon.gif
Binary files differ
diff --git a/static/math.png b/static/math.png
new file mode 100644
index 0000000..0b81508
--- /dev/null
+++ b/static/math.png
Binary files differ
diff --git a/static/monobook.css b/static/monobook.css
new file mode 100644
index 0000000..91be270
--- /dev/null
+++ b/static/monobook.css
@@ -0,0 +1,1821 @@
+/*
+** MediaWiki 'monobook' style sheet for CSS2-capable browsers.
+** Copyright Gabriel Wicke - http://wikidev.net/
+** License: GPL (http://www.gnu.org/copyleft/gpl.html)
+**
+** Loosely based on http://www.positioniseverything.net/ordered-floats.html by Big John
+** and the Plone 2.0 styles, see http://plone.org/ (Alexander Limi,Joe Geldart & Tom Croucher,
+** Michael Zeltner and Geir Bækholt)
+** All you guys rock :)
+*/
+
+#column-content {
+ width: 100%;
+ float: right;
+ margin: 0 0 .6em -12.2em;
+ padding: 0;
+}
+#content {
+ margin: 2.8em 0 0 12.2em;
+ padding: 0 1em 1em 1em;
+ position: relative;
+ z-index: 2;
+}
+#column-one {
+ padding-top: 160px;
+}
+#content {
+ background: white;
+ color: black;
+ border: 1px solid #aaa;
+ border-right: none;
+ line-height: 1.5em;
+}
+/* the left column width is specified in class .portlet */
+
+/* Font size:
+** We take advantage of keyword scaling- browsers won't go below 9px
+** More at http://www.w3.org/2003/07/30-font-size
+** http://style.cleverchimp.com/font_size_intervals/altintervals.html
+*/
+
+/*FIXME: This body section has been hacked to look right with mwlib.
+A better solution is to fix mwlib to use the rest of the styles
+in this stylesheet*/
+body {
+ font: small sans-serif;
+ background: #ffffff 0 0 no-repeat;
+ color: black;
+ margin: 1em;
+ padding: 0;
+}
+
+/* scale back up to a sane default */
+#globalWrapper {
+ font-size: 127%;
+ width: 100%;
+ margin: 0;
+ padding: 0;
+}
+.visualClear {
+ clear: both;
+}
+
+/* general styles */
+
+table {
+ font-size: 100%;
+ color: black;
+ /* we don't want the bottom borders of <h2>s to be visible through
+ floated tables */
+ background-color: white;
+}
+fieldset table {
+ /* but keep table layouts in forms clean... */
+ background: none;
+}
+a {
+ text-decoration: none;
+ color: #002bb8;
+ background: none;
+}
+a:visited {
+ color: #5a3696;
+}
+a:active {
+ color: #faa700;
+}
+a:hover {
+ text-decoration: underline;
+}
+a.offsite {
+ color: green;
+}
+a.stub {
+ color: #772233;
+}
+a.new, #p-personal a.new {
+ color: #ba0000;
+}
+a.new:visited, #p-personal a.new:visited {
+ color: #a55858;
+}
+
+img {
+ border: none;
+ vertical-align: middle;
+}
+p {
+ margin: .4em 0 .5em 0;
+ line-height: 1.5em;
+}
+p img {
+ margin: 0;
+}
+
+hr {
+ height: 1px;
+ color: #aaa;
+ background-color: #aaa;
+ border: 0;
+ margin: .2em 0 .2em 0;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: black;
+ background: none;
+ font-weight: normal;
+ margin: 0;
+ padding-top: .5em;
+ padding-bottom: .17em;
+ border-bottom: 1px solid #aaa;
+}
+h1 { font-size: 188%; }
+h1 .editsection { font-size: 53%; }
+h2 { font-size: 150%; }
+h2 .editsection { font-size: 67%; }
+h3, h4, h5, h6 {
+ border-bottom: none;
+ font-weight: bold;
+}
+h3 { font-size: 132%; }
+h3 .editsection { font-size: 76%; font-weight: normal; }
+h4 { font-size: 116%; }
+h4 .editsection { font-size: 86%; font-weight: normal; }
+h5 { font-size: 100%; }
+h5 .editsection { font-weight: normal; }
+h6 { font-size: 80%; }
+h6 .editsection { font-size: 125%; font-weight: normal; }
+
+ul {
+ line-height: 1.5em;
+ list-style-type: square;
+ margin: .3em 0 0 1.5em;
+ padding: 0;
+ list-style-image: url(bullet.gif);
+}
+ol {
+ line-height: 1.5em;
+ margin: .3em 0 0 3.2em;
+ padding: 0;
+ list-style-image: none;
+}
+li {
+ margin-bottom: .1em;
+}
+dt {
+ font-weight: bold;
+ margin-bottom: .1em;
+}
+dl {
+ margin-top: .2em;
+ margin-bottom: .5em;
+}
+dd {
+ line-height: 1.5em;
+ margin-left: 2em;
+ margin-bottom: .1em;
+}
+
+fieldset {
+ border: 1px solid #2f6fab;
+ margin: 1em 0 1em 0;
+ padding: 0 1em 1em;
+ line-height: 1.5em;
+}
+fieldset.nested {
+ margin: 0 0 0.5em 0;
+ padding: 0 0.5em 0.5em;
+}
+legend {
+ padding: .5em;
+ font-size: 95%;
+}
+form {
+ border: none;
+ margin: 0;
+}
+
+textarea {
+ width: 100%;
+ padding: .1em;
+}
+
+input.historysubmit {
+ padding: 0 .3em .3em .3em !important;
+ font-size: 94%;
+ cursor: pointer;
+ height: 1.7em !important;
+ margin-left: 1.6em;
+}
+select {
+ vertical-align: top;
+}
+abbr, acronym, .explain {
+ border-bottom: 1px dotted black;
+ color: black;
+ background: none;
+ cursor: help;
+}
+q {
+ font-family: Times, "Times New Roman", serif;
+ font-style: italic;
+}
+/* disabled for now
+blockquote {
+ font-family: Times, "Times New Roman", serif;
+ font-style: italic;
+}*/
+code {
+ background-color: #f9f9f9;
+}
+pre {
+ padding: 1em;
+ border: 1px dashed #2f6fab;
+ color: black;
+ background-color: #f9f9f9;
+ line-height: 1.1em;
+}
+
+/*
+** the main content area
+*/
+
+#siteSub {
+ display: none;
+}
+#jump-to-nav {
+ display: none;
+}
+
+#contentSub, #contentSub2 {
+ font-size: 84%;
+ line-height: 1.2em;
+ margin: 0 0 1.4em 1em;
+ color: #7d7d7d;
+ width: auto;
+}
+span.subpages {
+ display: block;
+}
+
+/* Some space under the headers in the content area */
+#bodyContent h1, #bodyContent h2 {
+ margin-bottom: .6em;
+}
+#bodyContent h3, #bodyContent h4, #bodyContent h5 {
+ margin-bottom: .3em;
+}
+.firstHeading {
+ margin-bottom: .1em;
+ /* These two rules hack around bug 2013 (fix for more limited bug 11325).
+ When bug 2013 is fixed properly, they should be removed. */
+ line-height: 1.2em;
+ padding-bottom: 0;
+}
+
+/* user notification thing */
+.usermessage {
+ background-color: #ffce7b;
+ border: 1px solid #ffa500;
+ color: black;
+ font-weight: bold;
+ margin: 2em 0 1em;
+ padding: .5em 1em;
+ vertical-align: middle;
+}
+#siteNotice {
+ text-align: center;
+ font-size: 95%;
+ padding: 0 .9em;
+}
+#siteNotice p {
+ margin: 0;
+ padding: 0;
+}
+.success {
+ color: green;
+ font-size: larger;
+}
+.error {
+ color: red;
+ font-size: larger;
+}
+.errorbox, .successbox {
+ font-size: larger;
+ border: 2px solid;
+ padding: .5em 1em;
+ float: left;
+ margin-bottom: 2em;
+ color: #000;
+}
+.errorbox {
+ border-color: red;
+ background-color: #fff2f2;
+}
+.successbox {
+ border-color: green;
+ background-color: #dfd;
+}
+.errorbox h2, .successbox h2 {
+ font-size: 1em;
+ font-weight: bold;
+ display: inline;
+ margin: 0 .5em 0 0;
+ border: none;
+}
+
+.catlinks {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ margin-top: 1em;
+ clear: both;
+}
+/* currently unused, intended to be used by a metadata box
+in the bottom-right corner of the content area */
+.documentDescription {
+ /* The summary text describing the document */
+ font-weight: bold;
+ display: block;
+ margin: 1em 0;
+ line-height: 1.5em;
+}
+.documentByLine {
+ text-align: right;
+ font-size: 90%;
+ clear: both;
+ font-weight: normal;
+ color: #76797c;
+}
+
+/* emulate center */
+.center {
+ width: 100%;
+ text-align: center;
+}
+*.center * {
+ margin-left: auto;
+ margin-right: auto;
+}
+/* small for tables and similar */
+.small, .small * {
+ font-size: 94%;
+}
+table.small {
+ font-size: 100%;
+}
+
+/*
+** content styles
+*/
+
+#toc,
+.toc,
+.mw-warning {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ font-size: 95%;
+}
+#toc h2,
+.toc h2 {
+ display: inline;
+ border: none;
+ padding: 0;
+ font-size: 100%;
+ font-weight: bold;
+}
+#toc #toctitle,
+.toc #toctitle,
+#toc .toctitle,
+.toc .toctitle {
+ text-align: center;
+}
+#toc ul,
+.toc ul {
+ list-style-type: none;
+ list-style-image: none;
+ margin-left: 0;
+ padding-left: 0;
+ text-align: left;
+}
+#toc ul ul,
+.toc ul ul {
+ margin: 0 0 0 2em;
+}
+#toc .toctoggle,
+.toc .toctoggle {
+ font-size: 94%;
+}
+
+.mw-warning {
+ margin-left: 50px;
+ margin-right: 50px;
+ text-align: center;
+}
+
+/* images */
+div.floatright, table.floatright {
+ clear: right;
+ float: right;
+ position: relative;
+ margin: 0 0 .5em .5em;
+ border: 0;
+/*
+ border: .5em solid white;
+ border-width: .5em 0 .8em 1.4em;
+*/
+}
+div.floatright p { font-style: italic; }
+div.floatleft, table.floatleft {
+ float: left;
+ clear: left;
+ position: relative;
+ margin: 0 .5em .5em 0;
+ border: 0;
+/*
+ margin: .3em .5em .5em 0;
+ border: .5em solid white;
+ border-width: .5em 1.4em .8em 0;
+*/
+}
+div.floatleft p { font-style: italic; }
+/* thumbnails */
+div.thumb {
+ margin-bottom: .5em;
+ border-style: solid;
+ border-color: white;
+ width: auto;
+}
+div.thumbinner {
+ border: 1px solid #ccc;
+ padding: 3px !important;
+ background-color: #f9f9f9;
+ font-size: 94%;
+ text-align: center;
+ overflow: hidden;
+}
+html .thumbimage {
+ border: 1px solid #ccc;
+}
+html .thumbcaption {
+ border: none;
+ text-align: left;
+ line-height: 1.4em;
+ padding: 3px !important;
+ font-size: 94%;
+}
+div.magnify {
+ float: right;
+ border: none !important;
+ background: none !important;
+}
+div.magnify a, div.magnify img {
+ display: block;
+ border: none !important;
+ background: none !important;
+}
+div.tright {
+ clear: right;
+ float: right;
+ border-width: .5em 0 .8em 1.4em;
+}
+div.tleft {
+ float: left;
+ clear: left;
+ margin-right: .5em;
+ border-width: .5em 1.4em .8em 0;
+}
+img.thumbborder {
+ border: 1px solid #dddddd;
+}
+.hiddenStructure {
+ display: none;
+}
+
+/*
+** classes for special content elements like town boxes
+** intended to be referenced directly from the wiki src
+*/
+
+/*
+** User styles
+*/
+/* table standards */
+table.rimage {
+ float: right;
+ position: relative;
+ margin-left: 1em;
+ margin-bottom: 1em;
+ text-align: center;
+}
+.toccolours {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ font-size: 95%;
+}
+div.townBox {
+ position: relative;
+ float: right;
+ background: white;
+ margin-left: 1em;
+ border: 1px solid gray;
+ padding: .3em;
+ width: 200px;
+ overflow: hidden;
+ clear: right;
+}
+div.townBox dl {
+ padding: 0;
+ margin: 0 0 .3em;
+ font-size: 96%;
+}
+div.townBox dl dt {
+ background: none;
+ margin: .4em 0 0;
+}
+div.townBox dl dd {
+ margin: .1em 0 0 1.1em;
+ background-color: #f3f3f3;
+}
+
+/*
+** edit views etc
+*/
+.special li {
+ line-height: 1.4em;
+ margin: 0;
+ padding: 0;
+}
+
+/*
+** keep the whitespace in front of the ^=, hides rule from konqueror
+** this is css3, the validator doesn't like it when validating as css2
+*/
+#bodyContent a.external,
+#bodyContent a[href ^="gopher://"] {
+ background: url(external.png) center right no-repeat;
+ padding-right: 13px;
+}
+#bodyContent a[href ^="https://"],
+.link-https {
+ background: url(lock_icon.gif) center right no-repeat;
+ padding-right: 16px;
+}
+#bodyContent a[href ^="mailto:"],
+.link-mailto {
+ background: url(mail_icon.gif) center right no-repeat;
+ padding-right: 18px;
+}
+#bodyContent a[href ^="news://"] {
+ background: url(news_icon.png) center right no-repeat;
+ padding-right: 18px;
+}
+#bodyContent a[href ^="ftp://"],
+.link-ftp {
+ background: url(file_icon.gif) center right no-repeat;
+ padding-right: 18px;
+}
+#bodyContent a[href ^="irc://"],
+.link-irc {
+ background: url(discussionitem_icon.gif) center right no-repeat;
+ padding-right: 18px;
+}
+#bodyContent a.external[href $=".ogg"], #bodyContent a.external[href $=".OGG"],
+#bodyContent a.external[href $=".mid"], #bodyContent a.external[href $=".MID"],
+#bodyContent a.external[href $=".midi"], #bodyContent a.external[href $=".MIDI"],
+#bodyContent a.external[href $=".mp3"], #bodyContent a.external[href $=".MP3"],
+#bodyContent a.external[href $=".wav"], #bodyContent a.external[href $=".WAV"],
+#bodyContent a.external[href $=".wma"], #bodyContent a.external[href $=".WMA"],
+.link-audio {
+ background: url("audio.png") center right no-repeat;
+ padding-right: 13px;
+}
+#bodyContent a.external[href $=".ogm"], #bodyContent a.external[href $=".OGM"],
+#bodyContent a.external[href $=".avi"], #bodyContent a.external[href $=".AVI"],
+#bodyContent a.external[href $=".mpeg"], #bodyContent a.external[href $=".MPEG"],
+#bodyContent a.external[href $=".mpg"], #bodyContent a.external[href $=".MPG"],
+.link-video {
+ background: url("video.png") center right no-repeat;
+ padding-right: 13px;
+}
+#bodyContent a.external[href $=".pdf"], #bodyContent a.external[href $=".PDF"],
+#bodyContent a.external[href *=".pdf#"], #bodyContent a.external[href *=".PDF#"],
+#bodyContent a.external[href *=".pdf?"], #bodyContent a.external[href *=".PDF?"],
+.link-document {
+ background: url("document.png") center right no-repeat;
+ padding-right: 12px;
+}
+
+/* disable interwiki styling */
+#bodyContent a.extiw,
+#bodyContent a.extiw:active {
+ color: #36b;
+ background: none;
+ padding: 0;
+}
+#bodyContent a.external {
+ color: #36b;
+}
+/* this can be used in the content area to switch off
+special external link styling */
+#bodyContent .plainlinks a {
+ background: none !important;
+ padding: 0 !important;
+}
+/*
+** Structural Elements
+*/
+
+/*
+** general portlet styles (elements in the quickbar)
+*/
+.portlet {
+ border: none;
+ margin: 0 0 .5em;
+ padding: 0;
+ float: none;
+ width: 11.6em;
+ overflow: hidden;
+}
+.portlet h4 {
+ font-size: 95%;
+ font-weight: normal;
+ white-space: nowrap;
+}
+.portlet h5 {
+ background: transparent;
+ padding: 0 1em 0 .5em;
+ display: inline;
+ height: 1em;
+ text-transform: lowercase;
+ font-size: 91%;
+ font-weight: normal;
+ white-space: nowrap;
+}
+.portlet h6 {
+ background: #ffae2e;
+ border: 1px solid #2f6fab;
+ border-style: solid solid none solid;
+ padding: 0 1em 0 1em;
+ text-transform: lowercase;
+ display: block;
+ font-size: 1em;
+ height: 1.2em;
+ font-weight: normal;
+ white-space: nowrap;
+}
+.pBody {
+ font-size: 95%;
+ background-color: white;
+ color: black;
+ border-collapse: collapse;
+ border: 1px solid #aaa;
+ padding: 0 .8em .3em .5em;
+}
+.portlet h1,
+.portlet h2,
+.portlet h3,
+.portlet h4 {
+ margin: 0;
+ padding: 0;
+}
+.portlet ul {
+ line-height: 1.5em;
+ list-style-type: square;
+ list-style-image: url(bullet.gif);
+ font-size: 95%;
+}
+.portlet li {
+ padding: 0;
+ margin: 0;
+}
+
+/*
+** Logo properties
+*/
+
+#p-logo {
+ top: 0;
+ left: 0;
+ position: absolute; /*needed to use z-index */
+ z-index: 3;
+ height: 155px;
+ width: 12em;
+ overflow: visible;
+}
+#p-logo h5 {
+ display: none;
+}
+#p-logo a,
+#p-logo a:hover {
+ display: block;
+ height: 155px;
+ width: 12.2em;
+ background-repeat: no-repeat;
+ background-position: 35% 50% !important;
+ text-decoration: none;
+}
+
+/*
+** Search portlet
+*/
+#p-search {
+ position: relative;
+ z-index: 3;
+}
+input.searchButton {
+ margin-top: 1px;
+ font-size: 95%;
+}
+#searchGoButton {
+ padding-left: .5em;
+ padding-right: .5em;
+ font-weight: bold;
+}
+#searchInput {
+ width: 10.9em;
+ margin: 0;
+ font-size: 95%;
+}
+#p-search .pBody {
+ padding: .5em .4em .4em .4em;
+ text-align: center;
+}
+
+/*
+** the personal toolbar
+*/
+#p-personal {
+ position: absolute;
+ left: 0;
+ top: 0;
+ z-index: 0;
+}
+#p-personal {
+ width: 100%;
+ white-space: nowrap;
+ padding: 0;
+ margin: 0;
+ border: none;
+ background: none;
+ overflow: visible;
+ line-height: 1.2em;
+}
+#p-personal h5 {
+ display: none;
+}
+#p-personal .portlet,
+#p-personal .pBody {
+ z-index: 0;
+ padding: 0;
+ margin: 0;
+ border: none;
+ overflow: visible;
+ background: none;
+}
+/* this is the ul contained in the portlet */
+#p-personal ul {
+ border: none;
+ line-height: 1.4em;
+ color: #2f6fab;
+ padding: 0 2em 0 3em;
+ margin: 0;
+ text-align: right;
+ list-style: none;
+ z-index: 0;
+ background: none;
+ cursor: default;
+}
+#p-personal li {
+ z-index: 0;
+ border: none;
+ padding: 0;
+ display: inline;
+ color: #2f6fab;
+ margin-left: 1em;
+ line-height: 1.2em;
+ background: none;
+}
+#p-personal li a {
+ text-decoration: none;
+ color: #005896;
+ padding-bottom: .2em;
+ background: none;
+}
+#p-personal li a:hover {
+ background-color: white;
+ padding-bottom: .2em;
+ text-decoration: none;
+}
+#p-personal li.active a:hover {
+ background-color: transparent;
+}
+/* the icon in front of the user name, single quotes
+in bg url to hide it from iemac */
+li#pt-userpage,
+li#pt-anonuserpage,
+li#pt-login {
+ background: url(user.gif) top left no-repeat;
+ padding-left: 20px;
+ text-transform: none;
+}
+#p-personal ul {
+ text-transform: lowercase;
+}
+#p-personal li.active {
+ font-weight: bold;
+}
+/*
+** the page-related actions- page/talk, edit etc
+*/
+#p-cactions {
+ position: absolute;
+ top: 1.3em;
+ left: 11.5em;
+ margin: 0;
+ white-space: nowrap;
+ width: 76%;
+ line-height: 1.1em;
+ overflow: visible;
+ background: none;
+ border-collapse: collapse;
+ padding-left: 1em;
+ list-style: none;
+ font-size: 95%;
+}
+#p-cactions ul {
+ list-style: none;
+}
+#p-cactions li {
+ display: inline;
+ border: 1px solid #aaa;
+ border-bottom: none;
+ padding: 0 0 .1em 0;
+ margin: 0 .3em 0 0;
+ overflow: visible;
+ background: white;
+}
+#p-cactions li.selected {
+ border-color: #fabd23;
+ padding: 0 0 .2em 0;
+ font-weight: bold;
+}
+#p-cactions li a {
+ background-color: #fbfbfb;
+ color: #002bb8;
+ border: none;
+ padding: 0 .8em .3em;
+ position: relative;
+ z-index: 0;
+ margin: 0;
+ text-decoration: none;
+}
+#p-cactions li.selected a {
+ z-index: 3;
+ padding: 0 1em .2em!important;
+ background-color: white;
+}
+#p-cactions .new a {
+ color: #ba0000;
+}
+#p-cactions li a:hover {
+ z-index: 3;
+ text-decoration: none;
+ background-color: white;
+}
+#p-cactions h5 {
+ display: none;
+}
+#p-cactions li.istalk {
+ margin-right: 0;
+}
+#p-cactions li.istalk a {
+ padding-right: .5em;
+}
+#p-cactions #ca-addsection a {
+ padding-left: .4em;
+ padding-right: .4em;
+}
+/* offsets to distinguish the tab groups */
+li#ca-talk {
+ margin-right: 1.6em;
+}
+li#ca-watch, li#ca-unwatch, li#ca-varlang-0, li#ca-print {
+ margin-left: 1.6em;
+}
+#p-cactions .pBody {
+ font-size: 1em;
+ background-color: transparent;
+ color: inherit;
+ border-collapse: inherit;
+ border: 0;
+ padding: 0;
+}
+#p-cactions .hiddenStructure {
+ display: none;
+}
+#p-cactions li a {
+ text-transform: lowercase;
+}
+
+/*
+** the remaining portlets
+*/
+#p-tbx,
+#p-lang {
+ position: relative;
+ z-index: 3;
+}
+
+/* TODO: #t-iscite is only used by the Cite extension, come up with some
+ * system which allows extensions to add to this file on the fly
+ */
+#t-ispermalink, #t-iscite {
+ color: #999;
+}
+/*
+** footer
+*/
+#footer {
+ background-color: white;
+ border-top: 1px solid #fabd23;
+ border-bottom: 1px solid #fabd23;
+ margin: .6em 0 1em 0;
+ padding: .4em 0 1.2em 0;
+ text-align: center;
+ font-size: 90%;
+}
+#footer li {
+ display: inline;
+ margin: 0 1.3em;
+}
+#f-poweredbyico, #f-copyrightico {
+ margin: 0 8px;
+ position: relative;
+ top: -2px; /* Bump it up just a tad */
+}
+#f-poweredbyico {
+ float: right;
+ height: 1%;
+}
+#f-copyrightico {
+ float: left;
+ height: 1%;
+}
+
+/* js pref toc */
+#preftoc {
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ clear: both;
+}
+#preftoc li {
+ background-color: #f0f0f0;
+ color: #000;
+}
+#preftoc li {
+ margin: 1px -2px 1px 2px;
+ float: left;
+ padding: 2px 0 3px 0;
+ border: 1px solid #fff;
+ border-right-color: #716f64;
+ border-bottom: 0;
+ position: relative;
+ white-space: nowrap;
+ list-style-type: none;
+ list-style-image: none;
+ z-index: 3;
+}
+#preftoc li.selected {
+ font-weight: bold;
+ background-color: #f9f9f9;
+ border: 1px solid #aaa;
+ border-bottom: none;
+ cursor: default;
+ top: 1px;
+ padding-top: 2px;
+ margin-right: -3px;
+}
+#preftoc > li.selected {
+ top: 2px;
+}
+#preftoc a,
+#preftoc a:active {
+ display: block;
+ color: #000;
+ padding: 0 .7em;
+ position: relative;
+ text-decoration: none;
+}
+#preftoc li.selected a {
+ cursor: default;
+ text-decoration: none;
+}
+#prefcontrol {
+ padding-top: 2em;
+ clear: both;
+}
+#preferences {
+ margin: 0;
+ border: 1px solid #aaa;
+ clear: both;
+ padding: 1.5em;
+ background-color: #F9F9F9;
+}
+.prefsection {
+ border: none;
+ padding: 0;
+ margin: 0;
+}
+.prefsection fieldset {
+ border: 1px solid #aaa;
+ float: left;
+ margin-right: 2em;
+}
+.prefsection legend {
+ font-weight: bold;
+}
+.prefsection table, .prefsection legend {
+ background-color: #F9F9F9;
+}
+.mainLegend {
+ display: none;
+}
+div.prefsectiontip {
+ font-size: x-small;
+ padding: .2em 2em;
+ color: #666;
+}
+.btnSavePrefs {
+ font-weight: bold;
+ padding-left: .3em;
+ padding-right: .3em;
+}
+
+.preferences-login {
+ clear: both;
+ margin-bottom: 1.5em;
+}
+
+.prefcache {
+ font-size: 90%;
+ margin-top: 2em;
+}
+
+div#userloginForm form,
+div#userlogin form#userlogin2 {
+ margin: 0 3em 1em 0;
+ border: 1px solid #aaa;
+ clear: both;
+ padding: 1.5em 2em;
+ background-color: #f9f9f9;
+ float: left;
+}
+
+div#userloginForm table,
+div#userlogin form#userlogin2 table {
+ background-color: #f9f9f9;
+}
+
+div#userloginForm h2,
+div#userlogin form#userlogin2 h2 {
+ padding-top: 0;
+}
+
+div#userlogin .captcha,
+div#userloginForm .captcha {
+ border: 1px solid #bbb;
+ padding: 1.5em 2em;
+ background-color: white;
+}
+
+
+#userloginprompt, #languagelinks {
+ font-size: 85%;
+}
+
+#login-sectiontip {
+ font-size: 85%;
+ line-height: 1.2;
+ padding-top: 2em;
+}
+
+#userlogin .loginText, #userlogin .loginPassword {
+ width: 12em;
+}
+
+#userloginlink a, #wpLoginattempt, #wpCreateaccount {
+ font-weight: bold;
+}
+
+/*
+** IE/Mac fixes, hope to find a validating way to move this
+** to a separate stylesheet. This would work but doesn't validate:
+** @import("IEMacFixes.css");
+*/
+/* tabs: border on the a, not the div */
+* > html #p-cactions li { border: none; }
+* > html #p-cactions li a {
+ border: 1px solid #aaa;
+ border-bottom: none;
+}
+* > html #p-cactions li.selected a { border-color: #fabd23; }
+/* footer icons need a fixed width */
+* > html #f-poweredbyico,
+* > html #f-copyrightico { width: 88px; }
+* > html #bodyContent,
+* > html #bodyContent pre {
+ overflow-x: auto;
+ width: 100%;
+ padding-bottom: 25px;
+}
+
+/* more IE fixes */
+/* float/negative margin brokenness */
+* html #footer {margin-top: 0;}
+* html #column-content {
+ display: inline;
+ margin-bottom: 0;
+}
+* html div.editsection { font-size: smaller; }
+#pagehistory li.selected { position: relative; }
+
+/* Mac IE 5.0 fix; floated content turns invisible */
+* > html #column-content {
+ float: none;
+}
+* > html #column-one {
+ position: absolute;
+ left: 0;
+ top: 0;
+}
+* > html #footer {
+ margin-left: 13.2em;
+}
+.redirectText {
+ font-size: 150%;
+ margin: 5px;
+}
+
+.printfooter {
+ display: none;
+}
+
+.not-patrolled {
+ background-color: #ffa;
+}
+div.patrollink {
+ clear: both;
+ font-size: 75%;
+ text-align: right;
+}
+span.newpage, span.minor, span.bot {
+ font-weight: bold;
+}
+span.unpatrolled {
+ font-weight: bold;
+ color: red;
+}
+
+.sharedUploadNotice {
+ font-style: italic;
+}
+
+span.updatedmarker {
+ color: black;
+ background-color: #0f0;
+}
+
+table.gallery {
+ border: 1px solid #ccc;
+ margin: 2px;
+ padding: 2px;
+ background-color: white;
+}
+
+table.gallery tr {
+ vertical-align: top;
+}
+
+table.gallery td {
+ vertical-align: top;
+ background-color: #f9f9f9;
+ border: solid 2px white;
+}
+/* Keep this temporarily so that cached pages will display right */
+table.gallery td.galleryheader {
+ text-align: center;
+ font-weight: bold;
+}
+table.gallery caption {
+ font-weight: bold;
+}
+
+div.gallerybox {
+ margin: 2px;
+}
+
+div.gallerybox div.thumb {
+ text-align: center;
+ border: 1px solid #ccc;
+ margin: 2px;
+}
+
+div.gallerytext {
+ overflow: hidden;
+ font-size: 94%;
+ padding: 2px 4px;
+}
+
+span.comment {
+ font-style: italic;
+}
+
+span.changedby {
+ font-size: 95%;
+}
+
+.previewnote {
+ text-indent: 3em;
+ color: #c00;
+ border-bottom: 1px solid #aaa;
+ padding-bottom: 1em;
+ margin-bottom: 1em;
+}
+
+.previewnote p {
+ margin: 0;
+ padding: 0;
+}
+
+.editExternally {
+ border: 1px solid gray;
+ background-color: #ffffff;
+ padding: 3px;
+ margin-top: 0.5em;
+ float: left;
+ font-size: small;
+ text-align: center;
+}
+.editExternallyHelp {
+ font-style: italic;
+ color: gray;
+}
+
+.toggle {
+ margin-left: 2em;
+ text-indent: -2em;
+}
+
+/* Classes for EXIF data display */
+table.mw_metadata {
+ font-size: 0.8em;
+ margin-left: 0.5em;
+ margin-bottom: 0.5em;
+ width: 300px;
+}
+
+table.mw_metadata caption {
+ font-weight: bold;
+}
+
+table.mw_metadata th {
+ font-weight: normal;
+}
+
+table.mw_metadata td {
+ padding: 0.1em;
+}
+
+table.mw_metadata {
+ border: none;
+ border-collapse: collapse;
+}
+
+table.mw_metadata td, table.mw_metadata th {
+ text-align: center;
+ border: 1px solid #aaaaaa;
+ padding-left: 0.1em;
+ padding-right: 0.1em;
+}
+
+table.mw_metadata th {
+ background-color: #f9f9f9;
+}
+
+table.mw_metadata td {
+ background-color: #fcfcfc;
+}
+
+table.collapsed tr.collapsable {
+ display: none;
+}
+
+
+/* filetoc */
+ul#filetoc {
+ text-align: center;
+ border: 1px solid #aaaaaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ font-size: 95%;
+ margin-bottom: 0.5em;
+ margin-left: 0;
+ margin-right: 0;
+}
+
+#filetoc li {
+ display: inline;
+ list-style-type: none;
+ padding-right: 2em;
+}
+
+input#wpSummary {
+ width: 80%;
+}
+
+/* @bug 1714 */
+input#wpSave, input#wpDiff {
+ margin-right: 0.33em;
+}
+
+#editform .editOptions {
+ display: inline;
+}
+
+#wpSave {
+ font-weight: bold;
+}
+
+/* Classes for article validation */
+
+table.revisionform_default {
+ border: 1px solid #000000;
+}
+
+table.revisionform_focus {
+ border: 1px solid #000000;
+ background-color:#00BBFF;
+}
+
+tr.revision_tr_default {
+ background-color:#EEEEEE;
+}
+
+tr.revision_tr_first {
+ background-color:#DDDDDD;
+}
+
+p.revision_saved {
+ color: green;
+ font-weight:bold;
+}
+
+#mw_trackbacks {
+ border: solid 1px #bbbbff;
+ background-color: #eeeeff;
+ padding: 0.2em;
+}
+
+
+/* Allmessages table */
+
+#allmessagestable th {
+ background-color: #b2b2ff;
+}
+
+#allmessagestable tr.orig {
+ background-color: #ffe2e2;
+}
+
+#allmessagestable tr.new {
+ background-color: #e2ffe2;
+}
+
+#allmessagestable tr.def {
+ background-color: #f0f0ff;
+}
+
+
+/* noarticletext */
+div.noarticletext {
+ border: 1px solid #ccc;
+ background: #fff;
+ padding: .2em 1em;
+ color: #000;
+}
+
+div#searchTargetContainer {
+ left: 10px;
+ top: 10px;
+ width: 90%;
+ background: white;
+}
+
+div#searchTarget {
+ padding: 3px;
+ margin: 5px;
+ background: #F0F0F0;
+ border: solid 1px blue;
+}
+
+div#searchTarget ul li {
+ list-style: none;
+}
+
+div#searchTarget ul li:before {
+ color: orange;
+ content: "\00BB \0020";
+}
+
+div#searchTargetHide {
+ float:right;
+ border:solid 1px black;
+ background:#DCDCDC;
+ padding:2px;
+}
+
+div.multipageimagenavbox {
+ border: solid 1px silver;
+ padding: 4px;
+ margin: 1em;
+ -moz-border-radius: 6px;
+ background: #f0f0f0;
+}
+
+div.multipageimagenavbox div.thumb {
+ border: none;
+ margin-left: 2em;
+ margin-right: 2em;
+}
+
+div.multipageimagenavbox hr {
+ margin: 6px;
+}
+
+table.multipageimage td {
+ text-align: center;
+}
+
+/** Special:Version */
+
+table#sv-ext, table#sv-hooks, table#sv-software {
+ margin: 1em;
+ padding:0em;
+}
+
+#sv-ext td, #sv-hooks td, #sv-software td,
+#sv-ext th, #sv-hooks th, #sv-software th {
+ border: 1px solid #A0A0A0;
+ padding: 0 0.15em 0 0.15em;
+}
+#sv-ext th, #sv-hooks th, #sv-software th {
+ background-color: #F0F0F0;
+ color: black;
+ padding: 0 0.15em 0 0.15em;
+}
+tr.sv-space{
+ height: 0.8em;
+ border:none;
+}
+tr.sv-space td { display: none; }
+
+/*
+ Table pager (e.g. Special:Imagelist)
+ - remove underlines from the navigation link
+ - collapse borders
+ - set the borders to outsets (similar to Special:Allmessages)
+ - remove line wrapping for all td and th, set background color
+ - restore line wrapping for the last two table cells (description and size)
+*/
+.TablePager_nav a { text-decoration: none; }
+.TablePager { border-collapse: collapse; }
+.TablePager, .TablePager td, .TablePager th {
+ border: 1px solid #aaaaaa;
+ padding: 0 0.15em 0 0.15em;
+}
+.TablePager th { background-color: #eeeeff }
+.TablePager td { background-color: #ffffff }
+.TablePager tr:hover td { background-color: #eeeeff }
+
+.imagelist td, .imagelist th { white-space: nowrap }
+.imagelist .TablePager_col_links { background-color: #eeeeff }
+.imagelist .TablePager_col_img_description { white-space: normal }
+.imagelist th.TablePager_sort { background-color: #ccccff }
+
+.templatesUsed { margin-top: 1.5em; }
+
+.mw-summary-preview {
+ margin: 0.1em 0;
+}
+
+/* Friendlier slave lag warnings */
+div.mw-lag-warn-normal,
+div.mw-lag-warn-high {
+ padding: 3px;
+ text-align: center;
+ margin: 3px auto;
+}
+div.mw-lag-warn-normal {
+ border: 1px solid #FFCC66;
+ background-color: #FFFFCC;
+}
+div.mw-lag-warn-high {
+ font-weight: bold;
+ border: 2px solid #FF0033;
+ background-color: #FFCCCC;
+}
+
+/* Recreating-deleted-page/reupload file warning and log entries */
+div#mw-upload-deleted-warn,
+div#mw-recreate-deleted-warn {
+ padding: 3px;
+ margin-bottom: 3px;
+ border: 2px solid #2F6FAB;
+}
+div#mw-upload-deleted-warn ul li,
+div#mw-recreate-deleted-warn ul li {
+ font-size: 90%;
+}
+.MediaTransformError {
+ background-color: #ccc;
+ padding: 0.1em;
+}
+.MediaTransformError td {
+ text-align: center;
+ vertical-align: middle;
+ font-size: 90%;
+}
+
+/** Special:Search stuff */
+div#mw-search-interwiki-caption {
+ text-align: center;
+ font-weight: bold;
+ font-size: 95%;
+}
+
+.mw-search-interwiki-project {
+ font-size: 97%;
+ text-align: left;
+ padding-left: 0.2em;
+ padding-right: 0.15em;
+ padding-bottom: 0.2em;
+ padding-top: 0.15em;
+ background: #cae8ff;
+}
+
+span.searchmatch {
+ font-weight: bold;
+ color: red;
+}
+
+/* God-damned hack for the crappy layout */
+.os-suggest {
+ font-size: 127%;
+}
+/**
+ * CSS in this file is used by *all* skins (that have any CSS at all). Be
+ * careful what you put in here, since what looks good in one skin may not in
+ * another, but don't ignore the poor non-Monobook users either.
+ */
+.mw-plusminus-null { color: #aaa; }
+
+.texvc { direction: ltr; unicode-bidi: embed; }
+img.tex { vertical-align: middle; }
+span.texhtml { font-family: serif; }
+
+/* Stop floats from intruding into edit area in previews */
+#toolbar, #wpTextbox1 { clear: both; }
+
+div#mw-js-message {
+ margin: 1em 5%;
+ padding: 0.5em 2.5%;
+ border: solid 1px #ddd;
+ background-color: #fcfcfc;
+}
+
+/* Edit section links */
+.editsection {
+ float: right;
+ margin-left: 5px;
+}
+
+/**
+ * File histories
+ */
+table.filehistory {
+ border:1px solid #ccc;
+ border-collapse:collapse;
+}
+
+table.filehistory th,
+table.filehistory td {
+ padding: 0 0.2em 0 0.2em;
+ vertical-align:top;
+ border:1px solid #ccc;
+}
+table.filehistory th {
+ text-align: left;
+}
+table.filehistory td.mw-imagepage-filesize,
+table.filehistory th.mw-imagepage-filesize {
+ white-space:nowrap;
+}
+
+/*
+ * rev_deleted stuff
+ */
+li span.deleted, span.history-deleted {
+ text-decoration: line-through;
+ color: #888;
+ font-style: italic;
+}
+
+/**
+ * Forms
+ */
+body.ltr td.mw-label { text-align: right; }
+body.ltr td.mw-input { text-align: left; }
+body.ltr td.mw-submit { text-align: left; }
+body.rtl td.mw-label { text-align: left; }
+body.rtl td.mw-input { text-align: right; }
+body.rtl td.mw-submit { text-align: right; }
+
+td.mw-label { vertical-align: top; }
+td.mw-submit { white-space: nowrap; }
+
+/**
+ * Image captions
+ */
+body.rtl .thumbcaption { text-align:right; }
+body.rtl .magnify { float:left; }
+
+body.ltr .thumbcaption { text-align:left; }
+body.ltr .magnify { float:right; }
+
+/**
+ * Hidden categories
+ */
+.mw-hidden-cats-hidden { display: none; }
+.catlinks-allhidden { display: none; }
+
+/* Convenience links to edit block and delete reasons */
+p.mw-ipb-conveniencelinks, p.mw-filedelete-editreasons, p.mw-delete-editreasons {
+ font-size: 90%;
+ float: right;
+}
+
+/* Search results */
+div.searchresult {
+ font-size: 95%;
+ width:38em;
+}
+.mw-search-results li {
+ padding-bottom: 1em;
+}
+.mw-search-result-data {
+ color: green;
+ font-size: 97%;
+}
+
+div#mw-search-interwiki {
+ float: right;
+ width: 18em;
+ border-style: solid;
+ border-color: #AAAAAA;
+ border-width: 1px;
+ margin-top: 2ex;
+}
+
+div#mw-search-interwiki li {
+ font-size: 95%;
+}
+
+.mw-search-interwiki-more {
+ float: right;
+ font-size: 90%;
+}
+
+span.searchalttitle {
+ font-size: 95%;
+}
+
+div.searchdidyoumean {
+ font-size: 127%;
+ padding-bottom:1ex;
+ padding-top:1ex;
+}
+
+/*
+ * UserRights stuff
+ */
+.mw-userrights-disabled {
+ color: #888;
+}
+
+table.mw-userrights-groups * td,table.mw-userrights-groups * th {
+ padding-right: 1.5em;
+}
+
+/*
+ * OpenSearch ajax suggestions
+ */
+.os-suggest {
+ overflow: auto;
+ overflow-x: hidden;
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ width: 0px;
+ background-color: white;
+ border-style: solid;
+ border-color: #AAAAAA;
+ border-width: 1px;
+ z-index:99;
+ visibility:hidden;
+ font-size:95%;
+}
+
+table.os-suggest-results {
+ font-size: 95%;
+ cursor: pointer;
+ border: 0;
+ border-collapse: collapse;
+ width: 100%;
+}
+
+td.os-suggest-result, td.os-suggest-result-hl {
+ white-space: nowrap;
+ background-color: white;
+ background-color: Window;
+ color: black;
+ color: WindowText;
+ padding: 2px;
+}
+td.os-suggest-result-hl,
+td.os-suggest-result-hl-webkit {
+ background-color: #4C59A6;
+ color: white;
+}
+td.os-suggest-result-hl {
+ /* System colors are misimplemented in Safari 3.0 and earlier,
+ making highlighted text illegible... */
+ background-color: Highlight;
+ color: HighlightText;
+}
+
+.os-suggest-toggle {
+ position: relative;
+ left: 1ex;
+ font-size: 65%;
+}
+.os-suggest-toggle-def {
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ font-size: 65%;
+ visibility: hidden;
+}
+
+/* Page history styling */
+/* the auto-generated edit comments */
+.autocomment { color: gray; }
+#pagehistory .history-user {
+ margin-left: 0.4em;
+ margin-right: 0.2em;
+}
+#pagehistory span.minor { font-weight: bold; }
+#pagehistory li { border: 1px solid white; }
+#pagehistory li.selected {
+ background-color: #f9f9f9;
+ border: 1px dashed #aaa;
+}
+
+table.mw-listgrouprights-table {
+ border: 1px solid #ccc;
+ border-collapse: collapse;
+}
+
+table.mw-listgrouprights-table tr {
+ vertical-align: top;
+}
+
+table.mw-listgrouprights-table td, table.mw-listgrouprights-table th {
+ padding: 0.5em 0.2em 0.5em 0.2em;
+ border: 1px solid #ccc;
+}
+
+/* Special:SpecialPages styling */
+h4.mw-specialpagesgroup {
+ background-color: #dcdcdc;
+ padding: 2px;
+ margin: .3em 0em 0em 0em;
+}
+
+#shared-image-dup, #shared-image-conflict {
+ font-style: italic;
+}
diff --git a/static/news_icon.png b/static/news_icon.png
new file mode 100755
index 0000000..dd1541d
--- /dev/null
+++ b/static/news_icon.png
Binary files differ
diff --git a/static/outgoing_link.gif b/static/outgoing_link.gif
new file mode 100644
index 0000000..d508fc4
--- /dev/null
+++ b/static/outgoing_link.gif
Binary files differ
diff --git a/static/pedia.css b/static/pedia.css
new file mode 100644
index 0000000..3e814ef
--- /dev/null
+++ b/static/pedia.css
@@ -0,0 +1,1250 @@
+/* ############# misc #################*/
+body, p, li, ul, a {
+ margin:0px;
+ padding:0px;
+}
+
+body {
+ background-color:#F4F5E7;
+ font-family:arial;
+ font-size:10pt;
+}
+
+img {
+ border:0;
+ }
+
+* {
+ font-size:10pt;
+ }
+
+h1, h1 * {
+ font-size:20pt;
+ }
+
+h2, h2 * {
+ font-size:14pt;
+ }
+
+h3, h3 * {
+ font-size:13pt;
+ }
+
+.invisible {
+ display: none;
+}
+
+/* ############### base ########### */
+
+* a, * a:hover, * a:visited, * a:active {
+ color:rgb(29,48,161);
+ }
+
+
+
+#header {
+ text-align:right;
+ height:74px;
+ padding:0px;
+ margin:0px;
+ table-layout:fixed;
+ overflow:hidden;
+}
+
+#main_nav {
+ padding-top:5px;
+ margin-right:20px;
+ height:47px !important;
+ /* height:50px !important; */
+ height:54px;
+ /* height:57px; */
+}
+
+#main_nav a {
+ font-size:10pt;
+ font-weight:bold;
+ color: black;
+ text-decoration:none;
+}
+
+#main_nav ul {
+ line-height:12pt;
+}
+
+#main_nav li {
+ display:inline;
+}
+
+#tab_nav {
+ position:absolute;
+ /* top:60px !important;
+ top:57px; */
+
+ top:66px !important;
+ top:63px;
+ right:30px;
+ border:0px;
+ }
+
+
+#errorarea, #busyarea {
+ position:absolute;
+ top:40%;
+ left:30%;
+ width:40%;
+ height:10%;
+ border:2px solid rgb(196,196,196);
+ background-color: rgb(255,136,0);
+ text-align:center;
+ }
+
+head:first-child+body #busyarea { /* this is a hack to prevent IE to read this*/
+ position:fixed;
+ }
+
+#busyarea {
+ /* background-color:#F4F5E7; */
+ background-color:white;
+ }
+
+#errorarea {
+ background-color: rgb(255,136,0);
+ }
+
+a#errorclose {
+ color:black;
+ font-weight:bold;
+ }
+
+/* ######### misc table formatting ################*/
+
+/*
+#managebook table {
+ padding:0px;
+ margin:0px;
+ border-collapse:collapse;
+ border-spacing:0px;
+ }
+*/
+
+.roundbox, .roundbox tr, .roundbox td, .roundbox img, .clean, #tab_nav img, .snippet img {
+ padding:0px;
+ margin:0px;
+ border:0px;
+ border-collapse:collapse;
+ border-spacing:0px;
+ /* border-style:hidden; */
+}
+
+.tablefull {
+ margin:0px;
+ border:0px;
+ border-spacing:0px;
+ width:100%;
+ padding:5px;
+}
+
+/*
+.roundbox td {
+ background-color:white;
+}
+*/
+
+.roundboxContent {
+ background-color:white;
+ }
+
+/* ################## managebook ################## */
+
+#book_nav {
+ line-height:16pt;
+ font-size:10pt;
+}
+
+#book_nav input {
+ margin:0px;
+ vertical-align:bottom;
+ font-size:10pt;
+ width:220px;
+}
+
+ .link {
+ color:black;
+ margin-right:15px;
+}
+#book_nav img {
+ border:0px;
+ padding:0px;
+ margin:0px;
+ margin-left:10px;
+ margin-right:10px;
+ vertical-align:bottom;
+}
+.info li {
+ list-style-type:square;
+}
+
+#info li {
+ list-style-type:square;
+ margin-left:35px;
+}
+
+#info h2 {
+ margin:10px;
+ margin-top:15px;
+ }
+
+#info h2 a {
+ color:black;
+ }
+
+#info h3 {
+ margin-bottom:5px;
+ }
+
+#info p {
+ margin:10px;
+ }
+
+#tab_nav .info {
+ border:1px solid rgb(128,128,128);
+ font-size:8pt;
+ padding-left:20px;
+}
+
+.no_list_style li{
+ list-style-type:none !important;
+}
+
+#info h3 {
+ margin-left:10px;
+ }
+
+/* ################## main ################### */
+
+#main {
+ margin-top:0px;
+ margin-right:0px;
+}
+
+#main_content {
+ padding-left:10px;
+ padding-right:0px;
+ padding-top:5px;
+}
+
+#fromsearch {
+ margin-right:350px;
+ margin-bottom:10px;
+ margin-left:10px;
+ /* background-color: rgb(200, 220, 255); */
+ background-color:rgb(240,240,240);
+ border:2px solid rgb(251,88,33);
+ padding:5px;
+ }
+
+#wikipagecontent {
+ padding: 0px 10px;
+ }
+
+#add_pages {
+ float:right;
+ margin:0px;
+ background-color:white;
+ border:0px;
+}
+
+#add_pages img {
+ border:0px;
+ margin:5px 10px;
+}
+
+/* ******************** wikipedia article formatting ******************* */
+
+#main {
+ font-family: "Trebuchet MS", Trebuchet, Verdana, sans-serif;
+ /* font-family: Palatino Linotype, Book Antiqua, Palatino; */
+ font-size:10pt;
+ overflow:hidden;
+}
+
+#main h1 {
+ font-size:20pt;
+ margin-bottom:30px;
+ margin-right:10px;
+ border-bottom:1px solid rgb(128,128,128);
+}
+
+#main h2 {
+ z-index:-1;
+ font-size:14pt;
+ margin-right:20px;
+ border-bottom:1px solid rgb(128,128,128);
+}
+
+#main h3 {
+ margin-top:10px;
+ margin-bottom:5px;
+ font-size:13pt;
+}
+
+
+#main p {
+ margin-top:5px;
+}
+
+#main a {
+ text-decoration:none;
+}
+
+#main a:hover {
+ text-decoration:underline;
+}
+
+#main ul {
+ margin: 5px 15px;
+}
+#main ul li {
+ list-style-type:square;
+ margin-left:20px;
+}
+
+
+#main table {
+ empty-cells:show;
+ background-color:white;
+ margin:10px;
+}
+
+
+
+#main th {
+ font-weight:bold;
+ }
+
+
+#main .deadlink, #main .deadlink:hover {
+ text-decoration:none;
+ color:black;
+ }
+
+
+#main .infobox {
+ float:right;
+ border:1px solid grey;
+ padding:2px;
+ }
+
+#main .infobox td {
+ padding:2px 4px;
+ }
+
+#main .bordered {
+ border-collapse:collapse;
+ }
+
+#main .bordered td {
+ border:1px solid grey;
+ }
+
+#main .borderless *, #main .borderless {
+ border:0 !important;
+ }
+
+
+#main .infobox * {
+ font-size: 8pt;
+ }
+
+#main sub, #main sup {
+ font-size: 8pt;
+ margin-right:3px;
+ }
+
+
+#main .small * {
+ font-size:8pt;
+ }
+
+
+.border {
+ border:1px solid rgb(128,128,128);
+ border-collapse:collapse;
+}
+
+.image {
+ margin:10px;
+ padding:2px;
+ border:1px solid rgb(128,128,128);
+ background:white;
+}
+
+.clear {
+ clear:both;
+ }
+
+.right {
+ clear:right;
+ float:right;
+}
+
+/*
+.right + .right {
+ clear:right;
+ }
+*/
+
+.left {
+ clear:left;
+ float:left;
+}
+
+/*
+.left + .left {
+ clear:left;
+ }
+*/
+
+#main .formula {
+ vertical-align:middle;
+ }
+
+
+.imagecaption {
+ display:block;
+ font-size:8pt;
+ padding:2px;
+}
+
+.imagecaption *{
+ font-size:8pt;
+}
+
+/* .wikitable, .wikitable tr, */
+
+.wikitable {
+ border-collapse:collapse;
+}
+
+.wikitable td {
+ border:1px solid black;
+ border-spacing:0px;
+ padding:0px 2px;
+ }
+
+.toccolours {
+ border:1px solid black;
+ }
+
+
+/* ###### misc... ##### */
+
+.addButton img {
+ width:12px;
+ height:12px;
+ border:0;
+ margin-right:10px;
+ }
+
+.addButton div {
+ margin-right:10px;
+ width:12px;
+ display:inline;
+ }
+
+
+.addButton a {
+ margin-left:0px;
+ }
+
+
+/* ############## pagelist ####################### */
+
+#pagelist {
+ padding:10px;
+ }
+
+#collTitle {
+ /* margin-left:10px; */
+ font-size:12pt;
+ font-weight:bold;
+ border-bottom:1px solid rgb(128,128,128);
+ }
+
+#collEditTable {
+ margin:10px 0px;
+ }
+
+.box_content {
+ margin:10px 0px;
+ font-size:9pt;
+}
+
+#collInfo {
+ margin-top:10px;
+ font-size:10pt;
+ }
+
+.del_col {
+ /* width:2em; */
+ width:21px;
+ padding:0px 2px;
+ }
+
+.priceInfo {
+ margin-bottom:10px;
+ font-size:8pt;
+ }
+
+#collNumPages {
+ margin-top:10px;
+}
+
+#collNumPages, #collPrice {
+ font-weight:bold;
+ }
+
+#clearbook {
+ margin-top:10px;
+ }
+
+
+div.uitable table{
+ border-collapse: collapse;
+ /* border:1px solid rgb(196,196,196); */
+ cursor:pointer;
+}
+
+div.uitable table tbody tr {
+ padding:3px;
+ margin:3px;
+}
+
+/*
+div.uitable table tbody tr.ui_hover td{
+ background-color:#BACFE4;
+}
+*/
+
+div.uitable table tbody tr.ui_active td {
+ /* background-color:#F4F5E7; */
+ font-weight:bold;
+
+}
+
+div.uitable td {
+ padding:0px 2px;
+ }
+
+div.uitable td:hover {
+ text-decoration:underline;
+ background-color:#BACFE4;
+ }
+
+
+/* ############################# index.html ########################### */
+
+#home_left, #home_right {
+ padding:0px 10px;
+ }
+
+#home_right span {
+ /* font-style:italic; */
+ border-bottom:1px solid rgb(128,128,128);
+
+}
+
+#home_right .heading {
+ width:450px;
+ border-bottom:1px solid rgb(128,128,128);
+ }
+
+
+#home_right li {
+ margin-left:20px;
+ font-style:normal;
+ font-weight: normal;
+ }
+
+#home_left p, #home_right p {
+ margin:0px 0px;
+ }
+
+#home_right h1 {
+ font-size:14pt;
+ /* color:rgb(64,64,64); */
+ color:rgb(32,32,32);
+ margin-right:15px;
+ margin-top:0px;
+ text-decoration:underline;
+ }
+
+#home_right h2 {
+ font-size:14pt;
+ color:rgb(64,64,64);
+ color:rgb(32,32,32);
+ margin-right:15px;
+ display:inline;
+ }
+
+#home_right ul {
+ margin-bottom:10px;
+ list-style-type:square;
+ }
+
+
+#home_left h2 {
+ font-size:14pt;
+ color:rgb(64,64,64);
+ color:rgb(32,32,32);
+ margin-top:5px;
+ margin-bottom:5px;
+ }
+
+#home_left li {
+ list-style-type:none;
+ margin-bottom:5px;
+ margin-left:0px;
+ padding-left:0px;
+ }
+
+#home_left .title {
+ font-weight:bold;
+ font-style:italic;
+ }
+
+#home_left td {
+ padding:3px 2px;
+ }
+
+
+
+#finish_book {
+ line-height:18pt;
+ }
+
+#finish_book .label {
+ font-weight:bold;
+ vertical-align:bottom;
+ text-align:right;
+ padding-right:5px;
+ }
+
+#finish_book .input {
+ vertical-align:bottom;
+ text-align:left;
+ padding-left:5px;
+ }
+
+#finish_book input {
+ padding: 0px 5px;
+ margin:2px 0px;
+ width:400px;
+ }
+
+#booktitle {
+ font-size:14pt;
+}
+
+#bookeditor {
+ font-size:12pt;
+ }
+
+
+#finish_book table {
+ margin-bottom:5px;
+}
+
+#wp_footer {
+ clear:both;
+ float:right;
+ margin-top:10px;
+ margin-bottom:10px;
+ padding:5px;
+ /* border:2px solid rgb(230,230,230); */
+ border:2px solid rgb(251,88,33);
+ background-color:rgb(240,240,240);
+ }
+
+/* ++++++++++++++++++ order ++++++++++++++ */
+
+#order_pay h2 {
+ margin-top:0px;
+ }
+
+#order_content h2, #order_content h3, #showbook_content h2, #showbook_content h3 {
+ margin:5px 0px;
+ }
+
+#order_content h3, #showbook_content h3 {
+ margin-top:15px;
+ }
+
+
+#order_content li, #showbook_content li {
+ margin-right:10px;
+ list-style-type:none;
+ border-bottom:1px dotted grey;
+ }
+
+#order_content, #order_pay, #showbook_content {
+ margin:10px;
+ }
+
+#order_content a, #showbook_content a {
+ text-decoration:none;
+ }
+
+#order_content a:hover, #showbook_content a:hover {
+ text-decoration:underline;
+ }
+
+#cost .label, #ship .label, #contact_form .label {
+ text-align:right;
+ vertical-align:top;
+ }
+#cost .value #ship .value, #contact_form .value {
+ text-align:left;
+ }
+
+#cost td, #ship td, #contact_form td {
+ padding:2px 5px;
+ }
+
+#cost {
+ border:1px solid grey;
+ }
+
+#ship input, #ship textarea, #ship select {
+ width:250px;
+ }
+
+#terms_ok {
+ margin-left:10px;
+ }
+
+#terms_ok input {
+ margin-left:0px;
+
+ }
+
+#contact_form input, #contact_form select {
+ width: 250px;
+ }
+
+ #contact_form textarea {
+ width:400px;
+ }
+
+#contact h2 {
+ margin-top:0px;
+ }
+
+
+.tooltip {
+ background-color: rgb(255, 250, 200);
+ border: 1px solid black;
+ position: absolute;
+ z-index: 10000;
+ width: 200px;
+ padding:2px;
+ text-align:center;
+}
+
+.snippet {
+ background-color: rgb(200, 220, 255);
+ border: 1px solid black;
+ padding: 5px;
+ z-index: 10000;
+ position: absolute;
+ font-size: 10px;
+}
+
+#snippetid, #snippetid * {
+ font-size: 10pt;
+ font-style:normal;
+ font-weight:normal;
+}
+
+#snippetid em {
+ font-style:italic;
+ }
+
+#snippetid strong {
+ font-weight:bold;
+ }
+
+
+.hasborder {
+ border: 2px solid rgb(220,220,220);
+}
+
+.noborder {
+ border-width: 0px;
+ border: 2px solid white;
+}
+
+.greyedout {
+ color: rgb(127, 127, 127);
+}
+
+.notgreyedout {
+ color: black;
+}
+
+#terms dt {
+ margin-top:10px;
+ font-weight:bold;
+ }
+
+#terms .toc li {
+ margin-left:15px;
+ list-style-type:none;
+ }
+
+#terms p {
+ margin-top:10px;
+
+ }
+
+
+#terms p, #terms dt, #terms dd, #terms li, #terms a, #terms strong{
+ font-size:8pt;
+ }
+
+#terms h2, #terms h2 a {
+ font-size:12pt;
+ color:black;
+ }
+
+#terms h3 {
+ font-size:10pt;
+ }
+
+#terms li {
+ list-style-type:square;
+ }
+
+#refreshproposals {
+ padding:5px;
+ margin:5px;
+ margin-right:0px;
+ }
+
+
+.site_link {
+ border-bottom:1px dotted black;
+ color:black;
+ text-decoration:none;
+}
+
+.site_link:hover {
+ text-decoration:none !important;
+ }
+
+
+.topcats, .topcats * {
+ font-weight:bold;
+ list-style-type:none !important;
+ margin:0px;
+ padding:0px;
+ font-size:12pt;
+ border-bottom:1px solid rgb(128,128,128);
+ margin-top:5px;
+ }
+
+.topcats {
+ margin-right:5px;
+}
+
+.subcats {
+ margin-right:0px;
+ }
+
+
+#preview {
+ margin:10px;
+ }
+
+#preview h1 {
+ margin-top:0px;
+ margin-bottom:10px;
+ }
+
+#adobe_info {
+ float:right;
+ width:33%;
+ border:1px solid rgb(128,128,128);
+ border:1px solid rgb(196,196,196);
+ margin:10px;
+ margin-right:0px;
+ margin-top:0px;
+ padding:5px;
+
+ }
+
+#generating {
+ margin:0px;
+ }
+
+#finished p {
+ margin-bottom:10px;
+ }
+
+#affiliate {
+ padding:5px;
+ padding-top:0px;
+ }
+#affiliate p{
+ margin-bottom:10px;
+ }
+
+#affiliate li {
+ list-style-type:square;
+ margin-left:25px;
+ }
+#affiliate ul {
+ margin-bottom:10px;
+}
+
+#affiliatetable td{
+ padding:10px;
+ }
+
+#affiliatetable li {
+ list-style-type:none;
+ }
+
+#affiliatetable input {
+ margin-left:0px;
+ }
+
+.affiliatebox {
+ float:left;
+ width:45%;
+ margin:10px;
+ /* padding:10px; */
+ /* border:2px solid rgb(210,210,210); */
+ /* border:2px solid rgb(251,88,33); */
+ }
+
+.affiliateboxcontent {
+ margin:10px;
+ }
+
+.affiliatebox h2 {
+ margin:0px;
+ margin-bottom:10px;
+ }
+
+.affiliatebox ul li {
+ list-style-type:square;
+ margin-left:15px;
+ }
+
+.affiliatebox .nobullets li {
+ list-style-type:none;
+ margin-left:0px;
+ }
+
+
+
+#welcome {
+ padding:10px;
+ padding-top:5px;
+ margin:0px;
+ }
+
+#welcome h1 {
+ margin:0px;
+ margin-bottom:10px;
+ font-size:16pt;
+ color:rgb(32,32,32);
+ }
+
+
+#home_howto td{
+ padding:5px;
+ vertical-align:top;
+ }
+
+#home_howto .step_num {
+ font-size:20pt;
+ color:rgb(128,128,128);
+ float:left;
+ margin:5px;
+ }
+
+#home_howto li {
+ list-style-type:square;
+ margin-left:20px;
+ }
+
+#news .newsitem {
+ margin: 10px;
+ max-width:500px;
+ }
+
+#news .newsitem h3 {
+ font-size:12pt;
+ margin-bottom:5px;
+ margin-top:10px;
+ }
+
+.newsitem + .newsitem {
+ border-top:1px dotted rgb(128,128,128);
+ }
+
+#news .date {
+ float:right;
+ margin-top:5px;
+ margin-left:10px;
+ font-size:8pt;
+ }
+
+.deadlink {
+ color:black;
+}
+
+.smalltext, .smalltext em, .smalltext * {
+ font-size:8pt !important;
+ }
+
+.template_warningsmart {
+ border:3px solid red;
+}
+.template_warningmanual{
+ border:3px solid orange;
+ }
+
+.template_warningsmart * {
+ background-color:rgb(210,210,210);
+ }
+
+.template_warningmanual * {
+ background-color:rgb(230,230,230);
+ }
+
+
+ #startcats {
+ padding:5px;
+ }
+
+ #startcats h2, #startcats h3 {
+ margin:5px 0px;
+ }
+
+#startcats .topcats {
+ margin-bottom:5px;
+}
+
+#startcats .topcats *, #startcats .subcats * {
+ text-decoration:none;
+ }
+
+#startcats .topcats a {
+ border-bottom:0;
+ }
+
+.startcatbox {
+ width:30%;
+ float:left;
+ padding:10px;
+ padding-bottom:0px;
+ }
+
+.startcatbox h3 {
+ border-bottom:1px solid rgb(128,128,128);
+ }
+
+
+#lowpagecount, #highpagecount {
+ margin:10px 0px;
+ padding:10px;
+ border:2px solid rgb(251,88,33);
+ background-color:rgb(240,240,240);
+ }
+
+#highpagecount {
+ margin-left:10px;
+ }
+
+
+#examplebook {
+ padding:10px;
+ }
+
+#examplebook li {
+ list-style-type: none;
+ text-align:center;
+ margin-bottom:5px;
+ }
+
+#examplebook .book_img img {
+ border:1px dotted rgb(128,128,128);
+ padding:2px;
+ }
+
+#examplebook .info {
+ float:right;
+ border:1px dotted rgb(128,128,128);
+ padding:5px;
+ }
+
+#examplebook .navigation {
+ position:absolute;
+ margin:15px 0px;
+ border:1px dotted rgb(128,128,128);
+ padding:5px 15px;
+ }
+
+#examplebook .navigation li {
+ text-align:left;
+ }
+
+#examplebook .navigation a {
+ text-decoration:none;
+ }
+
+#examplebook .navigation a:hover {
+ text-decoration:underline;
+ }
+
+
+
+
+
+
+/* ######## pssearch */
+
+
+
+.pssnippet strong {
+ font-weight:normal;
+ }
+
+.pssnippet li {
+ margin-left:15px;
+ }
+
+.pssnippethl {
+ background-color: rgb(196, 224, 255);
+}
+
+
+#pssearch a {
+ color:rgb(28,53,110);
+ }
+
+/*
+#pssearch li {
+ margin-bottom:10px;
+ list-style-type:square;
+ }
+*/
+
+li.result {
+ margin-bottom:10px;
+ list-style-type:square;
+ }
+
+#pssearch .details, #pssearch .details * {
+ font-size:8pt;
+ }
+
+.marginbox {
+ padding:5px 10px;
+ }
+
+#searchresultlist .result {
+ margin: 0px 5px;
+ padding: 8px 0px;
+ list-style-type:none;
+ border-bottom:1px dotted rgb(128,128,128);
+ /* border-top:1px dotted rgb(128,128,128);*/
+ /*background:rgb(245, 250, 250);*/
+}
+
+/*
+.alternate {
+ background: rgb(234, 238, 245);
+}
+*/
+
+.clustered {
+ margin-left: 40px;
+}
+
+.resultdetails * {
+ text-align:middle;
+ }
+
+/* display styles for snippets search result snippet*/
+.pssnippet hr {
+ display:none;
+}
+
+.pssnippet li {
+ margin-left:15px;
+}
+
+/* end filter */
+
+#categories li {
+ list-style-type: none;
+}
+
+#categories h2 {
+ margin:0px;
+ font-size: 12pt;
+ }
+
+#categories a:hover {
+ background-color:rgb(1,160,199);
+ color:white;
+ text-decoration:none;
+}
+
+#pssearch .subcats {
+ margin-bottom:0px;
+ margin-left:15px;
+ list-style-type:none;
+}
+
+#searchselection {
+ margin-left:10px;
+ vertical-align:middle;
+}
+
+#searchselection input {
+ color:green;
+ margin-left:10px;
+ margin-right:5px;
+ vertical-align:middle;
+}
+
+.searchresulturl {
+ color: rgb(0, 96, 120);
+}
+
+.psformat {
+ font-size: 8pt;
+}
+
+.psrf {
+ float: right;
+}
+
+.pscategorylink, .psarticlelink {
+ white-space: nowrap;
+}
+
+.matchedcategories {
+ border: 1px dotted grey;
+ /*background-color: rgb(245, 245, 245);*/
+ margin-left: 10px;
+ margin-right: 10px;
+ margin-bottom: 15px;
+ padding: 4px;
+}
+
diff --git a/static/phys_science.png b/static/phys_science.png
new file mode 100644
index 0000000..e2c0c7e
--- /dev/null
+++ b/static/phys_science.png
Binary files differ
diff --git a/static/required.gif b/static/required.gif
new file mode 100755
index 0000000..bd71976
--- /dev/null
+++ b/static/required.gif
Binary files differ
diff --git a/static/shared.css b/static/shared.css
new file mode 100644
index 0000000..d841985
--- /dev/null
+++ b/static/shared.css
@@ -0,0 +1,242 @@
+/**
+ * CSS in this file is used by *all* skins (that have any CSS at all). Be
+ * careful what you put in here, since what looks good in one skin may not in
+ * another, but don't ignore the poor non-Monobook users either.
+ */
+.mw-plusminus-null { color: #aaa; }
+
+.texvc { direction: ltr; unicode-bidi: embed; }
+img.tex { vertical-align: middle; }
+span.texhtml { font-family: serif; }
+
+/* Stop floats from intruding into edit area in previews */
+#toolbar, #wpTextbox1 { clear: both; }
+
+div#mw-js-message {
+ margin: 1em 5%;
+ padding: 0.5em 2.5%;
+ border: solid 1px #ddd;
+ background-color: #fcfcfc;
+}
+
+/* Edit section links */
+.editsection {
+ float: right;
+ margin-left: 5px;
+}
+
+/**
+ * File histories
+ */
+table.filehistory {
+ border:1px solid #ccc;
+ border-collapse:collapse;
+}
+
+table.filehistory th,
+table.filehistory td {
+ padding: 0 0.2em 0 0.2em;
+ vertical-align:top;
+ border:1px solid #ccc;
+}
+table.filehistory th {
+ text-align: left;
+}
+table.filehistory td.mw-imagepage-filesize,
+table.filehistory th.mw-imagepage-filesize {
+ white-space:nowrap;
+}
+
+/*
+ * rev_deleted stuff
+ */
+li span.deleted, span.history-deleted {
+ text-decoration: line-through;
+ color: #888;
+ font-style: italic;
+}
+
+/**
+ * Forms
+ */
+body.ltr td.mw-label { text-align: right; }
+body.ltr td.mw-input { text-align: left; }
+body.ltr td.mw-submit { text-align: left; }
+body.rtl td.mw-label { text-align: left; }
+body.rtl td.mw-input { text-align: right; }
+body.rtl td.mw-submit { text-align: right; }
+
+td.mw-label { vertical-align: top; }
+td.mw-submit { white-space: nowrap; }
+
+/**
+ * Image captions
+ */
+body.rtl .thumbcaption { text-align:right; }
+body.rtl .magnify { float:left; }
+
+body.ltr .thumbcaption { text-align:left; }
+body.ltr .magnify { float:right; }
+
+/**
+ * Hidden categories
+ */
+.mw-hidden-cats-hidden { display: none; }
+.catlinks-allhidden { display: none; }
+
+/* Convenience links to edit block and delete reasons */
+p.mw-ipb-conveniencelinks, p.mw-filedelete-editreasons, p.mw-delete-editreasons {
+ font-size: 90%;
+ float: right;
+}
+
+/* Search results */
+div.searchresult {
+ font-size: 95%;
+ width:38em;
+}
+.mw-search-results li {
+ padding-bottom: 1em;
+}
+.mw-search-result-data {
+ color: green;
+ font-size: 97%;
+}
+
+div#mw-search-interwiki {
+ float: right;
+ width: 18em;
+ border-style: solid;
+ border-color: #AAAAAA;
+ border-width: 1px;
+ margin-top: 2ex;
+}
+
+div#mw-search-interwiki li {
+ font-size: 95%;
+}
+
+.mw-search-interwiki-more {
+ float: right;
+ font-size: 90%;
+}
+
+span.searchalttitle {
+ font-size: 95%;
+}
+
+div.searchdidyoumean {
+ font-size: 127%;
+ padding-bottom:1ex;
+ padding-top:1ex;
+}
+
+/*
+ * UserRights stuff
+ */
+.mw-userrights-disabled {
+ color: #888;
+}
+
+table.mw-userrights-groups * td,table.mw-userrights-groups * th {
+ padding-right: 1.5em;
+}
+
+/*
+ * OpenSearch ajax suggestions
+ */
+.os-suggest {
+ overflow: auto;
+ overflow-x: hidden;
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ width: 0px;
+ background-color: white;
+ border-style: solid;
+ border-color: #AAAAAA;
+ border-width: 1px;
+ z-index:99;
+ visibility:hidden;
+ font-size:95%;
+}
+
+table.os-suggest-results {
+ font-size: 95%;
+ cursor: pointer;
+ border: 0;
+ border-collapse: collapse;
+ width: 100%;
+}
+
+td.os-suggest-result, td.os-suggest-result-hl {
+ white-space: nowrap;
+ background-color: white;
+ background-color: Window;
+ color: black;
+ color: WindowText;
+ padding: 2px;
+}
+td.os-suggest-result-hl,
+td.os-suggest-result-hl-webkit {
+ background-color: #4C59A6;
+ color: white;
+}
+td.os-suggest-result-hl {
+ /* System colors are misimplemented in Safari 3.0 and earlier,
+ making highlighted text illegible... */
+ background-color: Highlight;
+ color: HighlightText;
+}
+
+.os-suggest-toggle {
+ position: relative;
+ left: 1ex;
+ font-size: 65%;
+}
+.os-suggest-toggle-def {
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ font-size: 65%;
+ visibility: hidden;
+}
+
+/* Page history styling */
+/* the auto-generated edit comments */
+.autocomment { color: gray; }
+#pagehistory .history-user {
+ margin-left: 0.4em;
+ margin-right: 0.2em;
+}
+#pagehistory span.minor { font-weight: bold; }
+#pagehistory li { border: 1px solid white; }
+#pagehistory li.selected {
+ background-color: #f9f9f9;
+ border: 1px dashed #aaa;
+}
+
+table.mw-listgrouprights-table {
+ border: 1px solid #ccc;
+ border-collapse: collapse;
+}
+
+table.mw-listgrouprights-table tr {
+ vertical-align: top;
+}
+
+table.mw-listgrouprights-table td, table.mw-listgrouprights-table th {
+ padding: 0.5em 0.2em 0.5em 0.2em;
+ border: 1px solid #ccc;
+}
+
+/* Special:SpecialPages styling */
+h4.mw-specialpagesgroup {
+ background-color: #dcdcdc;
+ padding: 2px;
+ margin: .3em 0em 0em 0em;
+}
+
+#shared-image-dup, #shared-image-conflict {
+ font-style: italic;
+}
diff --git a/static/socialscience.png b/static/socialscience.png
new file mode 100644
index 0000000..a989732
--- /dev/null
+++ b/static/socialscience.png
Binary files differ
diff --git a/static/society.png b/static/society.png
new file mode 100644
index 0000000..e8ffbd1
--- /dev/null
+++ b/static/society.png
Binary files differ
diff --git a/static/styles.css b/static/styles.css
new file mode 100644
index 0000000..e40e1c4
--- /dev/null
+++ b/static/styles.css
@@ -0,0 +1,61 @@
+/*<pre><nowiki>*/
+
+ /************************/
+ /* CommonsTicker styles */
+ /************************/
+
+ /* Estilos para el CommonsTicker. Es cargado por MediaWiki:Common.css
+ Esta página DEBE ESTAR PROTEGIDA */
+
+ /* links */
+ .tickerDiffLink { } /* diff links in ticker */
+ .tickerMiscLink { } /* misc links in ticker */
+ /* remove list bullets */
+ .tickerList ul, .tickerList ul li { list-style: none; text-indent:-2em; margin-left:2em; text-align:left; }
+ .tickerList ul ul, .tickerList ul ul li { list-style: none; text-indent:0; margin-left:1.5em; text-align:left; }
+
+ /* per-type styles */
+ .tickerEntry_deleted { } /* entry for image deletion */
+ .tickerEntry_restored { } /* entry for restored image */
+ .tickerEntry_replaced { } /* entry for image replacement */
+ .tickerEntry_tagged { } /* entry for adding/removing problem tags */
+ .tickerEntry_redir { } /* entry for critical redirection (fot tag redirects) */
+ .tickerEntry_recat { } /* entry for critical re-categorization (for tag categories) */
+ .tickerEntry_notify { } /* entry for global notifications */
+ .tickerEntry_changed { } /* entry for generic change */
+
+ /* per-status styles */
+ .tickerStatus_done { text-decoration:line-through; } /* strike through when entry has been handeled */
+
+ /* per-action styles */
+ .tickerAction_deleted:before { content:" Eliminada "; color: #FF0000; font-family:monospace; font-weight:bold; font-size:80%; }
+ .tickerAction_restored:before { content:" Recuperada "; color: #00BB00; font-family:monospace; font-weight:bold; font-size:80%; }
+ .tickerAction_deletedRev:before { content:" -Anterior "; color: #DDAAAA; font-family:monospace; font-weight:bold; font-size:80%; }
+ .tickerAction_replaced:before { content:" Reemplazada "; color: #CC88FF; font-family:monospace; font-weight:bold; font-size:100%; }
+ .tickerAction_replacedOwn:before { content:" UPDT "; color: #EEAAFF; font-family:monospace; font-weight:bold; font-size:100%; }
+ .tickerAction_addedBad:before { content:" +VfD "; color: #FF8800; font-family:monospace; font-weight:bold; font-size:100%; }
+ .tickerAction_removedBad:before { content:" -VfD "; color: #00BB00; font-family:monospace; font-weight:bold; font-size:100%; }
+ .tickerAction_addedGood:before { content:" +OK "; color: #00BB00; font-family:monospace; font-weight:bold; font-size:100%; }
+ .tickerAction_removedGood:before { content:" -OK "; color: #FF8800; font-family:monospace; font-weight:bold; font-size:100%; }
+
+ /* ticker usage list */
+ .tickerUsage { font-size:80%; }
+
+ /* entry applies to a template used by multiple images */
+ .tickerTemplateEntry { font-weight: bold; }
+
+ /* entry applies to sub-entries, i.e. images that use a specific template */
+ .tickerSubEntry { }
+
+ /* minor entry styles */
+ .tickerMinorEntry { color:#666; } /* minor entry */
+ .tickerMinorEntry a,
+ .tickerMinorEntry a:link,
+ .tickerMinorEntry a:visited { color:#669; }
+ #bodyContent .tickerMinorEntry a.extiw,
+ #bodyContent .tickerMinorEntry a.extiw:link,
+ #bodyContent .tickerMinorEntry a.extiw:visited { color:#669; }
+
+ .tachado { text-decoration:line-through; } /* Una forma fácil de escribirlo */
+
+/*</nowiki></pre>*/ \ No newline at end of file
diff --git a/static/technology.png b/static/technology.png
new file mode 100644
index 0000000..4613eeb
--- /dev/null
+++ b/static/technology.png
Binary files differ
diff --git a/static/user.gif b/static/user.gif
new file mode 100755
index 0000000..bc93439
--- /dev/null
+++ b/static/user.gif
Binary files differ
diff --git a/static/video.png b/static/video.png
new file mode 100755
index 0000000..38103da
--- /dev/null
+++ b/static/video.png
Binary files differ
diff --git a/static/wikipedia.png b/static/wikipedia.png
new file mode 100644
index 0000000..470345a
--- /dev/null
+++ b/static/wikipedia.png
Binary files differ
diff --git a/tools2/HOWTO.txt b/tools2/HOWTO.txt
new file mode 100644
index 0000000..c5c7c61
--- /dev/null
+++ b/tools2/HOWTO.txt
@@ -0,0 +1,114 @@
+"Crear uno, dos, tres... mil Wikipedias" Comandante Ernesto Wales
+
+How to Create a new wikiactivity or update a existing activity:
+
+1) Download a dump:
+
+Create a directory inside the activity and download the wikipedia dump file
+Wikipedia provide a daily xml files dump for every language.
+This test was done with the spanish dump.
+The file used was eswiki-20111112-pages-articles.xml.bz2 from
+http://dumps.wikimedia.org/eswiki/20110810/
+
+The first two letters from your directry must be the language code example: es_es or en_us
+
+mkdir es_lat
+cd es_lat
+bzip2 -d eswiki-20111112-pages-articles.xml.bz2
+
+2) Process the dump file:
+
+You need edit the file tools2/config.py, and modify the variable input_xml_file_name.
+If you are creating a wikipedia in a different language to spanish,
+modify the values of the other variables.
+
+After save the config.py, you can process the dump file:
+
+../tools2/pages_parser.py
+
+This process will create the following files:
+eswiki-20111112-pages-articles.xml.links
+eswiki-20111112-pages-articles.xml.page_templates
+eswiki-20111112-pages-articles.xml.redirects
+eswiki-20111112-pages-articles.xml.templates
+
+If you want have more information, can use the option "--debug"
+to create the files .all_pages, .blacklisted and .titles and help you
+to research about the process.
+
+With the spanish file and a little more to 2.3M pages, this process
+takes aprox 1:30 hours
+
+3) Make a selection of pages:
+
+To create a selection of pages to be included in the wikipedia activity,
+you need create two files: favorites.txt and blacklist.txt
+The two files are a list of titles of pages.
+
+The criteria used to select the pages is: all the pages in favorites.txt
+will be included and all the pages linked from this pages too, except the pages
+in the file blacklist.txt
+
+Our wikipedia activity have a static index page (static/index*.html)
+and you can create your own index page.
+The favorites.txt have all the pages linked from the index page
+(in the case of spanish 130 pages) and 300 pages more selected from
+a list of most searched pages in wikipedia (http://stats.grok.se)
+
+There are not a linear relation between number of favorite pages and final
+number of pages selected, but as reference, you can use this numbers:
+
+ Favorites Total selected pages
+ 130 15788
+ 431 45105
+ 544 63347
+
+
+The files favorites.txt and blacklist.txt should be in the same directory
+than the .xml file
+
+To create the selection do:
+
+../tools2/make_selection.py
+
+After you have created the selection, you can look at the list of pages in the file
+pages_selected-level-1 and modify your favorites.txt and/or blacklist.txt
+files and rerun the process if you want modify the selection.
+
+3) Create the index
+
+../tools2/create_index.py
+
+This process is faster and when finished you can do a basic test:
+
+../tools2/test_index.py page_title
+
+and this will show you the content in wiki format of the selected page.
+At this stage, the process will be slow, because need to search for every template
+and do all the templates substitutions.
+To have faster results we will apply templates substitutions in all the pages.
+
+4) Optimze the data and download images:
+
+To expand the templates need go out of the data directory:
+
+cd ..
+
+./tools2/expandtemplates.py es_new/eswiki-20111112-pages-articles.xml > es_new/eswiki-20111112-pages-articles.xml.processed
+
+If you want include images in your wikipedia activity can go again to your data directory and do:
+
+cd es_lat
+../tools2/download_images.py
+
+This command will download the images included in the pages in favorites.txt
+If you want include the images in all the pages, should do:
+
+../tools2/download_images.py --all
+
+A option --cache_dir=directory is available if you have images already downloaded
+in another directory to acelerate the process.
+
+
+5) Create your new activity:
+
diff --git a/tools2/blacklist.txt b/tools2/blacklist.txt
new file mode 100644
index 0000000..9139b2b
--- /dev/null
+++ b/tools2/blacklist.txt
@@ -0,0 +1,20 @@
+Penetración_anal
+Felación
+Orgía
+Juguete_sexual
+Sexo_anal
+Sexo_oral
+Perversión_sexual
+Parafilia
+Prostitución
+Prostituta
+Desnudo
+Fotografía_glamour
+Erotismo
+Erótica
+Sadomasoquismo
+Pene
+Incesto
+Masturbacion
+Relaciones_sexuales
+Eyaculación
diff --git a/tools2/clean_selection.py b/tools2/clean_selection.py
new file mode 100755
index 0000000..d58327d
--- /dev/null
+++ b/tools2/clean_selection.py
@@ -0,0 +1,83 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# This utility takes a already processed articles
+# and create a new file with part of these articles based in
+# ignoring the articles in a list
+
+import codecs
+import os
+import config
+from make_selection import FileListReader, RedirectParser, RedirectsUsedWriter
+from make_selection import CountedTemplatesReader
+if __name__ == '__main__':
+
+ input_xml_file_name = config.input_xml_file_name
+
+ print "Loading low rank pages"
+ ignored_pages_reader = FileListReader('%s.low_rank_pages' %
+ input_xml_file_name)
+
+ processed_file = open("%s.processed" % input_xml_file_name, mode='r')
+ output_file = open("%s.processed_filtered" % input_xml_file_name, mode='w')
+
+
+ data_line = processed_file.readline()
+ while data_line:
+ #print data_line
+ if len(data_line) == 2:
+ if ord(data_line[0]) == 1:
+ title = processed_file.readline()
+ # read article size
+ # size
+ size_line = processed_file.readline()
+ # \02
+ data_line = processed_file.readline()
+ title = title[0:-1].strip().capitalize()
+ if title not in ignored_pages_reader.list:
+
+ # \01
+ output_file.write('\01\n')
+ output_file.write('%s\n' % title)
+ # size
+ output_file.write('%s\n' % size_line)
+ # \02
+ output_file.write('\02\n')
+ finish = False
+ while not finish:
+ line = processed_file.readline()
+ output_file.write('%s\n' % line)
+ if len(line) == 2:
+ if ord(line[0]) == 3:
+ output_file.write('\03\n')
+ finish = True
+ break
+ else:
+ print "* Ignored %s " % title
+
+ data_line = processed_file.readline()
+
+ output_file.close()
+
+ # clean redirects used
+ print "Loading redirects used "
+ redirect_checker = RedirectParser(input_xml_file_name,
+ postfix='redirects_used')
+
+ print "Loading selected pages"
+ selected_pages_reader = FileListReader('%s.pages_selected-level-1' %
+ input_xml_file_name)
+
+ print "Cleaning selected pages list"
+ # clean selected_pages_reader list
+ filtered_list = []
+ for article in selected_pages_reader.list:
+ if article not in ignored_pages_reader.list:
+ filtered_list.append(article)
+
+ print "Loading templates used"
+ templates_used_reader = CountedTemplatesReader(input_xml_file_name)
+
+ print "Writing redirects used filtered"
+ redirect_writer = RedirectsUsedWriter(input_xml_file_name, filtered_list,
+ templates_used_reader.templates,
+ redirect_checker, postfix='redirects_used_filtered')
diff --git a/tools2/config.py b/tools2/config.py
new file mode 100644
index 0000000..c2c0300
--- /dev/null
+++ b/tools2/config.py
@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# These configuration params are used in the process to create
+# a new wikipedia activity
+
+input_xml_file_name = './enwiki-20111201-pages-articles.xml'
+favorites_file_name = './favorites_en.txt'
+blacklist_file_name = './blacklist_en.txt'
+
+REDIRECT_TAGS = [u'#REDIRECT']
+
+BLACKLISTED_NAMESPACES = ['WIKIPEDIA:', 'MEDIAWIKI:']
+
+TEMPLATE_NAMESPACES = ['Template:']
+
+LINKS_NAMESPACES = ['Category']
+
+FILE_TAG = 'File:'
+
+MAX_IMAGE_SIZE = 300
+
+# This part should not be changed
+import platform
+
+system_id = "%s%s" % (platform.system().lower(),
+ platform.architecture()[0][0:2])
+if platform.processor().startswith('arm'):
+ system_id = platform.processor()
diff --git a/tools2/config_en.py b/tools2/config_en.py
new file mode 100644
index 0000000..c2c0300
--- /dev/null
+++ b/tools2/config_en.py
@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# These configuration params are used in the process to create
+# a new wikipedia activity
+
+input_xml_file_name = './enwiki-20111201-pages-articles.xml'
+favorites_file_name = './favorites_en.txt'
+blacklist_file_name = './blacklist_en.txt'
+
+REDIRECT_TAGS = [u'#REDIRECT']
+
+BLACKLISTED_NAMESPACES = ['WIKIPEDIA:', 'MEDIAWIKI:']
+
+TEMPLATE_NAMESPACES = ['Template:']
+
+LINKS_NAMESPACES = ['Category']
+
+FILE_TAG = 'File:'
+
+MAX_IMAGE_SIZE = 300
+
+# This part should not be changed
+import platform
+
+system_id = "%s%s" % (platform.system().lower(),
+ platform.architecture()[0][0:2])
+if platform.processor().startswith('arm'):
+ system_id = platform.processor()
diff --git a/tools2/config_en_simple.py b/tools2/config_en_simple.py
new file mode 100644
index 0000000..fe501d0
--- /dev/null
+++ b/tools2/config_en_simple.py
@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# These configuration params are used in the process to create
+# a new wikipedia activity
+
+input_xml_file_name = './simplewiki-20120112-pages-articles.xml'
+favorites_file_name = './favorites_en.txt'
+blacklist_file_name = './blacklist_en.txt'
+
+REDIRECT_TAGS = [u'#REDIRECT']
+
+BLACKLISTED_NAMESPACES = ['WIKIPEDIA:', 'MEDIAWIKI:']
+
+TEMPLATE_NAMESPACES = ['Template:']
+
+LINKS_NAMESPACES = ['Category']
+
+FILE_TAG = 'File:'
+
+MAX_IMAGE_SIZE = 300
+
+# This part should not be changed
+import platform
+
+system_id = "%s%s" % (platform.system().lower(),
+ platform.architecture()[0][0:2])
+if platform.processor().startswith('arm'):
+ system_id = platform.processor()
diff --git a/tools2/config_es.py b/tools2/config_es.py
new file mode 100644
index 0000000..aaddd14
--- /dev/null
+++ b/tools2/config_es.py
@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# These configuration params are used in the process to create
+# a new wikipedia activity
+
+input_xml_file_name = './eswiki-20111112-pages-articles.xml'
+favorites_file_name = './favorites_es.txt'
+blacklist_file_name = './blacklist_es.txt'
+
+REDIRECT_TAGS = [u'#REDIRECT', u'#REDIRECCIÓN']
+
+BLACKLISTED_NAMESPACES = ['WIKIPEDIA:', 'MEDIAWIKI:']
+
+TEMPLATE_NAMESPACES = ['Plantilla:']
+
+LINKS_NAMESPACES = [u'Categoría']
+
+FILE_TAG = 'Archivo:'
+
+MAX_IMAGE_SIZE = 300
+
+# This part should not be changed
+import platform
+
+system_id = "%s%s" % (platform.system().lower(),
+ platform.architecture()[0][0:2])
+if platform.processor().startswith('arm'):
+ system_id = platform.processor()
diff --git a/tools2/config_fr.py b/tools2/config_fr.py
new file mode 100644
index 0000000..52b4cb4
--- /dev/null
+++ b/tools2/config_fr.py
@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# These configuration params are used in the process to create
+# a new wikipedia activity
+
+input_xml_file_name = './frwiki-20111231-pages-articles.xml'
+favorites_file_name = './favorites_fr.txt'
+blacklist_file_name = './blacklist_fr.txt'
+
+REDIRECT_TAGS = [u'#REDIRECT']
+
+BLACKLISTED_NAMESPACES = [u'WIKIPÉDIA:', 'MEDIAWIKI:']
+
+TEMPLATE_NAMESPACES = [u'Modèle:']
+
+LINKS_NAMESPACES = [u'Catégorie']
+
+FILE_TAG = 'Fichier:'
+
+MAX_IMAGE_SIZE = 300
+
+# This part should not be changed
+import platform
+
+system_id = "%s%s" % (platform.system().lower(),
+ platform.architecture()[0][0:2])
+if platform.processor().startswith('arm'):
+ system_id = platform.processor()
diff --git a/tools2/config_gn.py b/tools2/config_gn.py
new file mode 100644
index 0000000..2a59ac0
--- /dev/null
+++ b/tools2/config_gn.py
@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# These configuration params are used in the process to create
+# a new wikipedia activity
+
+input_xml_file_name = './gnwiki-20120220-pages-articles.xml'
+favorites_file_name = './favorites_en.txt'
+blacklist_file_name = './blacklist_en.txt'
+
+REDIRECT_TAGS = [u'#REDIRECT', u'#REDIRECCIÓN']
+
+BLACKLISTED_NAMESPACES = ['WIKIPEDIA:', 'MEDIAWIKI:']
+
+TEMPLATE_NAMESPACES = [u'Tembiecharã:', u'Puruhára:']
+
+LINKS_NAMESPACES = [u'Ñemohenda']
+
+FILE_TAG = 'File:'
+
+MAX_IMAGE_SIZE = 300
+
+# This part should not be changed
+import platform
+
+system_id = "%s%s" % (platform.system().lower(),
+ platform.architecture()[0][0:2])
+if platform.processor().startswith('arm'):
+ system_id = platform.processor()
diff --git a/tools2/config_pl.py b/tools2/config_pl.py
new file mode 100644
index 0000000..e9e0a25
--- /dev/null
+++ b/tools2/config_pl.py
@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# These configuration params are used in the process to create
+# a new wikipedia activity
+
+input_xml_file_name = './plwiki-20111227-pages-articles.xml'
+favorites_file_name = './favorites_pl.txt'
+blacklist_file_name = './blacklist_pl.txt'
+
+REDIRECT_TAGS = [u'#REDIRECT', u'#REDIRECCIÓN']
+
+BLACKLISTED_NAMESPACES = ['WIKIPEDIA:', 'MEDIAWIKI:']
+
+TEMPLATE_NAMESPACES = ['Szablon:']
+
+LINKS_NAMESPACES = [u'Kategoria']
+
+FILE_TAG = 'Plik:'
+
+MAX_IMAGE_SIZE = 300
+
+# This part should not be changed
+import platform
+
+system_id = "%s%s" % (platform.system().lower(),
+ platform.architecture()[0][0:2])
+if platform.processor().startswith('arm'):
+ system_id = platform.processor()
diff --git a/tools2/config_qu.py b/tools2/config_qu.py
new file mode 100644
index 0000000..fc66cf7
--- /dev/null
+++ b/tools2/config_qu.py
@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# These configuration params are used in the process to create
+# a new wikipedia activity
+
+input_xml_file_name = './quwiki-20111228-pages-articles.xml'
+favorites_file_name = 'favorites_qu.txt'
+blacklist_file_name = './blacklist_qu.txt'
+
+REDIRECT_TAGS = [u'#REDIRECT', u'#REDIRECCIÓN']
+
+BLACKLISTED_NAMESPACES = ['WIKIPEDIA:', 'MEDIAWIKI:']
+
+TEMPLATE_NAMESPACES = ['Plantilla:']
+
+LINKS_NAMESPACES = [u'Categoría']
+
+FILE_TAG = 'Rikcha:'
+
+MAX_IMAGE_SIZE = 300
+
+# This part should not be changed
+import platform
+
+system_id = "%s%s" % (platform.system().lower(),
+ platform.architecture()[0][0:2])
+if platform.processor().startswith('arm'):
+ system_id = platform.processor()
diff --git a/tools2/config_rw.py b/tools2/config_rw.py
new file mode 100644
index 0000000..da53c12
--- /dev/null
+++ b/tools2/config_rw.py
@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# These configuration params are used in the process to create
+# a new wikipedia activity
+
+input_xml_file_name = './rwwiki-20120127-pages-articles.xml'
+favorites_file_name = './favorites_en.txt'
+blacklist_file_name = './blacklist_en.txt'
+
+REDIRECT_TAGS = [u'#REDIRECT']
+
+BLACKLISTED_NAMESPACES = ['WIKIPEDIA:', 'MEDIAWIKI:']
+
+TEMPLATE_NAMESPACES = ['Template:']
+
+LINKS_NAMESPACES = ['Category']
+
+FILE_TAG = 'File:'
+
+MAX_IMAGE_SIZE = 300
+
+# This part should not be changed
+import platform
+
+system_id = "%s%s" % (platform.system().lower(),
+ platform.architecture()[0][0:2])
+if platform.processor().startswith('arm'):
+ system_id = platform.processor()
diff --git a/tools2/create_index.py b/tools2/create_index.py
new file mode 100755
index 0000000..51550b8
--- /dev/null
+++ b/tools2/create_index.py
@@ -0,0 +1,210 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# create index
+# use https://bitbucket.org/james_taylor/seek-bzip2
+
+import codecs
+import os
+import sys
+from subprocess import call, Popen, PIPE, STDOUT
+import shutil
+import re
+import logging
+import config
+
+input_xml_file_name = config.input_xml_file_name
+
+
+def normalize_title(title):
+ return title.strip().replace(' ', '_').capitalize()
+
+
+def create_index(pages_blacklist):
+ output_file = open("%s.processed.idx" % input_xml_file_name, mode='w')
+ num_block = 1
+ index_file = open("%s.processed.bz2t" % input_xml_file_name, mode='r')
+ index_line = index_file.readline()
+ while index_line:
+ parts = index_line.split()
+ block_start = int(parts[0])
+ print "Block %d starts at %d" % (num_block, block_start)
+ position = 0
+ # extract the block
+ bzip_file = open("%s.processed.bz2" % input_xml_file_name, mode='r')
+ cmd = ['../bin/%s/seek-bunzip' % config.system_id, str(block_start)]
+ p = Popen(cmd, stdin=bzip_file, stdout=PIPE, stderr=STDOUT,
+ close_fds=True)
+ data_line = p.stdout.readline()
+ while data_line:
+ position += len(data_line)
+ #print data_line
+ if len(data_line) == 2:
+ if ord(data_line[0]) == 1:
+ title = p.stdout.readline()
+ position += len(title)
+ # read article size
+ # size
+ size_line = p.stdout.readline()
+ position += len(size_line)
+ # \02
+ data_line = p.stdout.readline()
+ position += len(data_line)
+ title = title[0:-1].strip().capitalize()
+ if title not in pages_blacklist:
+ output_file.write("%s %d %d\n" % \
+ (title, num_block, position))
+ print "Article %s block %d position %d" % \
+ (title, num_block, position)
+ else:
+ print "* Blacklisted %s " % title
+
+ data_line = p.stdout.readline()
+
+ num_block += 1
+ index_line = index_file.readline()
+
+ output_file.close()
+
+
+class FileListReader():
+
+ def __init__(self, file_name):
+ _file = codecs.open(file_name,
+ encoding='utf-8', mode='r')
+ self.list = []
+ line = _file.readline()
+ while line:
+ self.list.append(normalize_title(line))
+ line = _file.readline()
+
+
+class RedirectParser:
+
+ def __init__(self, file_name):
+ self.link_re = re.compile('\[\[.*?\]\]')
+ # Load redirects
+ input_redirects = codecs.open('%s.redirects_used' % file_name,
+ encoding='utf-8', mode='r')
+
+ self.redirects = {}
+ for line in input_redirects.readlines():
+ links = self.link_re.findall(unicode(line))
+ if len(links) == 2:
+ origin = links[0][2:-2]
+ destination = links[1][2:-2]
+ self.redirects[origin] = destination
+ #print "Processing %s" % normalize_title(origin)
+ logging.error("Loaded %d redirects" % len(self.redirects))
+ input_redirects.close()
+
+
+def create_sql_index(input_xml_file_name, pages_blacklist):
+ import sqlite3
+ dbpath = './search.db'
+ if os.path.exists(dbpath):
+ return
+ print 'Creating sqlite database file'
+ conn = sqlite3.connect(dbpath)
+ conn.execute("create table articles(title, block INTEGER, " +
+ "position INTEGER, redirect_to)")
+
+ text_index_file = codecs.open("%s.processed.idx" % input_xml_file_name,
+ encoding='utf-8', mode='r')
+ line = text_index_file.readline()
+ while line:
+ parts = line.split()
+ if len(parts) > 0:
+ title_article = parts[0]
+ block_article = parts[1]
+ position_article = parts[2]
+ title_article = normalize_title(title_article)
+ if title_article not in pages_blacklist:
+ if title_article.find("'") > -1:
+ title_article = title_article.replace("'", "\\'")
+ if title_article.find('"') > -1:
+ title_article = title_article.replace('"', '')
+
+ command = 'insert into articles values ("%s", %s, %s, "%s")' \
+ % (unicode(title_article), int(block_article),
+ int(position_article), unicode(''))
+ print ".",
+ conn.execute(command)
+ else:
+ print "* Blacklisted %s " % title_article
+ line = text_index_file.readline()
+ conn.commit()
+ # add redirects
+ redirects_parser = RedirectParser(input_xml_file_name)
+ for origin in redirects_parser.redirects.keys():
+ origin = normalize_title(origin)
+ try:
+ destination = normalize_title(redirects_parser.redirects[origin])
+ if origin not in pages_blacklist and \
+ destination not in pages_blacklist:
+ if origin.find("'") > -1:
+ origin = origin.replace("'", "\\'")
+ if destination.find("'") > -1:
+ destination = destination.replace("'", "\\'")
+ print ".",
+ conn.execute(
+ 'insert into articles values ("%s", %s, %s, "%s")' %
+ (unicode(origin), 0, 0, unicode(destination)))
+ else:
+ print "* Blacklisted %s " % origin
+ except:
+ print "ERROR: origin %s destination %s" % (origin, destination)
+ text_index_file.close()
+ conn.commit()
+
+
+def create_bzip_table():
+ """
+ ../seek-bzip2/seek-bzip2/bzip-table <
+ eswiki-20110810-pages-articles.xml.processed.bz2 >
+ eswiki-20110810-pages-articles.xml.processed.bz2t
+ """
+ cmd = ['../bin/%s/bzip-table' % config.system_id]
+ bzip_file = open('%s.processed.bz2' % input_xml_file_name, mode='r')
+ table_file = open('%s.processed.bz2t' % input_xml_file_name, mode='w')
+ call(cmd, stdin=bzip_file, stdout=table_file, close_fds=True)
+
+if len(sys.argv) > 1:
+ if sys.argv[1] == '--delete_old':
+ if os.path.exists('%s.processed.bz2' % input_xml_file_name):
+ os.remove('%s.processed.bz2' % input_xml_file_name)
+ if os.path.exists('%s.processed.bz2t' % input_xml_file_name):
+ os.remove('%s.processed.bz2t' % input_xml_file_name)
+ if os.path.exists('%s.processed.idx' % input_xml_file_name):
+ os.remove('%s.processed.idx' % input_xml_file_name)
+ if os.path.exists('search.db'):
+ os.remove('search.db')
+
+if os.path.exists(config.blacklist_file_name):
+ pages_blacklisted_reader = FileListReader(config.blacklist_file_name)
+ pages_blacklist = pages_blacklisted_reader.list
+ print "Loaded %d blacklisted pages" % len(pages_blacklist)
+else:
+ pages_blacklist = []
+
+print 'Compressing .processed file'
+if not os.path.exists('%s.processed.bz2' % input_xml_file_name):
+ cmd = ['bzip2', '-zk', '%s.processed' % input_xml_file_name]
+ p = call(cmd)
+ if os.path.exists('%s.processed.bz2t' % input_xml_file_name):
+ os.remove('%s.processed.bz2t' % input_xml_file_name)
+else:
+ print '.bz2 already exists. Skipping'
+
+if not os.path.exists('%s.processed.bz2t' % input_xml_file_name):
+ print 'Creating bzip2 table file'
+ create_bzip_table()
+else:
+ print '.bz2t already exists. Skipping'
+
+if not os.path.exists('%s.processed.idx' % input_xml_file_name):
+ print 'Creating index file'
+ create_index(pages_blacklist)
+else:
+ print '.idx already exists. Skipping'
+
+create_sql_index(input_xml_file_name, pages_blacklist)
diff --git a/tools2/create_low_rank_pages.py b/tools2/create_low_rank_pages.py
new file mode 100755
index 0000000..2227e99
--- /dev/null
+++ b/tools2/create_low_rank_pages.py
@@ -0,0 +1,44 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Create a file with a list of pages with less than N links pointing to them.
+# By default N=5 but can be configured with the param --min_cant_links
+
+import codecs
+import sys
+from make_selection import FileListReader
+import config
+
+if __name__ == '__main__':
+
+ input_xml_file_name = config.input_xml_file_name
+
+ min_cant_links = 5
+ if len(sys.argv) > 1:
+ if sys.argv[1] == '--min_cant_links':
+ min_cant_links = int(sys.argv[2])
+
+ print "Adding articles with less than %d links" % min_cant_links
+
+ # Read favorites list
+ favorites_reader = FileListReader(config.favorites_file_name)
+
+ ranking_file = codecs.open('%s.links_counted' % input_xml_file_name,
+ encoding='utf-8', mode='r')
+
+ print "Writing low_rank_pages file"
+ output_file = codecs.open('%s.low_rank_pages' % input_xml_file_name,
+ encoding='utf-8', mode='w')
+
+ line = ranking_file.readline()
+ while line:
+ parts = line.split()
+ article = parts[0]
+ cant_links = int(parts[1])
+ if cant_links < min_cant_links and \
+ article not in favorites_reader.list:
+ output_file.write('%s\n' % article)
+
+ line = ranking_file.readline()
+
+ output_file.close()
+ ranking_file.close()
diff --git a/tools2/download_images.py b/tools2/download_images.py
new file mode 100755
index 0000000..532f6e5
--- /dev/null
+++ b/tools2/download_images.py
@@ -0,0 +1,140 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Create a list of pages with a nuber of how many links are directed to them.
+
+import codecs
+import re
+import md5
+from urllib import FancyURLopener
+import os
+import sys
+import shutil
+import magic
+
+import config
+
+
+class FileListReader():
+
+ def __init__(self, file_name):
+ _file = open(file_name, mode='r')
+ self.list = []
+ line = _file.readline()
+ while line:
+ self.list.append(line.strip())
+ line = _file.readline()
+
+
+class CustomUrlOpener(FancyURLopener):
+
+ version = 'Mozilla/5.0 (X11; Linux x86_64; rv:9.0) Gecko/20100101 ' + \
+ 'Firefox/9.0'
+
+
+class ImagesDownloader:
+
+ def __init__(self, file_name, pages_selected, base_dir, cache_dir, lang):
+ self.base_dir = base_dir
+ self.cache_dir = cache_dir
+ self.mime_checker = magic.open(magic.MAGIC_MIME)
+ self.mime_checker.load()
+ input_links = open('%s.page_images' % file_name, mode='r')
+ line = input_links.readline()
+ while line:
+ words = line.split()
+ page = words[0]
+ if pages_selected is None or (page in pages_selected):
+ print "Processing page %s \r" % page,
+ for n in range(1, len(words)):
+ image_url = words[n]
+ self.download_image(image_url, lang)
+
+ line = input_links.readline()
+ input_links.close()
+
+ def download_image(self, url, lang, dest=None):
+ # avoid downloading .ogg files
+ if url.lower().endswith('.ogg'):
+ return
+ overwrite = True
+ if dest is None:
+ overwrite = False
+ sliced_url = url.split('thumb/')
+ image_part = sliced_url[1]
+ dirs = image_part.split('/')
+ destdir = "%s/%s/%s" % (self.base_dir, dirs[0], dirs[1])
+ image_name = dirs[len(dirs) - 1]
+ try:
+ os.makedirs(destdir)
+ except:
+ pass # This just means that destdir already exists
+ dest = "%s/%s" % (destdir, image_name)
+ if not os.path.exists(dest) or overwrite:
+ if self.cache_dir is not None and not overwrite:
+ # Verify if the file is in the cahce_dir
+ cache_file = "%s/%s/%s/%s" % (self.cache_dir, dirs[0], dirs[1],
+ image_name)
+ if os.path.exists(cache_file):
+ shutil.copyfile(cache_file, dest)
+ return
+ print "Downloading %s" % url
+ opener = CustomUrlOpener()
+ opener.retrieve(url, dest)
+ # Verify the mime type
+ # wikipedia return a html file with a error, if the size requested
+ # is small than the real image
+ # then if the file is a html we need request the unescaled image
+ if url.find('/thumb/')> -1:
+ mime_type = str(self.mime_checker.file(dest))
+ if mime_type.find('text') > -1:
+ url_ori = url
+ url = url[0:url.rfind('/')]
+ url = url.replace('thumb/', '')
+ print 'Wrong mime type, redownloading %s to %s' % (url, dest)
+ self.download_image(url, lang, dest)
+ mime_type = str(self.mime_checker.file(dest))
+ if mime_type.find('text') > -1:
+ # try downloading from the lang instead of commons
+ if url_ori.find('commons') > -1:
+ url_lang = url_ori.replace('commons', lang)
+ self.download_image(url_lang, lang, dest)
+
+ mime_type = str(self.mime_checker.file(dest))
+ if mime_type.find('text') > -1:
+ # if the file downloaded is html/text remove it
+ os.remove(dest)
+
+
+downlad_all = False
+cache_dir = None
+if len(sys.argv) > 1:
+ for argn in range(1, len(sys.argv)):
+ arg = sys.argv[argn]
+ if arg == '--all':
+ downlad_all = True
+ print "Downloading all images"
+ if arg.startswith('--cache_dir='):
+ cache_dir = arg[arg.find('=') + 1:]
+ print "Using cache directory", cache_dir
+
+input_xml_file_name = config.input_xml_file_name
+
+# TODO: take the lang from the first two letters
+# in the xml file, but this is not the best, because does not works
+# ever (example simplewiki)
+lang = input_xml_file_name
+if lang.find('/'):
+ lang = lang[lang.find('/') + 1:]
+lang = lang[:2]
+
+print 'Lang: %s' % lang
+
+selected_pages = None
+if not downlad_all:
+ print "Loading selected pages"
+ favorites_reader = FileListReader(config.favorites_file_name)
+ selected_pages = favorites_reader.list
+
+print "Downloading images"
+templates_counter = ImagesDownloader(input_xml_file_name,
+ selected_pages, "./images", cache_dir, lang)
diff --git a/tools2/expandtemplates.py b/tools2/expandtemplates.py
new file mode 100755
index 0000000..db30b0b
--- /dev/null
+++ b/tools2/expandtemplates.py
@@ -0,0 +1,134 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2007, One Laptop Per Child
+#
+# License: GPLv2
+#
+# Usage:
+# ./tools2/expandtemplates.py directory 2>expand.log
+# Ex:
+# ./tools2/expandtemplates.py es_lat
+
+import sys
+reload(sys)
+# Important! We'll be using stdout and stderr with
+# UTF-8 chars. Without this, errors galore.
+sys.setdefaultencoding('utf-8')
+
+sys.path.append('.')
+
+import os
+import re
+import codecs
+from server import WPWikiDB
+from make_selection import FileListReader
+
+START_HEADING = chr(1)
+START_TEXT = chr(2)
+END_TEXT = chr(3)
+
+import config
+
+# __main__
+
+only_page = None
+start_at = None
+stdout = False
+
+if len(sys.argv) > 1:
+ directory = sys.argv[1]
+
+ for argn in range(1, len(sys.argv)):
+ arg = sys.argv[argn]
+ if arg.startswith('--only='):
+ only_page = arg[len('--only='):]
+ print "Processing only article '%s'" % only_page
+ if arg.startswith('--start_at='):
+ start_at = arg[len('--start_at='):]
+ print "Starting to process at article '%s'" % start_at
+ if arg == '--stdout':
+ stdout = True
+ print "Writing output to stdout"
+
+else:
+ print "Use expandtemplates.py directory"
+ exit()
+
+
+xml_file_name = config.input_xml_file_name
+if xml_file_name.find('/') > -1:
+ xml_file_name = xml_file_name[xml_file_name.find('/') + 1:]
+path = os.path.join(directory, xml_file_name)
+
+articles_list = []
+if only_page is not None:
+ articles_list = [unicode(only_page)]
+else:
+ articles_reader = FileListReader('%s.pages_selected-level-1' % path)
+
+ articles_list = articles_reader.list
+ if start_at is not None:
+ filtered_list = []
+ found = False
+ for title in articles_list:
+ if title == start_at:
+ found = True
+ if found:
+ filtered_list.append(title)
+ articles_list = filtered_list
+
+lang = os.path.basename(path)[0:2]
+
+templateprefix = config.TEMPLATE_NAMESPACES[0]
+
+# load blacklist only once
+templateblacklist = set()
+templateblacklistpath = os.path.join(os.path.dirname(path),
+ 'template_blacklist')
+if os.path.exists(templateblacklistpath):
+ with open(templateblacklistpath, 'r') as f:
+ for line in f.readlines():
+ templateblacklist.add(line.rstrip().decode('utf8'))
+
+wikidb = WPWikiDB(path, lang, templateprefix, templateblacklist)
+rx = re.compile('(' + templateprefix + '|Wikipedia:)')
+
+if not stdout:
+ file_mode = 'w'
+ if os.path.exists('%s.processed_expanded' % path):
+ file_mode = 'a'
+
+ _output = codecs.open('%s.processed_expanded' % path,
+ encoding='utf-8', mode=file_mode)
+else:
+ _output = sys.stdout
+
+for title in articles_list:
+ if title.find('#') > -1:
+ if title.find('#') == 0:
+ continue
+ else:
+ title = title[:title.find('#')]
+
+ if rx.match(title):
+ sys.stderr.write('SKIPPING: ' + title + "\n")
+ continue
+
+ sys.stderr.write('PROCESSING: ' + title + "\n")
+
+ article_text = wikidb.getExpandedArticle(title)
+ if article_text == None:
+ sys.stderr.write('ERROR - SKIPPING: ' + title + "\n")
+ continue
+
+ _output.write(START_HEADING + '\n')
+ _output.write(title + '\n')
+ # in Python 2.x, len() over a unicode string
+ # gives us the bytecount. Not compat w Python 3.
+ _output.write("%s\n" % len(article_text))
+ _output.write(START_TEXT + '\n')
+ _output.write(article_text + '\n')
+ _output.write(END_TEXT + '\n')
+
+_output.close()
diff --git a/tools2/favorites.txt b/tools2/favorites.txt
new file mode 100644
index 0000000..751036f
--- /dev/null
+++ b/tools2/favorites.txt
@@ -0,0 +1,431 @@
+Acero
+Acrópolis
+Adicción
+Adjetivo
+Adolescencia
+Adverbio
+Africa
+Agricultura
+Agua
+Ajedrez
+Alcohol
+Alcoholismo
+Alemania
+Alfabeto
+Algoritmo
+Alimentación
+Alimento
+Aluminio
+América
+América_del_Norte
+América_del_Sur
+América_Latina
+Aminoácido
+Amistad
+Amor
+Anarquismo
+Anatomía
+Anemia
+Ãngulo
+Animalia
+Anorexia
+Antártida
+Antigua_Grecia
+Antiguo_Egipto
+Antropología
+Aparato_circulatorio
+Aparato_digestivo
+Aparato_reproductor_femenino
+Aparato_reproductor_masculino
+Aparato_respiratorio
+Aprendizaje
+Ãrea
+Argentina
+Aritmética
+Arqueología
+Arquitectura
+Arte
+Arte_Visual
+Asia
+Astronomía
+Atletismo
+Ãtomo
+Australia
+Autismo
+Autoestima
+Automóvil
+Aves
+Avión
+Bacteria
+Baloncesto
+Balonmano
+Barco
+Barroco
+Base_de_datos
+Béisbol
+Biblia
+Biodiversidad
+Biología
+Bioma
+Biotecnología
+Bolivia
+Brasil
+Budismo
+Bulimia
+Calentamiento_global
+Calor
+Cambio_climático
+Canadá
+Cáncer
+Cáncer_de_mama
+Capitalismo
+Carbono
+Célula
+Cerebro
+Chile
+Chocolate
+Ciencia
+Ciencias_Sociales
+Cine
+Circunferencia
+Ciudad
+Clima
+Cobre
+Cocaína
+Cólera
+Colombia
+Color
+Combustible
+Comercio
+Computadora
+Comunicación
+Comunidad
+Comunismo
+Concentración
+Constitución
+Contaminación
+Continente
+Corazón
+Costa_Rica
+Cristianismo
+Cristóbal_Colón
+Cromosoma
+Cuba
+Cuento
+Cultura
+Cultura_maya
+Danza
+Debate
+Declaración_Universal_de_los_Derechos_Humanos
+Democracia
+Dengue
+Densidad
+Deporte
+Derecho
+Derechos_del_niño
+Derechos_Humanos
+Desarrollo_sostenible
+Desastre natural
+Descubrimiento_de_América
+Desierto
+Día_Mundial_de_la_Lucha_contra_el_Sida
+Diccionario
+Dinero
+Discriminación
+Dislexia
+División_(matemática)
+Eclipse
+Ecología
+Economía
+Ecosistema
+Ecuación
+Ecuador
+Edad_Media
+Educación
+Educación_física
+Efecto_invernadero
+Egipto
+Electricidad
+Electrónica
+Elipse
+Embarazo
+Emoción
+Energía
+Energía_cinética
+Energía_eléctrica
+Energía_eólica
+Energía_nuclear
+Energía_potencial
+Energía_renovable
+Energía_solar
+Escultura
+España
+Estadística
+Estado
+Estados_Unidos
+Estrella
+Ética
+Europa
+Evolución_biológica
+Evolución_humana
+Factorización
+Familia
+Feudalismo
+Filosofía
+Física
+Flor
+Fotosíntesis
+Fracción
+Fuego
+Fuerza
+Función_matemática
+Fútbol
+Género_literario
+Genética
+Geografía
+Geología
+Geometría
+Globalización
+Gobierno
+Gravedad
+Grecia
+Gripe
+Grupo_sanguíneo
+Guatemala
+Guitarra
+Haití
+Hardware
+Hidrógeno
+Hierro
+Hígado
+Historia
+Historia_universal
+Holocausto
+Homo_sapiens
+Homosexualidad
+Honduras
+Hormona
+Huella_ecológica
+Humanidades
+Humanismo
+Humor
+Identidades_trigonométricas
+Idioma_español
+Idioma_inglés
+Ilustración
+Imperio_romano
+Indumentaria
+Infecciones_de_transmisión_sexual
+Inflación
+Informática
+Ingeniería
+Internet
+Introducción
+Islam
+Judaísmo
+Juego
+Juegos_Olímpicos
+Justicia
+Las_Nuevas_Siete_Maravillas_del_Mundo_Moderno
+Lenguaje
+Lenguas_de_México
+Ley_de_Ohm
+Leyenda
+Leyes_de_Mendel
+Leyes_de_Newton
+Liberalismo
+Libertad
+Liderazgo
+Literatura
+Lluvia_ácida
+Logaritmo
+Lógica
+Luna
+Luz
+Machu_Picchu
+Magnetismo
+Mapa
+Mapa_conceptual
+Marea
+Marxismo
+Masa
+Matemática
+Materia
+Matrimonio
+Medicina
+Medición
+Medio_ambiente
+Medio_de_comunicación
+Menstruación
+Mesopotamia
+Metabolismo
+Metáfora
+Metal
+Meteorología
+Método_anticonceptivo
+Método_científico
+México
+Mezcla
+Microprocesador
+Mineral
+Mito
+Mitología
+Mitología_griega
+Mitosis
+Monopolio
+Moral
+Movimiento
+Muerte
+Multiplicación
+Música
+Natación
+Naturaleza
+Neoclasicismo
+Neoliberalismo
+Neumonía
+Novela
+Número
+Número_áureo
+Número_primo
+Nutrición
+Obesidad
+Oceanía
+Océano
+Organización_de_las_Naciones_Unidas
+Origen_de_la_vida
+Oro
+País
+Panamá
+Páncreas
+Parábola_(matemática)
+Paradigma
+Paraguay
+Perú
+Petróleo
+PH
+Placa_tectónica
+Planeta
+Plantae
+Plástico
+Platón
+Población
+Población_mundial
+Poesía
+Política
+Potencia
+Premio_Nobel
+Premio_Nobel_de_Literatura
+Preservativo
+Presión
+Presión_arterial
+Primera_Guerra_Mundial
+Producto_interior_bruto
+Prólogo
+Proteína
+Proyecto
+Psicoanálisis
+Psicología
+Publicidad
+Puerto_Rico
+Química
+Radio_(medio_de_comunicación)
+Reacción_química
+Reciclaje
+Recurso_natural
+Recursos_humanos
+Religión
+Renacimiento
+Reproducción
+República_Dominicana
+Resistencia_eléctrica
+Respeto
+Responsabilidad
+Resta
+Revolución_francesa
+Revolución_Industrial
+Revolución_mexicana
+Río_Amazonas
+Romanticismo
+Salud
+Sangre
+Segunda_Guerra_Mundial
+Selva
+Ser_vivo
+Sexo
+Sexualidad
+Sida
+Siete_maravillas_del_mundo
+Signo_de_puntuación
+Simón_Bolívar
+Síndrome_de_Asperger
+Síndrome_de_Down
+Sistema_binario
+Sistema_endocrino
+Sistema_Internacional_de_Unidades
+Sistema_nervioso
+Sistema_nervioso_central
+Sistema_operativo
+Sistema_Solar
+Socialismo
+Sociedad
+Sociología
+Software
+Software_libre
+Sol
+Solsticio
+Sonido
+Suelo
+Sueño
+Suma
+Surrealismo
+Sustantivo
+Tabaquismo
+Tabla_periódica_de_los_elementos
+Taekwondo
+Teatro
+Tecnología
+Telecomunicación
+Teléfono
+Televisión
+Temperatura
+Tenis
+Teorema_de_Pitágoras
+Teoría_del_Big_Bang
+Teotihuacan
+Termodinámica
+Terremoto
+Testigos_de_Jehová
+Tiempo
+Tierra
+Tipos_de_texto
+Trabajo_(física)
+Tradición
+Tren
+Triángulo
+Trigonometría
+Tuberculosis
+Turismo
+Unión_Europea
+Universo
+Uruguay
+Varicela
+Vector_(física)
+Velocidad
+Venezuela
+Verbo
+Vida
+VIH
+Villancico
+Vino
+Violencia
+Virus
+Virus_informático
+Vitamina
+Volcán
+Voleibol
+Volumen
+Wiki
+Wikipedia
+Wikipedia:Artículos_destacados
+World_Wide_Web
+Xenofobia
diff --git a/tools2/make_ranking.py b/tools2/make_ranking.py
new file mode 100755
index 0000000..ad67a92
--- /dev/null
+++ b/tools2/make_ranking.py
@@ -0,0 +1,62 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Create a list of pages with a nuber of how many links are directed to them.
+
+import codecs
+import re
+from operator import itemgetter
+from make_selection import RedirectParser, FileListReader
+import config
+
+class LinksCounter:
+
+ def __init__(self, file_name, redirects, selected_pages):
+ self.links_to_counter = {}
+ input_links = codecs.open('%s.links' % file_name,
+ encoding='utf-8', mode='r')
+ line = input_links.readline()
+ while line:
+ words = line.split()
+ if len(words) > 0:
+ page = words[0]
+ if page in selected_pages:
+ print "Processing page %s \r" % page,
+ for n in range(1, len(words) - 1):
+ link = words[n]
+ # check if is a redirect
+ try:
+ link = redirects[link]
+ except:
+ pass
+ if link in selected_pages:
+ try:
+ self.links_to_counter[link] += 1
+ except:
+ self.links_to_counter[link] = 0
+ line = input_links.readline()
+ input_links.close()
+
+
+input_xml_file_name = config.input_xml_file_name
+print "Loading redirects"
+redirect_parser = RedirectParser(input_xml_file_name)
+print "Processed %d redirects" % len(redirect_parser.redirects)
+
+print "Loading selected pages"
+selected_pages_reader = FileListReader('%s.pages_selected-level-1' %
+ input_xml_file_name)
+
+print "Processing links"
+links_counter = LinksCounter(input_xml_file_name, redirect_parser.redirects,
+ selected_pages_reader.list)
+
+print "Sorting counted links"
+items = links_counter.links_to_counter.items()
+items.sort(key = itemgetter(1), reverse=True)
+
+print "Writing links_counted file"
+output_file = codecs.open('%s.links_counted' % input_xml_file_name,
+ encoding='utf-8', mode='w')
+for n in range(len(items)):
+ output_file.write('%s %d\n' % (items[n][0], items[n][1]))
+output_file.close()
diff --git a/tools2/make_selection.py b/tools2/make_selection.py
new file mode 100755
index 0000000..4dd3a63
--- /dev/null
+++ b/tools2/make_selection.py
@@ -0,0 +1,522 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# take a list of pages
+# select a level default = 1
+# prepare a list of links in the pages from the original list
+# create a file with the titles of all the selected pages
+# create a file with the content of all the selected pages
+
+import codecs
+import re
+from xml.sax import make_parser, handler
+import os
+import sys
+from operator import itemgetter
+import config
+
+try:
+ from hashlib import md5
+except ImportError:
+ from md5 import md5
+
+
+def normalize_title(title):
+ return title.strip().replace(' ', '_').capitalize()
+
+
+class FileListReader():
+
+ def __init__(self, file_name):
+ _file = codecs.open(file_name,
+ encoding='utf-8', mode='r')
+ self.list = []
+ line = _file.readline()
+ while line:
+ self.list.append(normalize_title(line))
+ line = _file.readline()
+
+
+class RedirectParser:
+
+ def __init__(self, file_name, postfix='redirects'):
+ self.link_re = re.compile('\[\[.*?\]\]')
+ # Load redirects
+ input_redirects = codecs.open('%s.%s' % (file_name, postfix),
+ encoding='utf-8', mode='r')
+
+ self.redirects = {}
+ self.reversed_index = {}
+ count = 0
+ for line in input_redirects.readlines():
+ links = links = self.link_re.findall(unicode(line))
+ if len(links) == 2:
+ origin = links[0][2:-2]
+ destination = links[1][2:-2]
+ self.redirects[normalize_title(origin)] = \
+ normalize_title(destination)
+ # add to the reversed index
+ if destination in self.reversed_index:
+ self.reversed_index[destination].append(origin)
+ else:
+ self.reversed_index[destination] = [origin]
+
+ count += 1
+ #print "Processing %s" % normalize_title(origin)
+ input_redirects.close()
+
+ def get_redirected(self, article_title):
+ try:
+ article_title = article_title.capitalize()
+ redirect = self.redirects[article_title]
+ except:
+ redirect = None
+ return redirect
+
+
+class PagesLinksFilter():
+
+ def __init__(self, file_name, redirects_checker):
+ """
+ Read the list of pages from the .links file
+ """
+ self.pages = []
+ input_links = codecs.open('%s.links' % file_name,
+ encoding='utf-8', mode='r')
+ line = input_links.readline()
+ while line:
+ words = line.split()
+ if len(words) > 0:
+ page = words[0]
+ print "Adding page %s" % page
+ redirected = redirects_checker.get_redirected(page)
+ if redirected is not None:
+ page = redirected
+ if not page in self.pages:
+ self.pages.append(page)
+ line = input_links.readline()
+ input_links.close()
+
+
+class LinksFilter():
+
+ def __init__(self, file_name, redirects_checker, favorites):
+ self.links = []
+ input_links = codecs.open('%s.links' % file_name,
+ encoding='utf-8', mode='r')
+ line = input_links.readline()
+ while line:
+ words = line.split()
+ if len(words) > 0:
+ page = words[0]
+ #print "Processing page %s \r" % page,
+ if page in favorites:
+ print "Adding page %s" % page
+ for n in range(1, len(words) - 1):
+ link = words[n]
+ link = normalize_title(link)
+
+ if link.find('#') > -1:
+ # don't count links in the same page
+ if link.find('#') == 0:
+ continue
+ else:
+ # use only the article part of the link
+ link = link[:link.find('#')]
+
+ # check if is a redirect
+ redirected = redirects_checker.get_redirected(link)
+ if redirected is not None:
+ link = redirected
+
+ if not link in self.links and \
+ not link in favorites:
+ self.links.append(link)
+ line = input_links.readline()
+ input_links.close()
+
+
+class PagesProcessor(handler.ContentHandler):
+
+ def __init__(self, file_name, selected_pages_list, pages_blacklist):
+ handler.ContentHandler.__init__(self)
+ self._page_counter = 0
+ self._page = None
+ self._output = codecs.open('%s.processed' % file_name,
+ encoding='utf-8', mode='w')
+ self._output_page_images = codecs.open('%s.page_images' % file_name,
+ encoding='utf-8', mode='w')
+
+ self.image_re = re.compile('\[\[%s.*?\]\]' % config.FILE_TAG)
+ self._selected_pages_list = selected_pages_list
+ self._pages_blacklist = pages_blacklist
+
+ def startElement(self, name, attrs):
+ if name == "page":
+ self._page = {}
+ self._page_counter += 1
+ self._text = ""
+
+ def characters(self, content):
+ self._text = self._text + content
+
+ def _register_page(self, register, title, content):
+ register.write('\01\n')
+ register.write('%s\n' % normalize_title(title))
+ register.write('%d\n' % len(content))
+ register.write('\02\n')
+ register.write('%s\n' % content)
+ register.write('\03\n')
+
+ def _hashpath(self, name):
+ name = name.replace(' ', '_')
+ name = name[:1].upper() + name[1:]
+ d = md5(name.encode('utf-8')).hexdigest()
+ return "/".join([d[0], d[:2], name])
+
+ def _get_url_image(self, image_wiki):
+ """
+ [[Archivo:Johann Sebastian Bach.jpg|thumb|200px|right|[[J. S. Bach]]
+ """
+ # remove [[ and ]]
+ image_wiki = image_wiki[2:-2]
+ parts = image_wiki.split('|')
+
+ name = parts[0]
+ name = name[len(config.FILE_TAG):]
+
+ image_size = config.MAX_IMAGE_SIZE
+ # check if there are a size defined
+ for part in parts:
+ # this image sizes are copied from server.py
+ if part.strip() == 'thumb':
+ image_size = 180
+ break
+
+ if part.find('px') > -1:
+ try:
+ image_size = int(part[:part.find('px')])
+ except:
+ pass
+
+ hashed_name = unicode(self._hashpath(name)) # .encode('utf8')
+ url = 'http://upload.wikimedia.org/wikipedia/commons/thumb/' \
+ + hashed_name + ('/%dpx-' % image_size) + name.replace(' ', '_')
+ # the svg files are requested as png
+ if re.match(r'.*\.svg$', url, re.IGNORECASE):
+ url = url + '.png'
+ return url
+
+ def get_images(self, title):
+ # find images used in the pages
+ images = self.image_re.findall(unicode(self._page))
+ images_list = []
+ for image in images:
+ url = self._get_url_image(image)
+ # only add one time by page
+ if not url in images_list:
+ images_list.append(url)
+
+ if len(images_list) > 0:
+ self._output_page_images.write('%s ' % title)
+ for image in images_list:
+ self._output_page_images.write('%s ' % image)
+ self._output_page_images.write('\n')
+
+ def endElement(self, name):
+ if name == "title":
+ self._title = self._text
+ elif name == "text":
+ self._page = self._text
+ elif name == "page":
+
+ for namespace in config.BLACKLISTED_NAMESPACES:
+ if unicode(self._title).startswith(namespace):
+ return
+
+ title = normalize_title(self._title)
+
+ for namespace in config.TEMPLATE_NAMESPACES:
+ if unicode(self._title).startswith(namespace):
+ self.get_images(title)
+ return
+
+ for tag in config.REDIRECT_TAGS:
+ if unicode(self._page).startswith(tag):
+ return
+
+ if (title not in self._pages_blacklist) and \
+ (title in self._selected_pages_list):
+ print "%d Page '%s', length %d \r" % \
+ (self._page_counter, title, len(self._page)),
+ # processed
+ self._register_page(self._output, title, self._page)
+ self.get_images(title)
+
+ elif name == "mediawiki":
+ self._output.close()
+ self._output_page_images.close()
+ print "Processed %d pages." % self._page_counter
+
+
+class TemplatesCounter:
+
+ def __init__(self, file_name, pages_selected, redirect_checker):
+ self.templates_to_counter = {}
+ input_links = codecs.open('%s.page_templates' % file_name,
+ encoding='utf-8', mode='r')
+ line = input_links.readline()
+ while line:
+ words = line.split()
+ page = words[0]
+ if page in pages_selected:
+ print "Processing page %s \r" % page,
+ for n in range(1, len(words) - 1):
+ template = words[n]
+ try:
+ self.templates_to_counter[template] = \
+ self.templates_to_counter[template] + 1
+ except:
+ self.templates_to_counter[template] = 1
+ line = input_links.readline()
+ input_links.close()
+
+ # Verify redirects
+ print "Verifying redirects"
+ for template in self.templates_to_counter.keys():
+ redirected = redirect_checker.get_redirected(template)
+ if redirected is not None:
+ if redirected in self.templates_to_counter:
+ self.templates_to_counter[redirected] = \
+ self.templates_to_counter[redirected] + \
+ self.templates_to_counter[template]
+ self.templates_to_counter[template] = 0
+ else:
+ self.templates_to_counter[redirected] = \
+ self.templates_to_counter[template]
+ self.templates_to_counter[template] = 0
+
+
+class CountedTemplatesReader():
+
+ def __init__(self, file_name):
+ _file = codecs.open('%s.templates_counted' % file_name,
+ encoding='utf-8', mode='r')
+ self.templates = {}
+ line = _file.readline()
+ while line:
+ words = line.split()
+ template_name = words[0]
+ cant_used = int(words[1])
+ self.templates[normalize_title(template_name)] = \
+ {'cant': cant_used}
+ line = _file.readline()
+
+
+class TemplatesLoader():
+
+ def __init__(self, file_name, templates_used, select_all=False):
+ _file = codecs.open('%s.templates' % file_name,
+ encoding='utf-8', mode='r')
+ self._output = codecs.open('%s.processed' % file_name,
+ encoding='utf-8', mode='a')
+ line = _file.readline()
+ while line:
+ if len(line) == 2:
+ if ord(line[0]) == 1:
+ title = _file.readline()
+ size = _file.readline()
+ separator = _file.readline()
+ finish = False
+ template_content = ''
+ while not finish:
+ line = _file.readline()
+ #print line
+ if len(line) == 2:
+ if ord(line[0]) == 3:
+ finish = True
+ break
+ template_content += line
+ template_namespace = title[:title.find(':')]
+ template_name = title[title.find(':') + 1:]
+ template_name = normalize_title(template_name)
+ #print "checking", template_name,
+
+ if select_all or template_name in templates_used.keys():
+ #print "Adding", template_name,
+ title = template_namespace + ":" + template_name
+ self._register_page(title, template_content.strip())
+
+ line = _file.readline()
+
+ def _register_page(self, title, content):
+ self._output.write('\01\n')
+ self._output.write('%s\n' % normalize_title(title))
+ self._output.write('%d\n' % len(content))
+ self._output.write('\02\n')
+ self._output.write('%s\n' % content)
+ self._output.write('\03\n')
+
+
+class RedirectsUsedWriter():
+
+ def __init__(self, file_name, selected_pages_list, templates_used,
+ redirect_checker, postfix='redirects_used'):
+ _output_redirects = codecs.open('%s.%s' % (file_name, postfix),
+ encoding='utf-8', mode='w')
+
+ counter = 0
+ # check pages in redirects
+ for title in selected_pages_list:
+ title = normalize_title(title)
+ if title in redirect_checker.reversed_index:
+ for origin in redirect_checker.reversed_index[title]:
+ _output_redirects.write('[[%s]]\t[[%s]]\n' %
+ (origin, title))
+ counter += 1
+ print "Found %d redirected pages" % counter
+
+ templates_redirects = {}
+ # check pages in redirects
+ counter = 0
+ for title in templates_used.keys():
+ title = normalize_title(title)
+ if title in redirect_checker.reversed_index:
+ for origin in redirect_checker.reversed_index[title]:
+ _output_redirects.write('[[%s]]\t[[%s]]\n' %
+ (origin, title))
+ counter += 1
+
+ print "Found %d redirected templates" % counter
+
+ _output_redirects.close()
+
+
+if __name__ == '__main__':
+
+ select_all = False
+ if len(sys.argv) > 1:
+ for argn in range(1, len(sys.argv)):
+ arg = sys.argv[argn]
+ if arg == '--all':
+ select_all = True
+ print "Selecting all the pages"
+
+ MAX_LEVELS = 1
+
+ if not select_all:
+ fav_reader = FileListReader(config.favorites_file_name)
+ print "Loaded %d favorite pages" % len(fav_reader.list)
+
+ if os.path.exists(config.blacklist_file_name):
+ pages_blacklisted_reader = FileListReader(config.blacklist_file_name)
+ pages_blacklist = pages_blacklisted_reader.list
+ print "Loaded %d blacklisted pages" % len(pages_blacklist)
+ else:
+ pages_blacklist = []
+
+ input_xml_file_name = config.input_xml_file_name
+
+ print "Init redirects checker"
+ redirect_checker = RedirectParser(input_xml_file_name)
+
+ level = 1
+
+ if not select_all:
+ selected_pages_file_name = '%s.pages_selected-level-%d' % \
+ (input_xml_file_name, MAX_LEVELS)
+ else:
+ selected_pages_file_name = '%s.pages_selected' % input_xml_file_name
+
+ if not os.path.exists(selected_pages_file_name):
+ if not select_all:
+ while level <= MAX_LEVELS:
+ print "Processing links level %d" % level
+ links_filter = LinksFilter(input_xml_file_name,
+ redirect_checker, fav_reader.list)
+ fav_reader.list.extend(links_filter.links)
+ level += 1
+
+ print "Writing pages_selected-level-%d file" % MAX_LEVELS
+ output_file = codecs.open(selected_pages_file_name,
+ encoding='utf-8', mode='w')
+ for page in fav_reader.list:
+ output_file.write('%s\n' % page)
+ output_file.close()
+ selected_pages_list = fav_reader.list
+ else:
+ print "Processing links"
+ links_filter = PagesLinksFilter(input_xml_file_name,
+ redirect_checker)
+
+ print "Writing pages_selected file %d pages" % \
+ len(links_filter.pages)
+ output_file = codecs.open(selected_pages_file_name,
+ encoding='utf-8', mode='w')
+ for page in links_filter.pages:
+ output_file.write('%s\n' % page)
+ output_file.close()
+ selected_pages_list = links_filter.pages
+
+ else:
+ print "Loading selected pages"
+ pages_selected_reader = FileListReader(selected_pages_file_name)
+ selected_pages_list = pages_selected_reader.list
+
+ if not os.path.exists('%s.processed' % input_xml_file_name):
+ print "Writing .processed file"
+ parser = make_parser()
+ parser.setContentHandler(PagesProcessor(input_xml_file_name,
+ selected_pages_list, pages_blacklist))
+ parser.parse(input_xml_file_name)
+
+ # if there are a .templates_counted file should be removed
+ # because we need recalculate it
+ if os.path.exists('%s.templates_counted' % input_xml_file_name):
+ os.remove('%s.templates_counted' % input_xml_file_name)
+
+ templates_used_reader = None
+ if not os.path.exists('%s.templates_counted' % input_xml_file_name):
+ if select_all:
+ templates_loader = TemplatesLoader(input_xml_file_name, [], True)
+ else:
+ print "Processing templates"
+ templates_counter = TemplatesCounter(input_xml_file_name,
+ selected_pages_list, redirect_checker)
+
+ print "Sorting counted templates"
+ items = templates_counter.templates_to_counter.items()
+ items.sort(key=itemgetter(1), reverse=True)
+
+ print "Writing templates_counted file"
+ output_file = codecs.open('%s.templates_counted' % \
+ input_xml_file_name, encoding='utf-8', mode='w')
+ for n in range(len(items)):
+ if int(items[n][1]) > 0:
+ output_file.write('%s %d\n' % (items[n][0], items[n][1]))
+ output_file.close()
+
+ print "Loading templates used"
+ templates_used_reader = CountedTemplatesReader(input_xml_file_name)
+ print "Readed %d templates used" % len(
+ templates_used_reader.templates)
+
+ print "Adding used templates to .processed file"
+ templates_loader = TemplatesLoader(input_xml_file_name,
+ templates_used_reader.templates)
+
+ if not os.path.exists('%s.redirects_used' % input_xml_file_name):
+ if select_all:
+ os.link('%s.redirects' % input_xml_file_name,
+ '%s.redirects_used' % input_xml_file_name)
+ else:
+ if templates_used_reader is None:
+ print "Loading templates used"
+ templates_used_reader = \
+ CountedTemplatesReader(input_xml_file_name)
+ print "Readed %d templates used" % \
+ len(templates_used_reader.templates)
+
+ redirects_used_writer = RedirectsUsedWriter(input_xml_file_name,
+ selected_pages_list, templates_used_reader.templates,
+ redirect_checker)
diff --git a/tools2/pages_parser.py b/tools2/pages_parser.py
new file mode 100755
index 0000000..e8b11ec
--- /dev/null
+++ b/tools2/pages_parser.py
@@ -0,0 +1,190 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Test to use sax to parse wikimedia xml files
+
+from xml.sax import make_parser, handler
+import codecs
+import re
+import os
+import sys
+
+import config
+
+
+def normalize_title(title):
+ return title.strip().replace(' ', '_').capitalize()
+
+
+class WikimediaXmlPagesProcessor(handler.ContentHandler):
+
+ def __init__(self, file_name, debug):
+ handler.ContentHandler.__init__(self)
+ self._page_counter = 0
+ self._page = None
+ self._debug = debug
+ if self._debug:
+ self._output = codecs.open('%s.all_pages' % file_name,
+ encoding='utf-8', mode='w')
+ if self._debug:
+ self._output_titles = codecs.open('%s.titles' % file_name,
+ encoding='utf-8', mode='w')
+ self._output_redirects = codecs.open('%s.redirects' % file_name,
+ encoding='utf-8', mode='w')
+ self._output_templates = codecs.open('%s.templates' % file_name,
+ encoding='utf-8', mode='w')
+ if self._debug:
+ self._output_blacklisted = codecs.open('%s.blacklisted' %
+ file_name, encoding='utf-8', mode='w')
+ self._output_links = codecs.open('%s.links' % file_name,
+ encoding='utf-8', mode='w')
+ self._output_page_templates = codecs.open('%s.page_templates' %
+ file_name, encoding='utf-8', mode='w')
+
+ self.link_re = re.compile('\[\[.*?\]\]')
+ self.template_re = re.compile('{{.*?}}')
+
+ def startElement(self, name, attrs):
+ if name == "page":
+ self._page = {}
+ self._page_counter += 1
+ self._text = ""
+
+ def characters(self, content):
+ if self._text == '':
+ self._first_line = content.lstrip().upper()
+ self._text = self._text + content
+
+ def _register_page(self, register):
+ register.write('\01\n')
+ register.write('%s\n' % normalize_title(self._title))
+ register.write('%d\n' % len(self._page))
+ register.write('\02\n')
+ register.write('%s\n' % self._page)
+ register.write('\03\n')
+
+ def endElement(self, name):
+ if name == "title":
+ self._title = self._text
+ elif name == "text":
+ self._page = self._text
+ elif name == "page":
+
+ title = normalize_title(self._title)
+ print "Page %d '%s', length %d \r" % \
+ (self._page_counter, title, len(self._page)),
+
+ for namespace in config.BLACKLISTED_NAMESPACES:
+ if unicode(self._title.upper()).startswith(namespace):
+ if self._debug:
+ self._register_page(self._output_blacklisted)
+ return
+
+ is_redirect = False
+
+ for tag in config.REDIRECT_TAGS:
+ if unicode(self._first_line).startswith(tag):
+ is_redirect = True
+ break
+
+ if is_redirect:
+ # redirected pages
+
+ page_destination = "ERROR"
+ search = self.link_re.search(self._page)
+ if search is not None:
+ # keep out the [[]]
+ page_destination = search.group()[2:-2]
+ page_destination = normalize_title(page_destination)
+ if page_destination.find('|') > -1:
+ page_destination = \
+ page_destination[:page_destination.find('|')]
+
+ if title != page_destination:
+ self._output_redirects.write('[[%s]]\t[[%s]]\n' %
+ (title, page_destination))
+ else:
+
+ for namespace in config.TEMPLATE_NAMESPACES:
+ if unicode(self._title).startswith(namespace):
+ # templates
+ self._register_page(self._output_templates)
+ return
+
+ # titles
+ if self._debug:
+ self._output_titles.write('%s\n' % title)
+
+ # processed
+ if self._debug:
+ self._register_page(self._output)
+
+ # links
+ links = self.link_re.findall(unicode(self._page))
+ self._output_links.write('%s ' % title)
+ for link in links:
+ # remove '[[' and ']]'
+ link = link[2:-2]
+ # Check if have a valid namespace
+ colon_position = link.find(':')
+ valid = True
+ if colon_position > -1:
+ namespace = link[:colon_position]
+ valid = namespace in config.LINKS_NAMESPACES
+ if valid:
+ # if there are a pipe remove the right side
+ pipe_position = link.find('|')
+ if pipe_position > -1:
+ link = link[:pipe_position]
+ link = normalize_title(link)
+ self._output_links.write('%s ' % link)
+ self._output_links.write('\n')
+
+ # find templates used in the pages
+ templates = self.template_re.findall(unicode(self._page))
+ templates_list = []
+ for template in templates:
+ # remove '{{' and '}}'
+ template = template[2:-2]
+ # if there are a pipe remove the right side
+ pipe_position = template.find('|')
+ if pipe_position > -1:
+ template = template[:pipe_position]
+ # if there are a : remove the right side
+ colon_position = template.find(':')
+ if colon_position > -1:
+ template = template[:colon_position]
+ if len(template) == 0:
+ break
+ # ignore templates starting with # or {
+ if template[0] == '#' or template[0] == '{':
+ break
+ template = normalize_title(template)
+ # only add one time by page
+ if not template in templates_list:
+ templates_list.append(template)
+
+ if len(templates_list) > 0:
+ self._output_page_templates.write('%s ' % title)
+ for template in templates_list:
+ self._output_page_templates.write('%s ' % template)
+ self._output_page_templates.write('\n')
+
+ elif name == "mediawiki":
+ if self._debug:
+ self._output.close()
+ self._output_titles.close()
+ self._output_blacklisted.close()
+ self._output_redirects.close()
+ self._output_templates.close()
+ self._output_links.close()
+ self._output_page_templates.close()
+ print "Processed %d pages." % self._page_counter
+
+debug = False
+if len(sys.argv) > 1:
+ debug = (sys.argv[1] == '--debug')
+
+parser = make_parser()
+parser.setContentHandler(
+ WikimediaXmlPagesProcessor(config.input_xml_file_name, debug))
+parser.parse(config.input_xml_file_name)
diff --git a/tools2/remove_from_index.py b/tools2/remove_from_index.py
new file mode 100755
index 0000000..a282c2f
--- /dev/null
+++ b/tools2/remove_from_index.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# remove a article from the index index
+
+import sys
+import config
+
+input_xml_file_name = config.input_xml_file_name
+
+sys.path.append('..')
+from whoosh.qparser import QueryParser
+from whoosh.index import open_dir
+
+
+if len(sys.argv) > 1:
+ article_title = sys.argv[1]
+else:
+ print "Usage remove_from_index.py article"
+
+ix = open_dir("index_dir")
+
+query = QueryParser("title", ix.schema).parse("'%s'" % unicode(article_title))
+ix.delete_by_query(query)
+ix.writer().commit()
diff --git a/tools2/stats_parser.py b/tools2/stats_parser.py
new file mode 100644
index 0000000..75a52fa
--- /dev/null
+++ b/tools2/stats_parser.py
@@ -0,0 +1,15 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+from BeautifulSoup import BeautifulSoup
+import codecs
+
+soup = BeautifulSoup(open('./top.html'))
+
+output = codecs.open('top.txt', encoding='utf-8', mode='w')
+
+for link in soup('a'):
+ output.write(link.text.replace(' ','_') + '\n')
+
+output.close()
+
diff --git a/tools2/test_index.py b/tools2/test_index.py
new file mode 100755
index 0000000..bc35f87
--- /dev/null
+++ b/tools2/test_index.py
@@ -0,0 +1,175 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# create index
+
+import codecs
+import os
+from subprocess import Popen, PIPE, STDOUT
+import re
+import sys
+import config
+
+input_xml_file_name = config.input_xml_file_name
+
+
+def normalize_title(title):
+ return title.strip().replace(' ', '_').capitalize()
+
+
+class RedirectParser:
+
+ def __init__(self, file_name):
+ self.link_re = re.compile('\[\[.*?\]\]')
+ # Load redirects
+ input_redirects = codecs.open('%s.redirects_used' % file_name,
+ encoding='utf-8', mode='r')
+
+ line = input_redirects.readline()
+ self.redirects = {}
+ count = 0
+ while line:
+ links = links = self.link_re.findall(unicode(line))
+ if len(links) == 2:
+ self.redirects[normalize_title(links[0])] = \
+ normalize_title(links[1])
+ line = input_redirects.readline()
+ count += 1
+ print "Processing %d\r" % count,
+ input_redirects.close()
+
+ def get_redirected(self, article_title):
+ try:
+ article_title = article_title.capitalize()
+ redirected = self.redirects[article_title]
+ except:
+ redirect = None
+ return redirect
+
+
+class DataRetriever():
+
+ def __init__(self, data_files_base, redirects_checker):
+ self._bzip_file_name = '%s.processed.bz2' % data_files_base
+ self._bzip_table_file_name = '%s.processed.bz2t' % data_files_base
+ self._index_file_name = '%s.processed.idx' % data_files_base
+ self.template_re = re.compile('({{.*?}})')
+ self.redirects_checker = redirects_checker
+
+ def _get_article_position(self, article_title):
+ article_title = normalize_title(article_title)
+ #index_file = codecs.open(self._index_file_name, encoding='utf-8',
+ # mode='r')
+ index_file = open(self._index_file_name, mode='r')
+
+ index_line = index_file.readline()
+ num_block = -1
+ position = -1
+ while index_line:
+ words = index_line.split()
+ article = words[0]
+ if article == article_title:
+ num_block = int(words[1])
+ position = int(words[2])
+ break
+ index_line = index_file.readline()
+ index_file.close()
+
+ if num_block == -1:
+ # look at redirects
+ redirect = self.redirects_checker.get_redirected(article_title)
+ if redirect is not None:
+ return self._get_article_position(redirect)
+
+ return num_block, position
+
+ def _get_block_start(self, num_block):
+ bzip_table_file = open(self._bzip_table_file_name, mode='r')
+ n = num_block
+ table_line = ''
+ while n > 0:
+ table_line = bzip_table_file.readline()
+ n -= 1
+ if table_line == '':
+ return -1
+ parts = table_line.split()
+ block_start = int(parts[0])
+ bzip_table_file.close()
+ return block_start
+
+ def get_expanded_article(self, article_title):
+ """
+ This method does not do real template expansion
+ is only used to test all the needed templates and redirects are
+ available.
+ """
+ text_article = self.get_text_article(article_title)
+ templates_cache = {}
+ expanded_article = ''
+ parts = self.template_re.split(text_article)
+ for part in parts:
+ if part.startswith('{{'):
+ part = part[2:-2]
+ #print "TEMPLATE: %s" % part
+ if part.find('|') > -1:
+ template_name = part[:part.find('|')]
+ else:
+ template_name = part
+ # TODO: Plantilla should be a parameter
+ template_name = normalize_title('Plantilla:%s' % template_name)
+ if template_name in templates_cache:
+ expanded_article += templates_cache[template_name]
+ else:
+ templates_content = self.get_text_article(template_name)
+ expanded_article += templates_content
+ templates_cache[template_name] = templates_content
+ else:
+ expanded_article += part
+ return expanded_article
+
+ def get_text_article(self, article_title):
+ output = ''
+ print "Looking for article %s" % article_title
+ num_block, position = self._get_article_position(article_title)
+ if num_block == -1:
+ print "Article not found"
+ else:
+ print "Found at block %d position %d" % (num_block, position)
+
+ block_start = self._get_block_start(num_block)
+ #print "Block %d starts at %d" % (num_block, block_start)
+ if block_start == -1:
+ return ""
+
+ # extract the block
+ bzip_file = open(self._bzip_file_name, mode='r')
+ cmd = ['../bin/%s/seek-bunzip' % config.system_id, str(block_start)]
+ p = Popen(cmd, stdin=bzip_file, stdout=PIPE, stderr=STDOUT,
+ close_fds=True)
+
+ while position > 0:
+ line = p.stdout.readline()
+ position -= len(line)
+
+ finish = False
+ while not finish:
+ line = p.stdout.readline()
+ if len(line) == 2:
+ if ord(line[0]) == 3:
+ finish = True
+ break
+ output += line
+ return output
+
+
+if __name__ == '__main__':
+
+ page_title = ''
+ if len(sys.argv) > 1:
+ page_title = sys.argv[1]
+ else:
+ print "Use ../tools2/test_index.py page_title"
+ exit()
+
+ redirects_checker = RedirectParser(input_xml_file_name)
+ data_retriever = DataRetriever(input_xml_file_name, redirects_checker)
+ print data_retriever.get_expanded_article(page_title)
diff --git a/tools2/test_sql_search.py b/tools2/test_sql_search.py
new file mode 100755
index 0000000..54fc87e
--- /dev/null
+++ b/tools2/test_sql_search.py
@@ -0,0 +1,32 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import sys
+import sqlite3
+
+search_word = ''
+if len(sys.argv) > 1:
+ article = sys.argv[1]
+else:
+ print "Use ../tools2/test_sql_search.py topic"
+ exit()
+
+print "Opening index"
+dbpath = './search.db'
+conn = sqlite3.connect(dbpath)
+
+"""
+print "Searching %s" % article
+search_word = '%' + article + '%'
+results = conn.execute("SELECT * from articles where title like'%s'" %
+ search_word)
+row = results.next()
+while row:
+ print row
+ row = results.next()
+"""
+
+print "Exact search:"
+results = conn.execute("SELECT * from articles where title = '%s'" %
+ article)
+print results.next()
diff --git a/use_whoosh_index_to_check_links.diff b/use_whoosh_index_to_check_links.diff
new file mode 100644
index 0000000..8a89ef7
--- /dev/null
+++ b/use_whoosh_index_to_check_links.diff
@@ -0,0 +1,399 @@
+diff --git a/activity/activity.info.en b/activity/activity.info.en
+index 2e85ec9..021d299 100644
+--- a/activity/activity.info.en
++++ b/activity/activity.info.en
+@@ -1,6 +1,6 @@
+ [Activity]
+ name = WikipediaEN
+-activity_version = 33.6
++activity_version = 34
+ bundle_id = org.laptop.WikipediaActivityEN
+ icon = activity-wikipedia-en
+ exec = sugar-activity activity_en.WikipediaActivityEN
+diff --git a/activity/activity.info.es_lat b/activity/activity.info.es_lat
+index f6a9348..023bc4f 100644
+--- a/activity/activity.info.es_lat
++++ b/activity/activity.info.es_lat
+@@ -1,6 +1,6 @@
+ [Activity]
+ name = Wikipedia
+-activity_version = 33.6
++activity_version = 34
+ bundle_id = org.laptop.WikipediaActivity
+ icon = activity-wikipedia-es
+ exec = sugar-activity activity_es.WikipediaActivityES
+diff --git a/dataretriever.py b/dataretriever.py
+index 838c6b0..9a9e109 100644
+--- a/dataretriever.py
++++ b/dataretriever.py
+@@ -2,42 +2,17 @@
+ # -*- coding: utf-8 -*-
+ # create index
+
+-import codecs
+ from subprocess import Popen, PIPE, STDOUT
+ import re
++import os
+ import logging
+
+-def normalize_title(title):
+- return title.strip().replace(' ', '_').capitalize()
+-
++from whoosh.qparser import QueryParser
++from whoosh.index import open_dir
+
+-class RedirectParser:
+
+- def __init__(self, file_name):
+- self.link_re = re.compile('\[\[.*?\]\]')
+- # Load redirects
+- input_redirects = codecs.open('%s.redirects_used' % file_name,
+- encoding='utf-8', mode='r')
+-
+- self.redirects = {}
+- for line in input_redirects.readlines():
+- links = self.link_re.findall(unicode(line))
+- if len(links) == 2:
+- origin = links[0][2:-2]
+- destination = links[1][2:-2]
+- self.redirects[origin] = destination
+- #print "Processing %s" % normalize_title(origin)
+- logging.debug("Loaded %d redirects" % len(self.redirects))
+- input_redirects.close()
+-
+- def get_redirected(self, article_title):
+- try:
+- logging.debug("get_redirect %s" % article_title)
+- article_title = article_title.capitalize()
+- redirect = self.redirects[article_title]
+- except:
+- redirect = None
+- return redirect
++def normalize_title(title):
++ return title.strip().replace(' ', '_').capitalize()
+
+
+ class DataRetriever():
+@@ -46,41 +21,45 @@ class DataRetriever():
+ self.system_id = system_id
+ self._bzip_file_name = '%s.processed.bz2' % data_files_base
+ self._bzip_table_file_name = '%s.processed.bz2t' % data_files_base
+- self._index_file_name = '%s.processed.idx' % data_files_base
+ self.template_re = re.compile('({{.*?}})')
+- self.redirects_checker = RedirectParser(data_files_base)
++ base_path = os.path.dirname(data_files_base)
++ self.ix = open_dir(os.path.join(base_path, "index_dir"))
+ # TODO: I need control cache size
+ self.templates_cache = {}
+
+- def _get_article_position(self, article_title):
++ def check_existence(self, article_title):
+ article_title = normalize_title(article_title)
+- index_file = codecs.open(self._index_file_name, encoding='utf-8',
+- mode='r')
+- #index_file = open(self._index_file_name, mode='r')
+-
+- num_block = -1
+- position = -1
+- for index_line in index_file.readlines():
+- words = index_line.split()
+- article = words[0]
+- if article == article_title:
+- num_block = int(words[1])
+- position = int(words[2])
+- break
+- index_file.close()
+-
+- if num_block == -1:
+- # look at redirects
+- logging.debug("looking for '%s' at redirects" % article_title)
+- redirect = self.redirects_checker.get_redirected(article_title)
+- if redirect is not None:
+- if redirect == article_title:
+- # to avoid infinite recursion
+- return -1, -1
+- return self._get_article_position(redirect)
++ with self.ix.searcher() as searcher:
++ query = QueryParser("title",
++ self.ix.schema).parse("'%s'" % article_title)
++ results = searcher.search(query, limit=1)
++ return results.scored_length() > 0
+
++ def _get_article_position(self, article_title):
++ article_title = normalize_title(article_title)
++ # look at the title in the index database
++ with self.ix.searcher() as searcher:
++ query = QueryParser("title",
++ self.ix.schema).parse("'%s'" % article_title)
++ results = searcher.search(query, limit=1)
++ logging.error('Search article %s returns %s', article_title,
++ results[0])
++ num_block = results[0]['block']
++ position = results[0]['position']
++ if num_block == 0 and position == 0:
++ # if block and position = 0 serach with the redirect_to value
++ return self._get_article_position(results[0]['redirect_to'])
+ return num_block, position
+
++ def search(self, article_title):
++ with self.ix.searcher() as searcher:
++ query = QueryParser("title", self.ix.schema).parse(article_title)
++ results = searcher.search(query, limit=None)
++ articles = []
++ for n in range(results.scored_length()):
++ articles.append(results[n]['title'])
++ return articles
++
+ def _get_block_start(self, num_block):
+ bzip_table_file = open(self._bzip_table_file_name, mode='r')
+ n = num_block
+diff --git a/server.py b/server.py
+index 930da64..c55d626 100755
+--- a/server.py
++++ b/server.py
+@@ -41,8 +41,6 @@ except ImportError:
+ from md5 import md5
+
+ import dataretriever
+-from whoosh.qparser import QueryParser
+-from whoosh.index import open_dir
+ ##
+ ## Libs we ship -- add lib path for
+ ## shared objects
+@@ -98,33 +96,6 @@ class LinkStats:
+ pagetotal = 1
+
+
+-class ArticleIndex:
+- # Prepare an in-memory index, using the already generated
+- # index file.
+-
+- def __init__(self, path):
+- self.index_path = '%s.processed.idx' % path
+- self.redirect_parser = dataretriever.RedirectParser(path)
+- self.article_index = set()
+- with open(self.index_path, mode='r') as f:
+- for line in f.readlines():
+- m = re.search(r'(.*?)\s*\d+\s*\d+$', line)
+- if m is None:
+- raise AssertionError("Match didn't work")
+- self.article_index.add(m.group(1))
+- print "INDEX HAVE %d articles" % len(self.article_index)
+-
+- def __contains__(self, x):
+- found = dataretriever.normalize_title(x) in self.article_index
+- if not found:
+- redirect = self.redirect_parser.get_redirected(x)
+- if redirect is not None:
+- found = True
+-
+- #print "TEST INDEX %s %s" % (dataretriever.normalize_title(x), found)
+- return found
+-
+-
+ class WPWikiDB:
+ """Retrieves article contents for mwlib."""
+
+@@ -132,7 +103,7 @@ class WPWikiDB:
+ self.lang = lang
+ self.templateprefix = templateprefix
+ self.templateblacklist = templateblacklist
+- self.data_retriever = dataretriever.DataRetriever(system_id, path)
++ self.dataretriever = dataretriever.DataRetriever(system_id, path)
+ self.templates_cache = {'!' : '|'} # a special case
+
+ def getRawArticle(self, title, followRedirects=True):
+@@ -142,7 +113,7 @@ class WPWikiDB:
+ return ''
+
+ article_text = \
+- self.data_retriever.get_text_article(title).decode('utf-8')
++ self.dataretriever.get_text_article(title).decode('utf-8')
+
+ # Stripping leading & trailing whitespace fixes template expansion.
+ article_text = article_text.lstrip()
+@@ -151,6 +122,7 @@ class WPWikiDB:
+ return article_text
+
+ def getTemplate(self, title, followRedirects=False):
++ logging.error('getTemplate: %s', title)
+ if title in self.templates_cache:
+ return self.templates_cache[title]
+ else:
+@@ -287,8 +259,8 @@ class WPMathRenderer:
+ class WPHTMLWriter(mwlib.htmlwriter.HTMLWriter):
+ """Customizes HTML output from mwlib."""
+
+- def __init__(self, index, wfile, images=None, lang='en'):
+- self.index = index
++ def __init__(self, dataretriever, wfile, images=None, lang='en'):
++ self.dataretriever = dataretriever
+ self.gallerylevel = 0
+ self.lang = lang
+ self.math_processed = False
+@@ -315,7 +287,7 @@ class WPHTMLWriter(mwlib.htmlwriter.HTMLWriter):
+ title = title[0].capitalize() + title[1:]
+ title = title.replace("_", " ")
+
+- article_exists = title.encode('utf8') in self.index
++ article_exists = self.dataretriever.check_existence(article)
+
+ if article_exists:
+ # Exact match. Internal link.
+@@ -337,7 +309,6 @@ class WPHTMLWriter(mwlib.htmlwriter.HTMLWriter):
+ parts[0] = parts[0].replace(" ", "_")
+ url = ("#".join([x for x in parts]))
+
+- #print "----> ""<a %s href='%s%s'>" % (link_attr, link_baseurl, url)
+ self.out.write("<a %s href='%s%s'>" % (link_attr, link_baseurl,
+ url))
+
+@@ -520,11 +491,10 @@ class WPHTMLWriter(mwlib.htmlwriter.HTMLWriter):
+
+
+ class WikiRequestHandler(SimpleHTTPRequestHandler):
+- def __init__(self, wikidb, index, conf, request, client_address, server):
++ def __init__(self, wikidb, conf, request, client_address, server):
+ # pullcord is currently offline
+ # self.reporturl = 'pullcord.laptop.org:8000'
+ self.reporturl = False
+- self.index = index
+ self.port = conf['port']
+ self.lang = conf['lang']
+ self.templateprefix = conf['templateprefix']
+@@ -532,6 +502,7 @@ class WikiRequestHandler(SimpleHTTPRequestHandler):
+ self.wpheader = conf['wpheader']
+ self.wpfooter = conf['wpfooter']
+ self.resultstitle = conf['resultstitle']
++ self.base_path = os.path.dirname(conf['path'])
+
+ if 'editdir' in conf:
+ self.editdir = conf['editdir']
+@@ -542,10 +513,6 @@ class WikiRequestHandler(SimpleHTTPRequestHandler):
+ else:
+ self.giturl = False
+
+- # init search index
+- self.base_path = os.path.dirname(conf['path'])
+- self.ix = open_dir(os.path.join(self.base_path, "index_dir"))
+-
+ self.wikidb = wikidb
+
+ self.client_address = client_address
+@@ -581,8 +548,8 @@ class WikiRequestHandler(SimpleHTTPRequestHandler):
+ wiki_parsed.caption = title
+
+ imagedb = WPImageDB(self.base_path + '/images/')
+- writer = WPHTMLWriter(self.index, htmlout, images=imagedb,
+- lang=self.lang)
++ writer = WPHTMLWriter(self.wikidb.dataretriever, htmlout,
++ images=imagedb, lang=self.lang)
+ writer.write(wiki_parsed)
+ return writer.math_processed
+
+@@ -825,13 +792,7 @@ class WikiRequestHandler(SimpleHTTPRequestHandler):
+ self.wfile.write("</body></html>")
+
+ def search(self, article_title):
+- with self.ix.searcher() as searcher:
+- query = QueryParser("title", self.ix.schema).parse(article_title)
+- results = searcher.search(query, limit=None)
+- articles = []
+- for n in range(results.scored_length()):
+- articles.append(results[n]['title'])
+- return articles
++ return self.wikidb.dataretriever.search(article_title)
+
+ def send_image(self, path):
+ if os.path.exists(path.encode('utf8')[1:]):
+@@ -911,7 +872,6 @@ class WikiRequestHandler(SimpleHTTPRequestHandler):
+
+
+ def run_server(confvars):
+- index = ArticleIndex(confvars['path'])
+
+ if 'editdir' in confvars:
+ try:
+@@ -941,7 +901,7 @@ def run_server(confvars):
+ confvars['templateprefix'], confvars['templateblacklist'])
+
+ httpd = MyHTTPServer(('', confvars['port']),
+- lambda *args: WikiRequestHandler(wikidb, index, confvars, *args))
++ lambda *args: WikiRequestHandler(wikidb, confvars, *args))
+
+ if confvars['comandline']:
+ httpd.serve_forever()
+diff --git a/setup_new_wiki.py b/setup_new_wiki.py
+index 0a5e829..4c94412 100755
+--- a/setup_new_wiki.py
++++ b/setup_new_wiki.py
+@@ -45,8 +45,7 @@ class WikiXOPackager(bundlebuilder.XOPackager):
+
+ if self.data_file is not None:
+ # Add the data files
+- needed_sufix = ['.processed.bz2', '.processed.bz2t',
+- '.processed.idx', '.redirects_used']
++ needed_sufix = ['.processed.bz2', '.processed.bz2t']
+ for sufix in needed_sufix:
+ data_file = self.data_file + sufix
+ print "Add %s" % data_file
+diff --git a/tools2/create_index.py b/tools2/create_index.py
+index f0e1957..2d90316 100755
+--- a/tools2/create_index.py
++++ b/tools2/create_index.py
+@@ -101,9 +101,10 @@ class RedirectParser:
+ def create_search_index(input_xml_file_name, pages_blacklist):
+ sys.path.append('..')
+ from whoosh.index import create_in
+- from whoosh.fields import TEXT, Schema
++ from whoosh.fields import TEXT, NUMERIC, Schema
+
+- schema = Schema(title=TEXT(stored=True))
++ schema = Schema(title=TEXT(stored=True), block=NUMERIC(stored=True),
++ position=NUMERIC(stored=True), redirect_to=TEXT(stored=True))
+ if not os.path.exists("index_dir"):
+ os.mkdir("index_dir")
+ ix = create_in("index_dir", schema)
+@@ -115,9 +116,13 @@ def create_search_index(input_xml_file_name, pages_blacklist):
+ parts = line.split()
+ if len(parts) > 0:
+ title_article = parts[0]
++ block_article = parts[1]
++ position_article = parts[2]
+ title_article = normalize_title(title_article)
+ if title_article not in pages_blacklist:
+- writer.add_document(title=unicode(title_article))
++ writer.add_document(title=unicode(title_article),
++ block=int(block_article), position=int(position_article),
++ redirect_to=unicode(''))
+ else:
+ print "* Blacklisted %s " % title_article
+ line = text_index_file.readline()
+@@ -126,16 +131,20 @@ def create_search_index(input_xml_file_name, pages_blacklist):
+ redirects_parser = RedirectParser(input_xml_file_name)
+ for origin in redirects_parser.redirects.keys():
+ origin = normalize_title(origin)
+- destination = normalize_title(redirects_parser.redirects[origin])
+- if origin not in pages_blacklist and \
+- destination not in pages_blacklist:
+- writer.add_document(title=unicode(origin))
+- else:
+- print "* Blacklisted %s " % origin
+-
++ try:
++ destination = normalize_title(redirects_parser.redirects[origin])
++ if origin not in pages_blacklist and \
++ destination not in pages_blacklist:
++ writer.add_document(title=unicode(origin), block=0, position=0,
++ redirect_to=unicode(destination))
++ else:
++ print "* Blacklisted %s " % origin
++ except:
++ print "ERROR: origin %s destination %s" % (origin, destination)
+ writer.commit()
+ text_index_file.close()
+
++
+ def create_bzip_table():
+ """
+ ../seek-bzip2/seek-bzip2/bzip-table <