From: jenkins-bot Date: Tue, 21 Oct 2014 00:58:08 +0000 (+0000) Subject: Merge "SqlBagOStuff: fix percentage in deleteObjectsExpiringBefore()" X-Git-Tag: 1.31.0-rc.0~13546 X-Git-Url: http://git.heureux-cyclage.org/?a=commitdiff_plain;h=9106ed7710176dd9ce37f61c9ae3e7224e2f7a0c;hp=4c79d2e7e44cfd8242d0e2e2dea92a2cf74d8628;p=lhc%2Fweb%2Fwiklou.git Merge "SqlBagOStuff: fix percentage in deleteObjectsExpiringBefore()" --- diff --git a/RELEASE-NOTES-1.25 b/RELEASE-NOTES-1.25 index 2d5e7f48f5..48d7b056bf 100644 --- a/RELEASE-NOTES-1.25 +++ b/RELEASE-NOTES-1.25 @@ -25,6 +25,14 @@ production. in CSS. This results in slight size increase before gzip compression (due to percent-encoding), but up to 20% decrease after it. * Upgrade jStorage to v0.4.12. +* MediaWiki now natively supports page status indicators: icons (or short text + snippets) usually displayed in the top-right corner of the page. They have + been in use on Wikipedia for a long time, implemented using templates and CSS + absolute positioning. + - Basic wikitext syntax: [[File:Foo.svg|20px]] + - Usage instructions: https://www.mediawiki.org/wiki/Help:Page_status_indicators + - Adjusting custom skins to support indicators: + https://www.mediawiki.org/wiki/Manual:Skinning#Page_status_indicators === Bug fixes in 1.25 === * (bug 71003) No additional code will be generated to try to load CSS-embedded @@ -94,6 +102,7 @@ production. * ApiMain::setHelp * ApiMain::reallyMakeHelpMsg * ApiMain::makeHelpMsgHeader + * ApiQueryImageInfo::getPropertyDescriptions === Languages updated in 1.25 === @@ -122,6 +131,7 @@ changes to languages because of Bugzilla reports. * Deprecated OutputPage::readOnlyPage() and OutputPage::rateLimited(). Also, the former will now throw an MWException if called with one or more arguments. +* Removed hitcounters and associated code. == Compatibility == diff --git a/docs/mwlogger.txt b/docs/mwlogger.txt new file mode 100644 index 0000000000..9964e8b671 --- /dev/null +++ b/docs/mwlogger.txt @@ -0,0 +1,59 @@ +MWLogger implements a PSR-3 [0] compatible message logging system. + +The MWLogger class is actually a thin wrapper around any PSR-3 LoggerInterface +implementation. Named MWLogger instances can be obtained from the +MWLogger::getInstance() static method. MWLogger expects a class implementing +the MWLoggerSpi interface to act as a factory for new MWLogger instances. + +The "Spi" in MWLoggerSpi stands for "service provider interface". An SPI is +a API intended to be implemented or extended by a third party. This software +design pattern is intended to enable framework extension and replaceable +components. It is specifically used in the MWLogger service to allow alternate +PSR-3 logging implementations to be easily integrated with MediaWiki. + +The MWLogger::getInstance() static method is the means by which most code +acquires an MWLogger instance. This in turn delegates creation of MWLogger +instances to a class implementing the MWLoggerSpi service provider interface. + +The service provider interface allows the backend logging library to be +implemented in multiple ways. The $wgMWLoggerDefaultSpi global provides the +classname of the default MWLoggerSpi implementation to be loaded at runtime. +This can either be the name of a class implementing the MWLoggerSpi with +a zero argument constructor or a callable that will return an MWLoggerSpi +instance. Alternately the MWLogger::registerProvider method can be called +to inject an MWLoggerSpi instance into MWLogger and bypass the use of this +configuration variable. + +The MWLoggerMonologSpi class implements a service provider to generate +MWLogger instances that use the Monolog [1] logging library. See the PHP docs +(or source) for MWLoggerMonologSpi for details on the configuration of this +provider. The default configuration installs a null handler that will silently +discard all logging events. The documentation provided by the class describes +a more feature rich logging configuration. + +== Classes == +; MWLogger +: PSR-3 compatible logger that wraps any \Psr\Log\LoggerInterface + implementation +; MWLoggerSpi +: Service provider interface for MWLogger factories +; MWLoggerNullSpi +: MWLoggerSpi for creating instances that discard all log events +; MWLoggerMonologSpi +: MWLoggerSpi for creating instances backed by the monolog logging library +; MwLoggerMonologHandler +: Monolog handler that replicates the udp2log and file logging + functionality of wfErrorLog() +; MwLoggerMonologProcessor +: Monolog log processer that adds host: wfHostname() and wiki: wfWikiID() + to all records + +== Globals == +; $wgMWLoggerDefaultSpi +: Default service provider interface to use with MWLogger +; $wgMWLoggerMonologSpiConfig +: Configuration for MWLoggerMonologSpi describing how to configure the + Monolog logger instances. + +[0]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md +[1]: https://github.com/Seldaek/monolog diff --git a/includes/AutoLoader.php b/includes/AutoLoader.php index 6909b8f1ba..a564ce6787 100644 --- a/includes/AutoLoader.php +++ b/includes/AutoLoader.php @@ -463,6 +463,12 @@ $wgAutoloadLocalClasses = array( # includes/debug 'MWDebug' => 'includes/debug/MWDebug.php', + 'MWLogger' => 'includes/debug/logger/Logger.php', + 'MWLoggerMonologHandler' => 'includes/debug/logger/monolog/Handler.php', + 'MWLoggerMonologProcessor' => 'includes/debug/logger/monolog/Processor.php', + 'MWLoggerMonologSpi' => 'includes/debug/logger/monolog/Spi.php', + 'MWLoggerNullSpi' => 'includes/debug/logger/NullSpi.php', + 'MWLoggerSpi' => 'includes/debug/logger/Spi.php', # includes/deferred 'DataUpdate' => 'includes/deferred/DataUpdate.php', @@ -476,7 +482,6 @@ $wgAutoloadLocalClasses = array( 'SiteStatsUpdate' => 'includes/deferred/SiteStatsUpdate.php', 'SqlDataUpdate' => 'includes/deferred/SqlDataUpdate.php', 'SquidUpdate' => 'includes/deferred/SquidUpdate.php', - 'ViewCountUpdate' => 'includes/deferred/ViewCountUpdate.php', # includes/diff 'DiffEngine' => 'includes/diff/DairikiDiff.php', @@ -1016,7 +1021,6 @@ $wgAutoloadLocalClasses = array( 'NewFilesPager' => 'includes/specials/SpecialNewimages.php', 'NewPagesPager' => 'includes/specials/SpecialNewpages.php', 'PageArchive' => 'includes/specials/SpecialUndelete.php', - 'PopularPagesPage' => 'includes/specials/SpecialPopularpages.php', 'ProtectedPagesPager' => 'includes/specials/SpecialProtectedpages.php', 'ProtectedTitlesPager' => 'includes/specials/SpecialProtectedtitles.php', 'RandomPage' => 'includes/specials/SpecialRandompage.php', diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index 57859ece53..cd65ffea52 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -4116,15 +4116,6 @@ $wgTranscludeCacheExpiry = 3600; */ $wgArticleCountMethod = 'link'; -/** - * wgHitcounterUpdateFreq sets how often page counters should be updated, higher - * values are easier on the database. A value of 1 causes the counters to be - * updated on every hit, any higher value n cause them to update *on average* - * every n hits. Should be set to either 1 or something largish, eg 1000, for - * maximum efficiency. - */ -$wgHitcounterUpdateFreq = 1; - /** * How many days user must be idle before he is considered inactive. Will affect * the number shown on Special:Statistics, Special:ActiveUsers, and the @@ -5224,6 +5215,43 @@ $wgDebugDumpSqlLength = 500; */ $wgDebugLogGroups = array(); +/** + * Default service provider for creating MWLogger instances. + * + * This can either be the name of a class implementing the MWLoggerSpi + * interface with a zero argument constructor or a callable that will return + * an MWLoggerSpi instance. Alternately the MWLogger::registerProvider method + * can be called to inject an MWLoggerSpi instance into MWLogger and bypass + * the use of this configuration variable. + * + * @since 1.25 + * @var $wgMWLoggerDefaultSpi string|callable + * @see MwLogger + */ +$wgMWLoggerDefaultSpi = 'MWLoggerNullSpi'; + +/** + * Configuration for MWLoggerMonologSpi logger factory. + * + * Default configuration installs a null handler that will silently discard + * all logging events. + * + * @since 1.25 + * @see MWLoggerMonologSpi + */ +$wgMWLoggerMonologSpiConfig = array( + 'loggers' => array( + '@default' => array( + 'handlers' => array( 'null' ), + ), + ), + 'handlers' => array( + 'null' => array( + 'class' => '\\Monolog\\Logger\\NullHandler', + ), + ), +); + /** * Display debug data at the bottom of the main content area. * @@ -5385,12 +5413,6 @@ $wgAggregateStatsID = false; */ $wgStatsFormatString = "stats/%s - %s 1 1 1 1 %s\n"; -/** - * Whereas to count the number of time an article is viewed. - * Does not work if pages are cached (for example with squid). - */ -$wgDisableCounters = false; - /** * InfoAction retrieves a list of transclusion links (both to and from). * This number puts a limit on that query in the case of highly transcluded diff --git a/includes/EditPage.php b/includes/EditPage.php index ca28c07248..764f413f20 100644 --- a/includes/EditPage.php +++ b/includes/EditPage.php @@ -2107,6 +2107,17 @@ class EditPage { if ( $namespace == NS_MEDIAWIKI ) { # Show a warning if editing an interface message $wgOut->wrapWikiMsg( "
\n$1\n
", 'editinginterface' ); + # If this is a default message (but not css or js), + # show a hint that it is translatable on translatewiki.net + if ( !$this->mTitle->hasContentModel( CONTENT_MODEL_CSS ) + && !$this->mTitle->hasContentModel( CONTENT_MODEL_JAVASCRIPT ) + ) { + $defaultMessageText = $this->mTitle->getDefaultMessageText(); + if ( $defaultMessageText !== false ) { + $wgOut->wrapWikiMsg( "
\n$1\n
", + 'translateinterface' ); + } + } } elseif ( $namespace == NS_FILE ) { # Show a hint to shared repo $file = wfFindFile( $this->mTitle ); diff --git a/includes/MagicWord.php b/includes/MagicWord.php index 4d17298b23..d281555296 100644 --- a/includes/MagicWord.php +++ b/includes/MagicWord.php @@ -172,7 +172,6 @@ class MagicWord { 'directionmark', 'contentlanguage', 'numberofadmins', - 'numberofviews', 'cascadingsources', ); @@ -215,7 +214,6 @@ class MagicWord { 'localtimestamp' => 3600, 'pagesinnamespace' => 3600, 'numberofadmins' => 3600, - 'numberofviews' => 3600, 'numberingroup' => 3600, ); diff --git a/includes/MediaWiki.php b/includes/MediaWiki.php index 87468bd2bf..9585c5f589 100644 --- a/includes/MediaWiki.php +++ b/includes/MediaWiki.php @@ -682,7 +682,7 @@ class MediaWiki { } $url = wfAppendQuery( wfScript( 'index' ), $query ); - $req = "POST $url HTTP/1.1\r\nHost: {$info['host']}\r\nConnection: Close\r\n\r\n"; + $req = "POST $url HTTP/1.1\r\nHost: {$info['host']}\r\nConnection: Close\r\nContent-Length: 0\r\n\r\n"; wfDebugLog( 'runJobs', "Running $n job(s) via '$url'\n" ); // Send a cron API request to be performed in the background. diff --git a/includes/OutputPage.php b/includes/OutputPage.php index 084f714601..3bb217560a 100644 --- a/includes/OutputPage.php +++ b/includes/OutputPage.php @@ -122,6 +122,9 @@ class OutputPage extends ContextSource { /** @var array */ protected $mCategories = array(); + /** @var array */ + protected $mIndicators = array(); + /** @var array Array of Interwiki Prefixed (non DB key) Titles (e.g. 'fr:Test page') */ private $mLanguageLinks = array(); @@ -1329,6 +1332,32 @@ class OutputPage extends ContextSource { return $this->mCategories; } + /** + * Add an array of indicators, with their identifiers as array keys and HTML contents as values. + * + * In case of duplicate keys, existing values are overwritten. + * + * @param array $indicators + * @since 1.25 + */ + public function setIndicators( array $indicators ) { + $this->mIndicators = $indicators + $this->mIndicators; + // Keep ordered by key + ksort( $this->mIndicators ); + } + + /** + * Get the indicators associated with this page. + * + * The array will be internally ordered by item keys. + * + * @return array Keys: identifiers, values: HTML contents + * @since 1.25 + */ + public function getIndicators() { + return $this->mIndicators; + } + /** * Restrict the page to loading modules bundled the software. * @@ -1641,6 +1670,7 @@ class OutputPage extends ContextSource { public function addParserOutputMetadata( $parserOutput ) { $this->mLanguageLinks += $parserOutput->getLanguageLinks(); $this->addCategoryLinks( $parserOutput->getCategories() ); + $this->setIndicators( $parserOutput->getIndicators() ); $this->mNewSectionLink = $parserOutput->getNewSection(); $this->mHideNewSectionLink = $parserOutput->getHideNewSection(); diff --git a/includes/Preferences.php b/includes/Preferences.php index 582a4a5bd5..93844f6185 100644 --- a/includes/Preferences.php +++ b/includes/Preferences.php @@ -706,7 +706,6 @@ class Preferences { 'options' => $tzOptions, 'default' => $tzSetting, 'size' => 20, - 'maxlength' => 6, 'section' => 'rendering/timeoffset', ); } diff --git a/includes/PrefixSearch.php b/includes/PrefixSearch.php index fe78e230fa..5df0ce715b 100644 --- a/includes/PrefixSearch.php +++ b/includes/PrefixSearch.php @@ -159,19 +159,21 @@ abstract class PrefixSearch { // Pick namespace (based on PrefixSearch::defaultSearchBackend) $ns = in_array( NS_MAIN, $namespaces ) ? NS_MAIN : $namespaces[0]; $t = Title::newFromText( $search, $ns ); - $string = $t->getPrefixedText(); - - $key = array_search( $string, $srchres ); - if ( $key !== false ) { - // Move it to the front - $cut = array_splice( $srchres, $key, 1 ); - array_unshift( $srchres, $cut[0] ); - } elseif ( $t->exists() ) { - // Add it in front - array_unshift( $srchres, $string ); - - if ( count( $srchres ) > $limit ) { - array_pop( $srchres ); + if ( $t ) { + // If text is a valid title and is in the search results + $string = $t->getPrefixedText(); + $key = array_search( $string, $srchres ); + if ( $key !== false ) { + // Move it to the front + $cut = array_splice( $srchres, $key, 1 ); + array_unshift( $srchres, $cut[0] ); + } elseif ( $t->exists() ) { + // Add it in front + array_unshift( $srchres, $string ); + + if ( count( $srchres ) > $limit ) { + array_pop( $srchres ); + } } } } diff --git a/includes/Setup.php b/includes/Setup.php index 743936e6ad..2faf1960ea 100644 --- a/includes/Setup.php +++ b/includes/Setup.php @@ -517,6 +517,10 @@ if ( $wgTmpDirectory === false ) { wfProfileOut( $fname . '-tempDir' ); } +// We don't use counters anymore. Left here for extensions still +// expecting this to exist. Should be removed sometime 1.26 or later. +$wgDisableCounters = true; + wfProfileOut( $fname . '-defaults2' ); wfProfileIn( $fname . '-misc1' ); diff --git a/includes/SiteStats.php b/includes/SiteStats.php index 3dc17933b0..32c6761372 100644 --- a/includes/SiteStats.php +++ b/includes/SiteStats.php @@ -102,7 +102,6 @@ class SiteStats { static function doLoad( $db ) { return $db->selectRow( 'site_stats', array( 'ss_row_id', - 'ss_total_views', 'ss_total_edits', 'ss_good_articles', 'ss_total_pages', @@ -113,11 +112,16 @@ class SiteStats { } /** + * Return the total number of page views. Except we don't track those anymore. + * Stop calling this function, it will be removed some time in the future. It's + * kept here simply to prevent fatal errors. + * + * @deprecated since 1.25 * @return int */ static function views() { - self::load(); - return self::$row->ss_total_views; + wfDeprecated( __METHOD__, '1.25' ); + return 0; } /** @@ -249,7 +253,6 @@ class SiteStats { } // Now check for underflow/overflow foreach ( array( - 'ss_total_views', 'ss_total_edits', 'ss_good_articles', 'ss_total_pages', @@ -274,7 +277,7 @@ class SiteStatsInit { // Various stats private $mEdits = null, $mArticles = null, $mPages = null; - private $mUsers = null, $mViews = null, $mFiles = null; + private $mUsers = null, $mFiles = null; /** * Constructor @@ -348,15 +351,6 @@ class SiteStatsInit { return $this->mUsers; } - /** - * Count views - * @return int - */ - public function views() { - $this->mViews = $this->db->selectField( 'page', 'SUM(page_counter)', '', __METHOD__ ); - return $this->mViews; - } - /** * Count total files * @return int @@ -374,11 +368,10 @@ class SiteStatsInit { * - Boolean: whether to use the master DB * - DatabaseBase: database connection to use * @param array $options Array of options, may contain the following values - * - views Boolean: when true, do not update the number of page views (default: true) * - activeUsers Boolean: whether to update the number of active users (default: false) */ public static function doAllAndCommit( $database, array $options = array() ) { - $options += array( 'update' => false, 'views' => true, 'activeUsers' => false ); + $options += array( 'update' => false, 'activeUsers' => false ); // Grab the object and count everything $counter = new SiteStatsInit( $database ); @@ -389,11 +382,6 @@ class SiteStatsInit { $counter->users(); $counter->files(); - // Only do views if we don't want to not count them - if ( $options['views'] ) { - $counter->views(); - } - $counter->refresh(); // Count active users if need be @@ -403,8 +391,7 @@ class SiteStatsInit { } /** - * Refresh site_stats. If you want ss_total_views to be updated, be sure to - * call views() first. + * Refresh site_stats */ public function refresh() { $values = array( @@ -414,8 +401,6 @@ class SiteStatsInit { 'ss_total_pages' => ( $this->mPages === null ? $this->pages() : $this->mPages ), 'ss_users' => ( $this->mUsers === null ? $this->users() : $this->mUsers ), 'ss_images' => ( $this->mFiles === null ? $this->files() : $this->mFiles ), - ) + ( - $this->mViews ? array( 'ss_total_views' => $this->mViews ) : array() ); $dbw = wfGetDB( DB_MASTER ); diff --git a/includes/User.php b/includes/User.php index e6425f879d..2fa684967c 100644 --- a/includes/User.php +++ b/includes/User.php @@ -3817,7 +3817,6 @@ class User implements IDBAccessObject { return false; } - $passwordFactory = self::getPasswordFactory(); if ( !$this->mPassword->equals( $password ) ) { if ( $wgLegacyEncoding ) { // Some wikis were converted from ISO 8859-1 to UTF-8, the passwords can't be converted @@ -3831,6 +3830,7 @@ class User implements IDBAccessObject { } } + $passwordFactory = self::getPasswordFactory(); if ( $passwordFactory->needsUpdate( $this->mPassword ) ) { $this->mPassword = $passwordFactory->newFromPlaintext( $password ); $this->saveSettings(); diff --git a/includes/actions/InfoAction.php b/includes/actions/InfoAction.php index f932a40543..12e845b423 100644 --- a/includes/actions/InfoAction.php +++ b/includes/actions/InfoAction.php @@ -314,13 +314,6 @@ class InfoAction extends FormlessAction { $this->msg( 'pageinfo-robot-policy' ), $this->msg( "pageinfo-robot-${policy['index']}" ) ); - if ( isset( $pageCounts['views'] ) ) { - // Number of views - $pageInfo['header-basic'][] = array( - $this->msg( 'pageinfo-views' ), $lang->formatNum( $pageCounts['views'] ) - ); - } - $unwatchedPageThreshold = $config->get( 'UnwatchedPageThreshold' ); if ( $user->isAllowed( 'unwatchedpages' ) || @@ -644,17 +637,6 @@ class InfoAction extends FormlessAction { $dbr = wfGetDB( DB_SLAVE ); $result = array(); - if ( !$config->get( 'DisableCounters' ) ) { - // Number of views - $views = (int)$dbr->selectField( - 'page', - 'page_counter', - array( 'page_id' => $id ), - __METHOD__ - ); - $result['views'] = $views; - } - // Number of page watchers $watchers = (int)$dbr->selectField( 'watchlist', diff --git a/includes/api/ApiBase.php b/includes/api/ApiBase.php index a214f2ebb3..58bd68db57 100644 --- a/includes/api/ApiBase.php +++ b/includes/api/ApiBase.php @@ -74,6 +74,17 @@ abstract class ApiBase extends ContextSource { // is an array of any of strings giving the message key, arrays giving key and // parameters, or Message objects. const PARAM_HELP_MSG_APPEND = 11; + /// @since 1.25 + // Specify additional information tags for the parameter. Value is an array + // of arrays, with the first member being the 'tag' for the info and the + // remaining members being the values. In the help, this is formatted using + // apihelp-{$path}-paraminfo-{$tag}, which is passed $1 = count, $2 = + // comma-joined list of values. + const PARAM_HELP_MSG_INFO = 12; + /// @since 1.25 + // When PARAM_DFLT is an array, this may be an array mapping those values + // to page titles which will be linked in the help. + const PARAM_VALUE_LINKS = 13; const LIMIT_BIG1 = 500; // Fast query, std user limit const LIMIT_BIG2 = 5000; // Fast query, bot/sysop limit @@ -1923,6 +1934,15 @@ abstract class ApiBase extends ContextSource { * @{ */ + /** + * Return the description message. + * + * @return string|array|Message + */ + protected function getDescriptionMessage() { + return "apihelp-{$this->getModulePath()}-description"; + } + /** * Get final module description, after hooks have had a chance to tweak it as * needed. @@ -1940,7 +1960,7 @@ abstract class ApiBase extends ContextSource { $desc = (string)$desc; } - $msg = $this->msg( "apihelp-{$this->getModulePath()}-description", array( + $msg = ApiBase::makeMessage( $this->getDescriptionMessage(), $this->getContext(), array( $this->getModulePrefix(), $this->getModuleName(), $this->getModulePath(), @@ -2424,7 +2444,7 @@ abstract class ApiBase extends ContextSource { * @return array|bool False on no parameter descriptions */ protected function getParamDescription() { - return false; + return array(); } /** diff --git a/includes/api/ApiBlock.php b/includes/api/ApiBlock.php index 07f62c668c..44565a8416 100644 --- a/includes/api/ApiBlock.php +++ b/includes/api/ApiBlock.php @@ -165,38 +165,16 @@ class ApiBlock extends ApiBase { ); } - public function getParamDescription() { - return array( - 'user' => 'Username, IP address or IP range you want to block', - 'expiry' => 'Relative expiry time, e.g. \'5 months\' or \'2 weeks\'. ' . - 'If set to \'infinite\', \'indefinite\' or \'never\', the block will never expire.', - 'reason' => 'Reason for block', - 'anononly' => 'Block anonymous users only (i.e. disable anonymous edits for this IP)', - 'nocreate' => 'Prevent account creation', - 'autoblock' => 'Automatically block the last used IP address, and ' . - 'any subsequent IP addresses they try to login from', - 'noemail' - => 'Prevent user from sending email through the wiki. (Requires the "blockemail" right.)', - 'hidename' => 'Hide the username from the block log. (Requires the "hideuser" right.)', - 'allowusertalk' - => 'Allow the user to edit their own talk page (depends on $wgBlockAllowsUTEdit)', - 'reblock' => 'If the user is already blocked, overwrite the existing block', - 'watchuser' => 'Watch the user/IP\'s user and talk pages', - ); - } - - public function getDescription() { - return 'Block a user.'; - } - public function needsToken() { return 'csrf'; } - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=block&user=123.5.5.12&expiry=3%20days&reason=First%20strike&token=123ABC', - 'api.php?action=block&user=Vandal&expiry=never&reason=Vandalism&nocreate=&autoblock=&noemail=&token=123ABC' + 'action=block&user=192.0.2.5&expiry=3%20days&reason=First%20strike&token=123ABC' + => 'apihelp-block-example-ip-simple', + 'action=block&user=Vandal&expiry=never&reason=Vandalism&nocreate=&autoblock=&noemail=&token=123ABC' + => 'apihelp-block-example-user-complex', ); } diff --git a/includes/api/ApiClearHasMsg.php b/includes/api/ApiClearHasMsg.php index 32e20e80f3..8667a67774 100644 --- a/includes/api/ApiClearHasMsg.php +++ b/includes/api/ApiClearHasMsg.php @@ -42,13 +42,10 @@ class ApiClearHasMsg extends ApiBase { return false; } - public function getDescription() { - return array( 'Clears the hasmsg flag for current user.' ); - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=clearhasmsg' => 'Clears the hasmsg flag for current user', + 'action=clearhasmsg' + => 'apihelp-clearhasmsg-example-1', ); } diff --git a/includes/api/ApiComparePages.php b/includes/api/ApiComparePages.php index 4855926856..a2f33eaad6 100644 --- a/includes/api/ApiComparePages.php +++ b/includes/api/ApiComparePages.php @@ -126,27 +126,10 @@ class ApiComparePages extends ApiBase { ); } - public function getParamDescription() { + public function getExamplesMessages() { return array( - 'fromtitle' => 'First title to compare', - 'fromid' => 'First page ID to compare', - 'fromrev' => 'First revision to compare', - 'totitle' => 'Second title to compare', - 'toid' => 'Second page ID to compare', - 'torev' => 'Second revision to compare', - ); - } - - public function getDescription() { - return array( - 'Get the difference between 2 pages.', - 'You must pass a revision number or a page title or a page ID id for each part (1 and 2).' - ); - } - - public function getExamples() { - return array( - 'api.php?action=compare&fromrev=1&torev=2' => 'Create a diff between revision 1 and 2', + 'action=compare&fromrev=1&torev=2' + => 'apihelp-compare-example-1', ); } } diff --git a/includes/api/ApiCreateAccount.php b/includes/api/ApiCreateAccount.php index 2ce532b920..cfb6dab597 100644 --- a/includes/api/ApiCreateAccount.php +++ b/includes/api/ApiCreateAccount.php @@ -165,10 +165,6 @@ class ApiCreateAccount extends ApiBase { $apiResult->addValue( null, 'createaccount', $result ); } - public function getDescription() { - return 'Create a new user account.'; - } - public function mustBePosted() { return true; } @@ -204,27 +200,12 @@ class ApiCreateAccount extends ApiBase { ); } - public function getParamDescription() { - $p = $this->getModulePrefix(); - - return array( - 'name' => 'Username', - 'password' => "Password (ignored if {$p}mailpassword is set)", - 'domain' => 'Domain for external authentication (optional)', - 'token' => 'Account creation token obtained in first request', - 'email' => 'Email address of user (optional)', - 'realname' => 'Real name of user (optional)', - 'mailpassword' => 'If set to any value, a random password will be emailed to the user', - 'reason' => 'Optional reason for creating the account to be put in the logs', - 'language' - => 'Language code to set as default for the user (optional, defaults to content language)' - ); - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=createaccount&name=testuser&password=test123', - 'api.php?action=createaccount&name=testmailuser&mailpassword=true&reason=MyReason', + 'action=createaccount&name=testuser&password=test123' + => 'apihelp-createaccount-example-pass', + 'action=createaccount&name=testmailuser&mailpassword=true&reason=MyReason' + => 'apihelp-createaccount-example-mail', ); } diff --git a/includes/api/ApiDelete.php b/includes/api/ApiDelete.php index abca824545..e455f71beb 100644 --- a/includes/api/ApiDelete.php +++ b/includes/api/ApiDelete.php @@ -210,35 +210,16 @@ class ApiDelete extends ApiBase { ); } - public function getParamDescription() { - $p = $this->getModulePrefix(); - - return array( - 'title' => "Title of the page you want to delete. Cannot be used together with {$p}pageid", - 'pageid' => "Page ID of the page you want to delete. Cannot be used together with {$p}title", - 'reason' - => 'Reason for the deletion. If not set, an automatically generated reason will be used', - 'watch' => 'Add the page to your watchlist', - 'watchlist' => 'Unconditionally add or remove the page from your ' . - 'watchlist, use preferences or do not change watch', - 'unwatch' => 'Remove the page from your watchlist', - 'oldimage' => 'The name of the old image to delete as provided by iiprop=archivename' - ); - } - - public function getDescription() { - return 'Delete a page.'; - } - public function needsToken() { return 'csrf'; } - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=delete&title=Main%20Page&token=123ABC' => 'Delete the Main Page', - 'api.php?action=delete&title=Main%20Page&token=123ABC&reason=Preparing%20for%20move' - => 'Delete the Main Page with the reason "Preparing for move"', + 'action=delete&title=Main%20Page&token=123ABC' + => 'apihelp-delete-example-simple', + 'action=delete&title=Main%20Page&token=123ABC&reason=Preparing%20for%20move' + => 'apihelp-delete-example-reason', ); } diff --git a/includes/api/ApiDisabled.php b/includes/api/ApiDisabled.php index 6ea5d2020c..fc9752205e 100644 --- a/includes/api/ApiDisabled.php +++ b/includes/api/ApiDisabled.php @@ -44,19 +44,7 @@ class ApiDisabled extends ApiBase { return false; } - public function getAllowedParams() { - return array(); - } - - public function getParamDescription() { - return array(); - } - - public function getDescription() { - return 'This module has been disabled.'; - } - - public function getExamples() { - return array(); + protected function getDescriptionMessage() { + return 'apihelp-disabled-description'; } } diff --git a/includes/api/ApiEditPage.php b/includes/api/ApiEditPage.php index 8a762714eb..f2bb273eee 100644 --- a/includes/api/ApiEditPage.php +++ b/includes/api/ApiEditPage.php @@ -496,10 +496,6 @@ class ApiEditPage extends ApiBase { return true; } - public function getDescription() { - return 'Create and edit pages.'; - } - public function getAllowedParams() { return array( 'title' => array( @@ -557,58 +553,11 @@ class ApiEditPage extends ApiBase { ), 'contentmodel' => array( ApiBase::PARAM_TYPE => ContentHandler::getContentModels(), - ) - ); - } - - public function getParamDescription() { - $p = $this->getModulePrefix(); - - return array( - 'title' => "Title of the page you want to edit. Cannot be used together with {$p}pageid", - 'pageid' => "Page ID of the page you want to edit. Cannot be used together with {$p}title", - 'section' => 'Section number. 0 for the top section, \'new\' for a new section', - 'sectiontitle' => 'The title for a new section', - 'text' => 'Page content', - 'token' => array( - /* Standard description is automatically prepended */ - 'The token should always be sent as the last parameter, or at ' . - "least, after the {$p}text parameter" - ), - 'summary' - => "Edit summary. Also section title when {$p}section=new and {$p}sectiontitle is not set", - 'minor' => 'Minor edit', - 'notminor' => 'Non-minor edit', - 'bot' => 'Mark this edit as bot', - 'basetimestamp' => array( - 'Timestamp of the base revision (obtained through prop=revisions&rvprop=timestamp).', - 'Used to detect edit conflicts; leave unset to ignore conflicts' ), - 'starttimestamp' => array( - 'Timestamp when you began the editing process, e.g. when the current page content ' . - 'was loaded for editing.', - 'Used to detect edit conflicts; leave unset to ignore conflicts' - ), - 'recreate' => 'Override any errors about the article having been deleted in the meantime', - 'createonly' => 'Don\'t edit the page if it exists already', - 'nocreate' => 'Throw an error if the page doesn\'t exist', - 'watch' => 'Add the page to your watchlist', - 'unwatch' => 'Remove the page from your watchlist', - 'watchlist' => 'Unconditionally add or remove the page from your ' . - 'watchlist, use preferences or do not change watch', - 'md5' => array( - "The MD5 hash of the {$p}text parameter, or the {$p}prependtext " . - "and {$p}appendtext parameters concatenated.", - 'If set, the edit won\'t be done unless the hash is correct' + 'token' => array( + // Standard definition automatically inserted + ApiBase::PARAM_HELP_MSG_APPEND => array( 'apihelp-edit-param-token' ), ), - 'prependtext' => "Add this text to the beginning of the page. Overrides {$p}text", - 'appendtext' => array( "Add this text to the end of the page. Overrides {$p}text.", - "Use {$p}section=new to append a new section" ), - 'undo' => "Undo this revision. Overrides {$p}text, {$p}prependtext and {$p}appendtext", - 'undoafter' => 'Undo all revisions from undo to this one. If not set, just undo one revision', - 'redirect' => 'Automatically resolve redirects', - 'contentformat' => 'Content serialization format used for the input text', - 'contentmodel' => 'Content model of the new content', ); } @@ -616,17 +565,17 @@ class ApiEditPage extends ApiBase { return 'csrf'; } - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=edit&title=Test&summary=test%20summary&' . - 'text=article%20content&basetimestamp=20070824123454&token=%2B\\' - => 'Edit a page (anonymous user)', - 'api.php?action=edit&title=Test&summary=NOTOC&minor=&' . - 'prependtext=__NOTOC__%0A&basetimestamp=20070824123454&token=%2B\\' - => 'Prepend __NOTOC__ to a page (anonymous user)', - 'api.php?action=edit&title=Test&undo=13585&undoafter=13579&' . - 'basetimestamp=20070824123454&token=%2B\\' - => 'Undo r13579 through r13585 with autosummary (anonymous user)', + 'action=edit&title=Test&summary=test%20summary&' . + 'text=article%20content&basetimestamp=2007-08-24T12:34:54Z&token=123ABC' + => 'apihelp-edit-example-edit', + 'action=edit&title=Test&summary=NOTOC&minor=&' . + 'prependtext=__NOTOC__%0A&basetimestamp=2007-08-24T12:34:54Z&token=123ABC' + => 'apihelp-edit-example-prepend', + 'action=edit&title=Test&undo=13585&undoafter=13579&' . + 'basetimestamp=2007-08-24T12:34:54Z&token=123ABC' + => 'apihelp-edit-example-undo', ); } diff --git a/includes/api/ApiEmailUser.php b/includes/api/ApiEmailUser.php index 9870b2ded8..911f454da1 100644 --- a/includes/api/ApiEmailUser.php +++ b/includes/api/ApiEmailUser.php @@ -102,27 +102,14 @@ class ApiEmailUser extends ApiBase { ); } - public function getParamDescription() { - return array( - 'target' => 'User to send email to', - 'subject' => 'Subject header', - 'text' => 'Mail body', - 'ccme' => 'Send a copy of this mail to me', - ); - } - - public function getDescription() { - return 'Email a user.'; - } - public function needsToken() { return 'csrf'; } - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=emailuser&target=WikiSysop&text=Content&token=123ABC' - => 'Send an email to the User "WikiSysop" with the text "Content"', + 'action=emailuser&target=WikiSysop&text=Content&token=123ABC' + => 'apihelp-emailuser-example-email', ); } diff --git a/includes/api/ApiExpandTemplates.php b/includes/api/ApiExpandTemplates.php index 8a3b534d4b..93903b52a5 100644 --- a/includes/api/ApiExpandTemplates.php +++ b/includes/api/ApiExpandTemplates.php @@ -159,35 +159,10 @@ class ApiExpandTemplates extends ApiBase { ); } - public function getParamDescription() { + public function getExamplesMessages() { return array( - 'text' => 'Wikitext to convert', - 'title' => 'Title of page', - 'prop' => array( - 'Which pieces of information to get', - ' wikitext - The expanded wikitext', - ' categories - Any categories present in the input that are not represented in ' . - 'the wikitext output', - ' volatile - Whether the output is volatile and should not be reused ' . - 'elsewhere within the page', - ' ttl - The maximum time after which caches of the result should be ' . - 'invalidated', - ' parsetree - The XML parse tree of the input', - 'Note that if no values are selected, the result will contain the wikitext,', - 'but the output will be in a deprecated format.', - ), - 'includecomments' => 'Whether to include HTML comments in the output', - 'generatexml' => 'Generate XML parse tree (replaced by prop=parsetree)', - ); - } - - public function getDescription() { - return 'Expands all templates in wikitext.'; - } - - public function getExamples() { - return array( - 'api.php?action=expandtemplates&text={{Project:Sandbox}}' + 'action=expandtemplates&text={{Project:Sandbox}}' + => 'apihelp-expandtemplates-example-simple', ); } diff --git a/includes/api/ApiFeedContributions.php b/includes/api/ApiFeedContributions.php index 374203ebb2..20f4d3d343 100644 --- a/includes/api/ApiFeedContributions.php +++ b/includes/api/ApiFeedContributions.php @@ -161,7 +161,7 @@ class ApiFeedContributions extends ApiBase { public function getAllowedParams() { $feedFormatNames = array_keys( $this->getConfig()->get( 'FeedClasses' ) ); - return array( + $ret = array( 'feedformat' => array( ApiBase::PARAM_DFLT => 'rss', ApiBase::PARAM_TYPE => $feedFormatNames @@ -187,32 +187,22 @@ class ApiFeedContributions extends ApiBase { 'deletedonly' => false, 'toponly' => false, 'newonly' => false, - 'showsizediff' => false, + 'showsizediff' => array( + ApiBase::PARAM_DFLT => false, + ), ); - } - public function getParamDescription() { - return array( - 'feedformat' => 'The format of the feed', - 'user' => 'What users to get the contributions for', - 'namespace' => 'What namespace to filter the contributions by', - 'year' => 'From year (and earlier)', - 'month' => 'From month (and earlier)', - 'tagfilter' => 'Filter contributions that have these tags', - 'deletedonly' => 'Show only deleted contributions', - 'toponly' => 'Only show edits that are latest revisions', - 'newonly' => 'Only show edits that are page creations', - 'showsizediff' => 'Show the size difference between revisions. Disabled in Miser Mode', - ); - } + if ( $this->getConfig()->get( 'MiserMode' ) ) { + $ret['showsizediff'][ApiBase::PARAM_HELP_MSG] = 'api-help-param-disabled-in-miser-mode'; + } - public function getDescription() { - return 'Returns a user contributions feed.'; + return $ret; } - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=feedcontributions&user=Reedy', + 'action=feedcontributions&user=Example' + => 'apihelp-feedcontributions-example-simple', ); } } diff --git a/includes/api/ApiFeedRecentChanges.php b/includes/api/ApiFeedRecentChanges.php index 7239a2967f..0d2fca6d56 100644 --- a/includes/api/ApiFeedRecentChanges.php +++ b/includes/api/ApiFeedRecentChanges.php @@ -171,37 +171,12 @@ class ApiFeedRecentChanges extends ApiBase { return $ret; } - public function getParamDescription() { + public function getExamplesMessages() { return array( - 'feedformat' => 'The format of the feed', - 'namespace' => 'Namespace to limit the results to', - 'invert' => 'All namespaces but the selected one', - 'associated' => 'Include associated (talk or main) namespace', - 'days' => 'Days to limit the results to', - 'limit' => 'Maximum number of results to return', - 'from' => 'Show changes since then', - 'hideminor' => 'Hide minor changes', - 'hidebots' => 'Hide changes made by bots', - 'hideanons' => 'Hide changes made by anonymous users', - 'hideliu' => 'Hide changes made by registered users', - 'hidepatrolled' => 'Hide patrolled changes', - 'hidemyself' => 'Hide changes made by yourself', - 'tagfilter' => 'Filter by tag', - 'target' => 'Show only changes on pages linked from this page', - 'showlinkedto' => 'Show changes on pages linked to the selected page instead', - 'categories' => 'Show only changes on pages in all of these categories', - 'categories_any' => 'Show only changes on pages in any of the categories instead', - ); - } - - public function getDescription() { - return 'Returns a recent changes feed'; - } - - public function getExamples() { - return array( - 'api.php?action=feedrecentchanges', - 'api.php?action=feedrecentchanges&days=30' + 'action=feedrecentchanges' + => 'apihelp-feedrecentchanges-example-simple', + 'action=feedrecentchanges&days=30' + => 'apihelp-feedrecentchanges-example-30days', ); } } diff --git a/includes/api/ApiFeedWatchlist.php b/includes/api/ApiFeedWatchlist.php index 6aef8fc294..84ee228ca2 100644 --- a/includes/api/ApiFeedWatchlist.php +++ b/includes/api/ApiFeedWatchlist.php @@ -219,50 +219,42 @@ class ApiFeedWatchlist extends ApiBase { ), 'linktosections' => false, ); + + $copyParams = array( + 'allrev' => 'allrev', + 'owner' => 'wlowner', + 'token' => 'wltoken', + 'show' => 'wlshow', + 'type' => 'wltype', + 'excludeuser' => 'wlexcludeuser', + ); if ( $flags ) { $wlparams = $this->getWatchlistModule()->getAllowedParams( $flags ); - $ret['allrev'] = $wlparams['allrev']; - $ret['wlowner'] = $wlparams['owner']; - $ret['wltoken'] = $wlparams['token']; - $ret['wlshow'] = $wlparams['show']; - $ret['wltype'] = $wlparams['type']; - $ret['wlexcludeuser'] = $wlparams['excludeuser']; + foreach ( $copyParams as $from => $to ) { + $p = $wlparams[$from]; + if ( !is_array( $p ) ) { + $p = array( ApiBase::PARAM_DFLT => $p ); + } + if ( !isset( $p[ApiBase::PARAM_HELP_MSG] ) ) { + $p[ApiBase::PARAM_HELP_MSG] = "apihelp-query+watchlist-param-$from"; + } + $ret[$to] = $p; + } } else { - $ret['allrev'] = null; - $ret['wlowner'] = null; - $ret['wltoken'] = null; - $ret['wlshow'] = null; - $ret['wltype'] = null; - $ret['wlexcludeuser'] = null; + foreach ( $copyParams as $from => $to ) { + $ret[$to] = null; + } } return $ret; } - public function getParamDescription() { - $wldescr = $this->getWatchlistModule()->getParamDescription(); - - return array( - 'feedformat' => 'The format of the feed', - 'hours' => 'List pages modified within this many hours from now', - 'linktosections' => 'Link directly to changed sections if possible', - 'allrev' => $wldescr['allrev'], - 'wlowner' => $wldescr['owner'], - 'wltoken' => $wldescr['token'], - 'wlshow' => $wldescr['show'], - 'wltype' => $wldescr['type'], - 'wlexcludeuser' => $wldescr['excludeuser'], - ); - } - - public function getDescription() { - return 'Returns a watchlist feed.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=feedwatchlist', - 'api.php?action=feedwatchlist&allrev=&hours=6' + 'action=feedwatchlist' + => 'apihelp-feedwatchlist-example-default', + 'action=feedwatchlist&allrev=&hours=6' + => 'apihelp-feedwatchlist-example-all6hrs', ); } diff --git a/includes/api/ApiFileRevert.php b/includes/api/ApiFileRevert.php index f518e172e3..02147fa3e8 100644 --- a/includes/api/ApiFileRevert.php +++ b/includes/api/ApiFileRevert.php @@ -135,29 +135,15 @@ class ApiFileRevert extends ApiBase { ); } - public function getParamDescription() { - return array( - 'filename' => 'Target filename without the File: prefix', - 'comment' => 'Upload comment', - 'archivename' => 'Archive name of the revision to revert to', - ); - } - - public function getDescription() { - return array( - 'Revert a file to an old version.' - ); - } - public function needsToken() { return 'csrf'; } - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=filerevert&filename=Wiki.png&comment=Revert&' . + 'action=filerevert&filename=Wiki.png&comment=Revert&' . 'archivename=20110305152740!Wiki.png&token=123ABC' - => 'Revert Wiki.png to the version of 20110305152740', + => 'apihelp-filerevert-example-revert', ); } } diff --git a/includes/api/ApiFormatBase.php b/includes/api/ApiFormatBase.php index 7a08ed7d1b..f0037bb291 100644 --- a/includes/api/ApiFormatBase.php +++ b/includes/api/ApiFormatBase.php @@ -155,12 +155,13 @@ abstract class ApiFormatBase extends ApiBase { $result = $this->getBuffer(); $context = new DerivativeContext( $this->getMain() ); - $context->setUser( new User ); // anon to avoid caching issues $context->setSkin( SkinFactory::getDefaultInstance()->makeSkin( 'apioutput' ) ); + $context->setTitle( SpecialPage::getTitleFor( 'ApiHelp' ) ); $out = new OutputPage( $context ); + $context->setOutput( $out ); + $out->addModules( 'mediawiki.apipretty' ); $out->setPageTitle( $context->msg( 'api-format-title' ) ); - $context->setOutput( $out ); $header = $context->msg( 'api-format-prettyprint-header' ) ->params( $format, strtolower( $format ) ) diff --git a/includes/api/ApiFormatRaw.php b/includes/api/ApiFormatRaw.php index 235fca1454..81d2f4f562 100644 --- a/includes/api/ApiFormatRaw.php +++ b/includes/api/ApiFormatRaw.php @@ -55,7 +55,7 @@ class ApiFormatRaw extends ApiFormatBase { return $data['mime']; } - public function initPrinter( $unused ) { + public function initPrinter( $unused = false ) { $data = $this->getResultData(); if ( isset( $data['error'] ) ) { $this->errorFallback->initPrinter( $unused ); diff --git a/includes/api/ApiHelp.php b/includes/api/ApiHelp.php index 0c962d0a96..9be2d92b2a 100644 --- a/includes/api/ApiHelp.php +++ b/includes/api/ApiHelp.php @@ -43,9 +43,9 @@ class ApiHelp extends ApiBase { // Get the help $context = new DerivativeContext( $this->getMain()->getContext() ); - $context->setUser( new User ); // anon to avoid caching issues $context->setSkin( SkinFactory::getDefaultInstance()->makeSkin( 'apioutput' ) ); $context->setLanguage( $this->getMain()->getLanguage() ); + $context->setTitle( SpecialPage::getTitleFor( 'ApiHelp' ) ); $out = new OutputPage( $context ); $context->setOutput( $out ); @@ -369,6 +369,17 @@ class ApiHelp extends ApiBase { $info[] = $context->msg( 'api-help-param-required' )->parse(); } + // Custom info? + if ( !empty( $settings[ApiBase::PARAM_HELP_MSG_INFO] ) ) { + foreach ( $settings[ApiBase::PARAM_HELP_MSG_INFO] as $i ) { + $tag = array_shift( $i ); + $info[] = $context->msg( "apihelp-{$path}-paraminfo-{$tag}" ) + ->numParams( count( $i ) ) + ->params( $context->getLanguage()->commaList( $i ) ) + ->parse(); + } + } + // Type documentation if ( !isset( $settings[ApiBase::PARAM_TYPE] ) ) { $dflt = isset( $settings[ApiBase::PARAM_DFLT] ) @@ -390,7 +401,16 @@ class ApiHelp extends ApiBase { if ( is_array( $type ) ) { $count = count( $type ); - $type = array_map( 'wfEscapeWikiText', $type ); + $links = isset( $settings[ApiBase::PARAM_VALUE_LINKS] ) + ? $settings[ApiBase::PARAM_VALUE_LINKS] + : array(); + $type = array_map( function ( $v ) use ( $links ) { + $ret = wfEscapeWikiText( $v ); + if ( isset( $links[$v] ) ) { + $ret = "[[{$links[$v]}|$ret]]"; + } + return $ret; + }, $type ); $i = array_search( '', $type, true ); if ( $i === false ) { $type = $context->getLanguage()->commaList( $type ); @@ -632,10 +652,14 @@ class ApiHelp extends ApiBase { public function getExamplesMessages() { return array( - 'action=help' => 'apihelp-help-example-main', - 'action=help&recursivesubmodules=1' => 'apihelp-help-example-recursive', - 'action=help&modules=help' => 'apihelp-help-example-help', - 'action=help&modules=query+info|query+categorymembers' => 'apihelp-help-example-query', + 'action=help' + => 'apihelp-help-example-main', + 'action=help&recursivesubmodules=1' + => 'apihelp-help-example-recursive', + 'action=help&modules=help' + => 'apihelp-help-example-help', + 'action=help&modules=query+info|query+categorymembers' + => 'apihelp-help-example-query', ); } diff --git a/includes/api/ApiImageRotate.php b/includes/api/ApiImageRotate.php index 20396dd761..6aa9c229dc 100644 --- a/includes/api/ApiImageRotate.php +++ b/includes/api/ApiImageRotate.php @@ -184,7 +184,9 @@ class ApiImageRotate extends ApiBase { ApiBase::PARAM_TYPE => array( '90', '180', '270' ), ApiBase::PARAM_REQUIRED => true ), - 'continue' => '', + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), ); if ( $flags ) { $result += $this->getPageSet()->getFinalParams( $flags ); @@ -193,26 +195,17 @@ class ApiImageRotate extends ApiBase { return $result; } - public function getParamDescription() { - $pageSet = $this->getPageSet(); - - return $pageSet->getFinalParamDescription() + array( - 'rotation' => 'Degrees to rotate image clockwise', - 'continue' => 'When more results are available, use this to continue', - ); - } - - public function getDescription() { - return 'Rotate one or more images.'; - } - public function needsToken() { return 'csrf'; } - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=imagerotate&titles=Example.jpg&rotation=90&token=123ABC', + 'action=imagerotate&titles=File:Example.jpg&rotation=90&token=123ABC' + => 'apihelp-imagerotate-example-simple', + 'action=imagerotate&generator=categorymembers&gcmtitle=Category:Flip&gcmtype=file&' . + 'rotation=180&token=123ABC' + => 'apihelp-imagerotate-example-generator', ); } } diff --git a/includes/api/ApiImport.php b/includes/api/ApiImport.php index b11348e5b1..8b7802c52d 100644 --- a/includes/api/ApiImport.php +++ b/includes/api/ApiImport.php @@ -116,36 +116,15 @@ class ApiImport extends ApiBase { ); } - public function getParamDescription() { - return array( - 'summary' => 'Import summary', - 'xml' => 'Uploaded XML file', - 'interwikisource' => 'For interwiki imports: wiki to import from', - 'interwikipage' => 'For interwiki imports: page to import', - 'fullhistory' => 'For interwiki imports: import the full history, not just the current version', - 'templates' => 'For interwiki imports: import all included templates as well', - 'namespace' => 'For interwiki imports: import to this namespace', - 'rootpage' => 'Import as subpage of this page', - ); - } - - public function getDescription() { - return array( - 'Import a page from another wiki, or an XML file.', - 'Note that the HTTP POST must be done as a file upload (i.e. using multipart/form-data) when', - 'sending a file for the "xml" parameter.' - ); - } - public function needsToken() { return 'csrf'; } - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=import&interwikisource=meta&interwikipage=Help:ParserFunctions&' . + 'action=import&interwikisource=meta&interwikipage=Help:ParserFunctions&' . 'namespace=100&fullhistory=&token=123ABC' - => 'Import [[meta:Help:Parserfunctions]] to namespace 100 with full history', + => 'apihelp-import-example-import', ); } diff --git a/includes/api/ApiLogin.php b/includes/api/ApiLogin.php index 976f4c121c..eae8ebcb9a 100644 --- a/includes/api/ApiLogin.php +++ b/includes/api/ApiLogin.php @@ -184,28 +184,12 @@ class ApiLogin extends ApiBase { ); } - public function getParamDescription() { + public function getExamplesMessages() { return array( - 'name' => 'User Name', - 'password' => 'Password', - 'domain' => 'Domain (optional)', - 'token' => 'Login token obtained in first request', - ); - } - - public function getDescription() { - return array( - 'Log in and get the authentication tokens.', - 'In the event of a successful log-in, a cookie will be attached to your session.', - 'In the event of a failed log-in, you will not be able to attempt another log-in', - 'through this method for 5 seconds. This is to prevent password guessing by', - 'automated password crackers.' - ); - } - - public function getExamples() { - return array( - 'api.php?action=login&lgname=user&lgpassword=password' + 'action=login&lgname=user&lgpassword=password' + => 'apihelp-login-example-gettoken', + 'action=login&lgname=user&lgpassword=password&lgtoken=123ABC' + => 'apihelp-login-example-login', ); } diff --git a/includes/api/ApiLogout.php b/includes/api/ApiLogout.php index 324f4b2fdf..bfdad34b66 100644 --- a/includes/api/ApiLogout.php +++ b/includes/api/ApiLogout.php @@ -46,21 +46,10 @@ class ApiLogout extends ApiBase { return false; } - public function getAllowedParams() { - return array(); - } - - public function getParamDescription() { - return array(); - } - - public function getDescription() { - return 'Log out and clear session data.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=logout' => 'Log the current user out', + 'action=logout' + => 'apihelp-logout-example-logout', ); } diff --git a/includes/api/ApiMain.php b/includes/api/ApiMain.php index a759c11600..c9e898cc8d 100644 --- a/includes/api/ApiMain.php +++ b/includes/api/ApiMain.php @@ -1158,8 +1158,10 @@ class ApiMain extends ApiBase { /** @see ApiBase::getExamplesMessages() */ public function getExamplesMessages() { return array( - 'action=help' => 'apihelp-help-example-main', - 'action=help&recursivesubmodules=1' => 'apihelp-help-example-recursive', + 'action=help' + => 'apihelp-help-example-main', + 'action=help&recursivesubmodules=1' + => 'apihelp-help-example-recursive', ); } @@ -1243,87 +1245,6 @@ class ApiMain extends ApiBase { * @{ */ - /** - * @deprecated since 1.25 - * @return array - */ - public function getParamDescription() { - return array( - 'format' => 'The format of the output', - 'action' => 'What action you would like to perform. See below for module help', - 'maxlag' => array( - 'Maximum lag can be used when MediaWiki is installed on a database replicated cluster.', - 'To save actions causing any more site replication lag, this parameter can make the client', - 'wait until the replication lag is less than the specified value.', - 'In case of a replag error, error code "maxlag" is returned, with the message like', - '"Waiting for $host: $lag seconds lagged\n".', - 'See https://www.mediawiki.org/wiki/Manual:Maxlag_parameter for more information', - ), - 'smaxage' => 'Set the s-maxage header to this many seconds. Errors are never cached', - 'maxage' => 'Set the max-age header to this many seconds. Errors are never cached', - 'assert' => 'Verify the user is logged in if set to "user", or has the bot userright if "bot"', - 'requestid' => 'Request ID to distinguish requests. This will just be output back to you', - 'servedby' => 'Include the hostname that served the request in the ' . - 'results. Unconditionally shown on error', - 'curtimestamp' => 'Include the current timestamp in the result.', - 'origin' => array( - 'When accessing the API using a cross-domain AJAX request (CORS), set this to the', - 'originating domain. This must be included in any pre-flight request, and', - 'therefore must be part of the request URI (not the POST body). This must match', - 'one of the origins in the Origin: header exactly, so it has to be set to ', - 'something like http://en.wikipedia.org or https://meta.wikimedia.org . If this', - 'parameter does not match the Origin: header, a 403 response will be returned. If', - 'this parameter matches the Origin: header and the origin is whitelisted, an', - 'Access-Control-Allow-Origin header will be set.', - ), - ); - } - - /** - * @deprecated since 1.25 - * @return array - */ - public function getDescription() { - return array( - '', - '', - '**********************************************************************************************', - '** **', - '** This is an auto-generated MediaWiki API documentation page **', - '** **', - '** Documentation and Examples: **', - '** https://www.mediawiki.org/wiki/API **', - '** **', - '**********************************************************************************************', - '', - 'Status: All features shown on this page should be working, but the API', - ' is still in active development, and may change at any time.', - ' Make sure to monitor our mailing list for any updates.', - '', - 'Erroneous requests: When erroneous requests are sent to the API, a HTTP header will be sent', - ' with the key "MediaWiki-API-Error" and then both the value of the', - ' header and the error code sent back will be set to the same value.', - '', - ' In the case of an invalid action being passed, these will have a value', - ' of "unknown_action".', - '', - ' For more information see https://www.mediawiki.org' . - '/wiki/API:Errors_and_warnings', - '', - 'Documentation: https://www.mediawiki.org/wiki/API:Main_page', - 'FAQ https://www.mediawiki.org/wiki/API:FAQ', - 'Mailing list: https://lists.wikimedia.org/mailman/listinfo/mediawiki-api', - 'Api Announcements: https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce', - 'Bugs & Requests: https://bugzilla.wikimedia.org/buglist.cgi?component=API&' . - 'bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts', - '', - '', - '', - '', - '', - ); - } - /** * Sets whether the pretty-printer should format *bold* and $italics$ * diff --git a/includes/api/ApiMove.php b/includes/api/ApiMove.php index 04e931d2f3..db0fde3486 100644 --- a/includes/api/ApiMove.php +++ b/includes/api/ApiMove.php @@ -220,37 +220,15 @@ class ApiMove extends ApiBase { ); } - public function getParamDescription() { - $p = $this->getModulePrefix(); - - return array( - 'from' => "Title of the page you want to move. Cannot be used together with {$p}fromid", - 'fromid' => "Page ID of the page you want to move. Cannot be used together with {$p}from", - 'to' => 'Title you want to rename the page to', - 'reason' => 'Reason for the move', - 'movetalk' => 'Move the talk page, if it exists', - 'movesubpages' => 'Move subpages, if applicable', - 'noredirect' => 'Don\'t create a redirect', - 'watch' => 'Add the page and the redirect to your watchlist', - 'unwatch' => 'Remove the page and the redirect from your watchlist', - 'watchlist' => 'Unconditionally add or remove the page from your ' . - 'watchlist, use preferences or do not change watch', - 'ignorewarnings' => 'Ignore any warnings' - ); - } - - public function getDescription() { - return 'Move a page.'; - } - public function needsToken() { return 'csrf'; } - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=move&from=Badtitle&to=Goodtitle&token=123ABC&' . + 'action=move&from=Badtitle&to=Goodtitle&token=123ABC&' . 'reason=Misspelled%20title&movetalk=&noredirect=' + => 'apihelp-move-example-move', ); } diff --git a/includes/api/ApiOpenSearch.php b/includes/api/ApiOpenSearch.php index 7fb045e3b2..4c72677580 100644 --- a/includes/api/ApiOpenSearch.php +++ b/includes/api/ApiOpenSearch.php @@ -91,23 +91,10 @@ class ApiOpenSearch extends ApiBase { ); } - public function getParamDescription() { + public function getExamplesMessages() { return array( - 'search' => 'Search string', - 'limit' => 'Maximum amount of results to return', - 'namespace' => 'Namespaces to search', - 'suggest' => 'Do nothing if $wgEnableOpenSearchSuggest is false', - 'format' => 'The format of the output', - ); - } - - public function getDescription() { - return 'Search the wiki using the OpenSearch protocol.'; - } - - public function getExamples() { - return array( - 'api.php?action=opensearch&search=Te' + 'action=opensearch&search=Te' + => 'apihelp-opensearch-example-te', ); } diff --git a/includes/api/ApiOptions.php b/includes/api/ApiOptions.php index b01dc3e239..c804563af3 100644 --- a/includes/api/ApiOptions.php +++ b/includes/api/ApiOptions.php @@ -153,30 +153,6 @@ class ApiOptions extends ApiBase { ); } - public function getParamDescription() { - return array( - 'reset' => 'Resets preferences to the site defaults', - 'resetkinds' => 'List of types of options to reset when the "reset" option is set', - 'change' => array( 'List of changes, formatted name=value (e.g. skin=vector), ' . - 'value cannot contain pipe characters. If no value is given (not ', - 'even an equals sign), e.g., optionname|otheroption|..., the ' . - 'option will be reset to its default value' - ), - 'optionname' => 'A name of a option which should have an optionvalue set', - 'optionvalue' => 'A value of the option specified by the optionname, ' . - 'can contain pipe characters', - ); - } - - public function getDescription() { - return array( - 'Change preferences of the current user.', - 'Only options which are registered in core or in one of installed extensions,', - 'or as options with keys prefixed with \'userjs-\' (intended to be used by user', - 'scripts), can be set.' - ); - } - public function needsToken() { return 'csrf'; } @@ -185,12 +161,15 @@ class ApiOptions extends ApiBase { return 'https://www.mediawiki.org/wiki/API:Options'; } - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=options&reset=&token=123ABC', - 'api.php?action=options&change=skin=vector|hideminor=1&token=123ABC', - 'api.php?action=options&reset=&change=skin=monobook&optionname=nickname&' . - 'optionvalue=[[User:Beau|Beau]]%20([[User_talk:Beau|talk]])&token=123ABC', + 'action=options&reset=&token=123ABC' + => 'apihelp-options-example-reset', + 'action=options&change=skin=vector|hideminor=1&token=123ABC' + => 'apihelp-options-example-change', + 'action=options&reset=&change=skin=monobook&optionname=nickname&' . + 'optionvalue=[[User:Beau|Beau]]%20([[User_talk:Beau|talk]])&token=123ABC' + => 'apihelp-options-example-complex', ); } } diff --git a/includes/api/ApiPageSet.php b/includes/api/ApiPageSet.php index 3bdecaafbd..ab705b2de4 100644 --- a/includes/api/ApiPageSet.php +++ b/includes/api/ApiPageSet.php @@ -1135,26 +1135,46 @@ class ApiPageSet extends ApiBase { public function getAllowedParams( $flags = 0 ) { $result = array( 'titles' => array( - ApiBase::PARAM_ISMULTI => true + ApiBase::PARAM_ISMULTI => true, + ApiBase::PARAM_HELP_MSG => 'api-pageset-param-titles', ), 'pageids' => array( ApiBase::PARAM_TYPE => 'integer', - ApiBase::PARAM_ISMULTI => true + ApiBase::PARAM_ISMULTI => true, + ApiBase::PARAM_HELP_MSG => 'api-pageset-param-pageids', ), 'revids' => array( ApiBase::PARAM_TYPE => 'integer', - ApiBase::PARAM_ISMULTI => true + ApiBase::PARAM_ISMULTI => true, + ApiBase::PARAM_HELP_MSG => 'api-pageset-param-revids', + ), + 'generator' => array( + ApiBase::PARAM_TYPE => null, + ApiBase::PARAM_VALUE_LINKS => array(), + ApiBase::PARAM_HELP_MSG => 'api-pageset-param-generator', + ), + 'redirects' => array( + ApiBase::PARAM_DFLT => false, + ApiBase::PARAM_HELP_MSG => $this->mAllowGenerator + ? 'api-pageset-param-redirects-generator' + : 'api-pageset-param-redirects-nogenerator', + ), + 'converttitles' => array( + ApiBase::PARAM_DFLT => false, + ApiBase::PARAM_HELP_MSG => array( + 'api-pageset-param-converttitles', + $this->getLanguage()->commaList( LanguageConverter::$languagesWithVariants ), + ), ), - 'redirects' => false, - 'converttitles' => false, ); - if ( $this->mAllowGenerator ) { - if ( $flags & ApiBase::GET_VALUES_FOR_HELP ) { - $result['generator'] = array( - ApiBase::PARAM_TYPE => $this->getGenerators() - ); - } else { - $result['generator'] = null; + + if ( !$this->mAllowGenerator ) { + unset( $result['generator'] ); + } elseif ( $flags & ApiBase::GET_VALUES_FOR_HELP ) { + $result['generator'][ApiBase::PARAM_TYPE] = $this->getGenerators(); + foreach ( $result['generator'][ApiBase::PARAM_TYPE] as $g ) { + $result['generator'][ApiBase::PARAM_TYPE][] = $g; + $result['generator'][ApiBase::PARAM_VALUE_LINKS][$g] = "Special:ApiHelp/query+$g"; } } @@ -1188,23 +1208,4 @@ class ApiPageSet extends ApiBase { return self::$generators; } - - public function getParamDescription() { - return array( - 'titles' => 'A list of titles to work on', - 'pageids' => 'A list of page IDs to work on', - 'revids' => 'A list of revision IDs to work on', - 'generator' => array( - 'Get the list of pages to work on by executing the specified query module.', - 'NOTE: generator parameter names must be prefixed with a \'g\', see examples' - ), - 'redirects' => 'Automatically resolve redirects', - 'converttitles' => array( - 'Convert titles to other variants if necessary. Only works if ' . - 'the wiki\'s content language supports variant conversion.', - 'Languages that support variant conversion include ' . - implode( ', ', LanguageConverter::$languagesWithVariants ) - ), - ); - } } diff --git a/includes/api/ApiParamInfo.php b/includes/api/ApiParamInfo.php index 5965a46f5a..d07907f009 100644 --- a/includes/api/ApiParamInfo.php +++ b/includes/api/ApiParamInfo.php @@ -173,10 +173,11 @@ class ApiParamInfo extends ApiBase { private function getModuleInfo( $module ) { $result = $this->getResult(); $ret = array(); + $path = $module->getModulePath(); $ret['name'] = $module->getModuleName(); $ret['classname'] = get_class( $module ); - $ret['path'] = $module->getModulePath(); + $ret['path'] = $path; if ( !$module->isMain() ) { $ret['group'] = $module->getParent()->getModuleManager()->getModuleGroup( $module->getModuleName() @@ -314,6 +315,29 @@ class ApiParamInfo extends ApiBase { if ( isset( $settings[ApiBase::PARAM_MIN] ) ) { $item['min'] = $settings[ApiBase::PARAM_MIN]; } + + if ( !empty( $settings[ApiBase::PARAM_HELP_MSG_INFO] ) ) { + $item['info'] = array(); + foreach ( $settings[ApiBase::PARAM_HELP_MSG_INFO] as $i ) { + $tag = array_shift( $i ); + $info = array( + 'name' => $tag, + ); + if ( count( $i ) ) { + $info['values'] = $i; + $result->setIndexedTagName( $info['values'], 'v' ); + } + $this->formatHelpMessages( $info, 'text', array( + $this->context->msg( "apihelp-{$path}-paraminfo-{$tag}" ) + ->numParams( count( $i ) ) + ->params( $this->context->getLanguage()->commaList( $i ) ) + ) ); + $result->setSubelements( $info, 'text' ); + $item['info'][] = $info; + } + $result->setIndexedTagName( $item['info'], 'i' ); + } + $ret['parameters'][] = $item; } $result->setIndexedTagName( $ret['parameters'], 'param' ); @@ -361,26 +385,10 @@ class ApiParamInfo extends ApiBase { ); } - public function getParamDescription() { - return array( - 'modules' => 'List of module names (values of the action= and format= parameters, or "main"). Can specify submodules with a \'+\'', - 'helpformat' => 'Format of help strings', - - 'querymodules' => 'List of query module names (value of prop=, meta= or list= parameter)', - 'mainmodule' => 'Get information about the main (top-level) module as well', - 'pagesetmodule' => 'Get information about the pageset module ' . - '(providing titles= and friends) as well', - 'formatmodules' => 'List of format module names (value of format= parameter)', - ); - } - - public function getDescription() { - return 'Obtain information about certain API parameters and errors.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=paraminfo&modules=parse|phpfm|query+allpages|query+siteinfo' + 'action=paraminfo&modules=parse|phpfm|query+allpages|query+siteinfo' + => 'apihelp-paraminfo-example-1', ); } diff --git a/includes/api/ApiParse.php b/includes/api/ApiParse.php index 0b1f4dbb1b..d25c87ac19 100644 --- a/includes/api/ApiParse.php +++ b/includes/api/ApiParse.php @@ -337,6 +337,14 @@ class ApiParse extends ApiBase { $result_array['modulemessages'] = array_values( array_unique( $p_result->getModuleMessages() ) ); } + if ( isset( $prop['indicators'] ) ) { + foreach ( $p_result->getIndicators() as $name => $content ) { + $indicator = array( 'name' => $name ); + ApiResult::setContent( $indicator, $content ); + $result_array['indicators'][] = $indicator; + } + } + if ( isset( $prop['iwlinks'] ) ) { $result_array['iwlinks'] = $this->formatIWLinks( $p_result->getInterwikiLinks() ); } @@ -391,6 +399,7 @@ class ApiParse extends ApiBase { 'sections' => 's', 'headitems' => 'hi', 'modules' => 'm', + 'indicators' => 'ind', 'modulescripts' => 'm', 'modulestyles' => 'm', 'modulemessages' => 'm', @@ -680,6 +689,7 @@ class ApiParse extends ApiBase { 'headitems', 'headhtml', 'modules', + 'indicators', 'iwlinks', 'wikitext', 'properties', @@ -693,7 +703,12 @@ class ApiParse extends ApiBase { 'section' => null, 'disablepp' => false, 'disableeditsection' => false, - 'generatexml' => false, + 'generatexml' => array( + ApiBase::PARAM_DFLT => false, + ApiBase::PARAM_HELP_MSG => array( + 'apihelp-parse-param-generatexml', CONTENT_MODEL_WIKITEXT + ), + ), 'preview' => false, 'sectionpreview' => false, 'disabletoc' => false, @@ -706,96 +721,16 @@ class ApiParse extends ApiBase { ); } - public function getParamDescription() { - $p = $this->getModulePrefix(); - $wikitext = CONTENT_MODEL_WIKITEXT; - - return array( - 'text' => "Text to parse. Use {$p}title or {$p}contentmodel to control the content model", - 'summary' => 'Summary to parse', - 'redirects' => "If the {$p}page or the {$p}pageid parameter is set to a redirect, resolve it", - 'title' => "Title of page the text belongs to. " . - "If omitted, {$p}contentmodel must be specified, and \"API\" will be used as the title", - 'page' => "Parse the content of this page. Cannot be used together with {$p}text and {$p}title", - 'pageid' => "Parse the content of this page. Overrides {$p}page", - 'oldid' => "Parse the content of this revision. Overrides {$p}page and {$p}pageid", - 'prop' => array( - 'Which pieces of information to get', - ' text - Gives the parsed text of the wikitext', - ' langlinks - Gives the language links in the parsed wikitext', - ' categories - Gives the categories in the parsed wikitext', - ' categorieshtml - Gives the HTML version of the categories', - ' links - Gives the internal links in the parsed wikitext', - ' templates - Gives the templates in the parsed wikitext', - ' images - Gives the images in the parsed wikitext', - ' externallinks - Gives the external links in the parsed wikitext', - ' sections - Gives the sections in the parsed wikitext', - ' revid - Adds the revision ID of the parsed page', - ' displaytitle - Adds the title of the parsed wikitext', - ' headitems - Gives items to put in the of the page', - ' headhtml - Gives parsed of the page', - ' modules - Gives the ResourceLoader modules used on the page', - ' iwlinks - Gives interwiki links in the parsed wikitext', - ' wikitext - Gives the original wikitext that was parsed', - ' properties - Gives various properties defined in the parsed wikitext', - ' limitreportdata - Gives the limit report in a structured way.', - " Gives no data, when {$p}disablepp is set.", - ' limitreporthtml - Gives the HTML version of the limit report.', - " Gives no data, when {$p}disablepp is set.", - ), - 'effectivelanglinks' => array( - 'Includes language links supplied by extensions', - '(for use with prop=langlinks)', - ), - 'pst' => array( - 'Do a pre-save transform on the input before parsing it', - "Only valid when used with {$p}text", - ), - 'onlypst' => array( - 'Do a pre-save transform (PST) on the input, but don\'t parse it', - 'Returns the same wikitext, after a PST has been applied.', - "Only valid when used with {$p}text", - ), - 'section' => 'Only retrieve the content of this section number', - 'disablepp' => 'Disable the PP Report from the parser output', - 'disableeditsection' => 'Disable edit section links from the parser output', - 'generatexml' => "Generate XML parse tree (requires contentmodel=$wikitext)", - 'preview' => 'Parse in preview mode', - 'sectionpreview' => 'Parse in section preview mode (enables preview mode too)', - 'disabletoc' => 'Disable table of contents in output', - 'contentformat' => array( - 'Content serialization format used for the input text', - "Only valid when used with {$p}text", - ), - 'contentmodel' => array( - "Content model of the input text. If omitted, ${p}title must be specified, " . - "and default will be the model of the specified ${p}title", - "Only valid when used with {$p}text", - ), - ); - } - - public function getDescription() { - $p = $this->getModulePrefix(); - - return array( - 'Parses content and returns parser output.', - 'See the various prop-Modules of action=query to get information from the current' . - 'version of a page.', - 'There are several ways to specify the text to parse:', - "1) Specify a page or revision, using {$p}page, {$p}pageid, or {$p}oldid.", - "2) Specify content explicitly, using {$p}text, {$p}title, and {$p}contentmodel.", - "3) Specify only a summary to parse. {$p}prop should be given an empty value.", - ); - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=parse&page=Project:Sandbox' => 'Parse a page', - 'api.php?action=parse&text={{Project:Sandbox}}&contentmodel=wikitext' => 'Parse wikitext', - 'api.php?action=parse&text={{PAGENAME}}&title=Test' - => 'Parse wikitext, specifying the page title', - 'api.php?action=parse&summary=Some+[[link]]&prop=' => 'Parse a summary', + 'action=parse&page=Project:Sandbox' + => 'apihelp-parse-example-page', + 'action=parse&text={{Project:Sandbox}}&contentmodel=wikitext' + => 'apihelp-parse-example-text', + 'action=parse&text={{PAGENAME}}&title=Test' + => 'apihelp-parse-example-texttitle', + 'action=parse&summary=Some+[[link]]&prop=' + => 'apihelp-parse-example-summary', ); } diff --git a/includes/api/ApiPatrol.php b/includes/api/ApiPatrol.php index 8b66781a4d..01bc568ddc 100644 --- a/includes/api/ApiPatrol.php +++ b/includes/api/ApiPatrol.php @@ -86,25 +86,16 @@ class ApiPatrol extends ApiBase { ); } - public function getParamDescription() { - return array( - 'rcid' => 'Recentchanges ID to patrol', - 'revid' => 'Revision ID to patrol', - ); - } - - public function getDescription() { - return 'Patrol a page or revision.'; - } - public function needsToken() { return 'patrol'; } - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=patrol&token=123ABC&rcid=230672766', - 'api.php?action=patrol&token=123ABC&revid=230672766' + 'action=patrol&token=123ABC&rcid=230672766' + => 'apihelp-patrol-example-rcid', + 'action=patrol&token=123ABC&revid=230672766' + => 'apihelp-patrol-example-revid', ); } diff --git a/includes/api/ApiProtect.php b/includes/api/ApiProtect.php index a3d12b7fc0..f5786e8abc 100644 --- a/includes/api/ApiProtect.php +++ b/includes/api/ApiProtect.php @@ -175,43 +175,21 @@ class ApiProtect extends ApiBase { ); } - public function getParamDescription() { - $p = $this->getModulePrefix(); - - return array( - 'title' => "Title of the page you want to (un)protect. Cannot be used together with {$p}pageid", - 'pageid' => "ID of the page you want to (un)protect. Cannot be used together with {$p}title", - 'protections' => 'List of protection levels, formatted action=group (e.g. edit=sysop)', - 'expiry' => array( - 'Expiry timestamps. If only one timestamp is ' . - 'set, it\'ll be used for all protections.', - 'Use \'infinite\', \'indefinite\', \'infinity\' or \'never\', for a never-expiring protection.' - ), - 'reason' => 'Reason for (un)protecting', - 'cascade' => array( - 'Enable cascading protection (i.e. protect pages included in this page)', - 'Ignored if not all protection levels are \'sysop\' or \'protect\'' - ), - 'watch' => 'If set, add the page being (un)protected to your watchlist', - 'watchlist' => 'Unconditionally add or remove the page from your ' . - 'watchlist, use preferences or do not change watch', - ); - } - - public function getDescription() { - return 'Change the protection level of a page.'; - } - public function needsToken() { return 'csrf'; } - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=protect&title=Main%20Page&token=123ABC&' . - 'protections=edit=sysop|move=sysop&cascade=&expiry=20070901163000|never', - 'api.php?action=protect&title=Main%20Page&token=123ABC&' . + 'action=protect&title=Main%20Page&token=123ABC&' . + 'protections=edit=sysop|move=sysop&cascade=&expiry=20070901163000|never' + => 'apihelp-protect-example-protect', + 'action=protect&title=Main%20Page&token=123ABC&' . 'protections=edit=all|move=all&reason=Lifting%20restrictions' + => 'apihelp-protect-example-unprotect', + 'action=protect&title=Main%20Page&token=123ABC&' . + 'protections=&reason=Lifting%20restrictions' + => 'apihelp-protect-example-unprotect2', ); } diff --git a/includes/api/ApiPurge.php b/includes/api/ApiPurge.php index 7667b23529..a69a0d5333 100644 --- a/includes/api/ApiPurge.php +++ b/includes/api/ApiPurge.php @@ -133,7 +133,9 @@ class ApiPurge extends ApiBase { $result = array( 'forcelinkupdate' => false, 'forcerecursivelinkupdate' => false, - 'continue' => '', + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), ); if ( $flags ) { $result += $this->getPageSet()->getFinalParams( $flags ); @@ -142,25 +144,12 @@ class ApiPurge extends ApiBase { return $result; } - public function getParamDescription() { - return $this->getPageSet()->getFinalParamDescription() - + array( - 'forcelinkupdate' => 'Update the links tables', - 'forcerecursivelinkupdate' => 'Update the links table, and update ' . - 'the links tables for any page that uses this page as a template', - 'continue' => 'When more results are available, use this to continue', - ); - } - - public function getDescription() { - return array( 'Purge the cache for the given titles.', - 'Requires a POST request if the user is not logged in.' - ); - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=purge&titles=Main_Page|API' => 'Purge the "Main Page" and the "API" page', + 'action=purge&titles=Main_Page|API' + => 'apihelp-purge-example-simple', + 'action=purge&generator=allpages&gapnamespace=0&gaplimit=10' + => 'apihelp-purge-example-generator', ); } diff --git a/includes/api/ApiQuery.php b/includes/api/ApiQuery.php index a8e20dcab2..aa0612fced 100644 --- a/includes/api/ApiQuery.php +++ b/includes/api/ApiQuery.php @@ -597,44 +597,13 @@ class ApiQuery extends ApiBase { return true; } - public function getParamDescription() { - return $this->getPageSet()->getFinalParamDescription() + array( - 'prop' => 'Which properties to get for the titles/revisions/pageids. ' . - 'Module help is available below', - 'list' => 'Which lists to get. Module help is available below', - 'meta' => 'Which metadata to get about the site. Module help is available below', - 'indexpageids' => 'Include an additional pageids section listing all returned page IDs', - 'export' => 'Export the current revisions of all given or generated pages', - 'exportnowrap' => 'Return the export XML without wrapping it in an ' . - 'XML result (same format as Special:Export). Can only be used with export', - 'iwurl' => 'Whether to get the full URL if the title is an interwiki link', - 'continue' => array( - 'When present, formats query-continue as key-value pairs that ' . - 'should simply be merged into the original request.', - 'This parameter must be set to an empty string in the initial query.', - 'This parameter is recommended for all new development, and ' . - 'will be made default in the next API version.' - ), - 'rawcontinue' => 'Currently ignored. In the future, \'continue=\' will become the ' . - 'default and this will be needed to receive the raw query-continue data.', - ); - } - - public function getDescription() { - return array( - 'Query API module allows applications to get needed pieces of data ' . - 'from the MediaWiki databases,', - 'and is loosely based on the old query.php interface.', - 'All data modifications will first have to use query to acquire a ' . - 'token to prevent abuse from malicious sites.' - ); - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&prop=revisions&meta=siteinfo&' . - 'titles=Main%20Page&rvprop=user|comment&continue=', - 'api.php?action=query&generator=allpages&gapprefix=API/&prop=revisions&continue=', + 'action=query&prop=revisions&meta=siteinfo&' . + 'titles=Main%20Page&rvprop=user|comment&continue=' + => 'apihelp-query-example-revisions', + 'action=query&generator=allpages&gapprefix=API/&prop=revisions&continue=' + => 'apihelp-query-example-allpages', ); } diff --git a/includes/api/ApiQueryAllCategories.php b/includes/api/ApiQueryAllCategories.php index 79fab7275b..36c2088758 100644 --- a/includes/api/ApiQueryAllCategories.php +++ b/includes/api/ApiQueryAllCategories.php @@ -156,7 +156,9 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase { public function getAllowedParams() { return array( 'from' => null, - 'continue' => null, + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), 'to' => null, 'prefix' => null, 'dir' => array( @@ -189,32 +191,12 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase { ); } - public function getParamDescription() { - return array( - 'from' => 'The category to start enumerating from', - 'continue' => 'When more results are available, use this to continue', - 'to' => 'The category to stop enumerating at', - 'prefix' => 'Search for all category titles that begin with this value', - 'dir' => 'Direction to sort in', - 'min' => 'Minimum number of category members', - 'max' => 'Maximum number of category members', - 'limit' => 'How many categories to return', - 'prop' => array( - 'Which properties to get', - ' size - Adds number of pages in the category', - ' hidden - Tags categories that are hidden with __HIDDENCAT__', - ), - ); - } - - public function getDescription() { - return 'Enumerate all categories.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&list=allcategories&acprop=size', - 'api.php?action=query&generator=allcategories&gacprefix=List&prop=info', + 'action=query&list=allcategories&acprop=size' + => 'apihelp-query+allcategories-example-size', + 'action=query&generator=allcategories&gacprefix=List&prop=info' + => 'apihelp-query+allcategories-example-generator', ); } diff --git a/includes/api/ApiQueryAllImages.php b/includes/api/ApiQueryAllImages.php index 9dc5f69a80..95ad6ef4b7 100644 --- a/includes/api/ApiQueryAllImages.php +++ b/includes/api/ApiQueryAllImages.php @@ -300,7 +300,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase { } public function getAllowedParams() { - return array( + $ret = array( 'sort' => array( ApiBase::PARAM_DFLT => 'name', ApiBase::PARAM_TYPE => array( @@ -321,7 +321,9 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase { ), 'from' => null, 'to' => null, - 'continue' => null, + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), 'start' => array( ApiBase::PARAM_TYPE => 'timestamp' ), @@ -353,7 +355,9 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase { 'nobots' ) ), - 'mime' => null, + 'mime' => array( + ApiBase::PARAM_DFLT => null, + ), 'limit' => array( ApiBase::PARAM_DFLT => 10, ApiBase::PARAM_TYPE => 'limit', @@ -362,57 +366,26 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase { ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 ), ); - } - public function getParamDescription() { - $p = $this->getModulePrefix(); + if ( $this->getConfig()->get( 'MiserMode' ) ) { + $ret['mime'][ApiBase::PARAM_HELP_MSG] = 'api-help-param-disabled-in-miser-mode'; + } - return array( - 'sort' => 'Property to sort by', - 'dir' => 'The direction in which to list', - 'from' => "The image title to start enumerating from. Can only be used with {$p}sort=name", - 'to' => "The image title to stop enumerating at. Can only be used with {$p}sort=name", - 'continue' => 'When more results are available, use this to continue', - 'start' => "The timestamp to start enumerating from. Can only be used with {$p}sort=timestamp", - 'end' => "The timestamp to end enumerating. Can only be used with {$p}sort=timestamp", - 'prop' => ApiQueryImageInfo::getPropertyDescriptions( $this->propertyFilter ), - 'prefix' => "Search for all image titles that begin with this " . - "value. Can only be used with {$p}sort=name", - 'minsize' => 'Limit to images with at least this many bytes', - 'maxsize' => 'Limit to images with at most this many bytes', - 'sha1' => "SHA1 hash of image. Overrides {$p}sha1base36", - 'sha1base36' => 'SHA1 hash of image in base 36 (used in MediaWiki)', - 'user' => "Only return files uploaded by this user. Can only be used " . - "with {$p}sort=timestamp. Cannot be used together with {$p}filterbots", - 'filterbots' => "How to filter files uploaded by bots. Can only be " . - "used with {$p}sort=timestamp. Cannot be used together with {$p}user", - 'mime' => 'What MIME type to search for. e.g. image/jpeg. Disabled in Miser Mode', - 'limit' => 'How many images in total to return', - ); + return $ret; } private $propertyFilter = array( 'archivename', 'thumbmime', 'uploadwarning' ); - public function getDescription() { - return 'Enumerate all images sequentially.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&list=allimages&aifrom=B' => array( - 'Simple Use', - 'Show a list of files starting at the letter "B"', - ), - 'api.php?action=query&list=allimages&aiprop=user|timestamp|url&' . - 'aisort=timestamp&aidir=older' => array( - 'Simple Use', - 'Show a list of recently uploaded files similar to Special:NewFiles', - ), - 'api.php?action=query&generator=allimages&gailimit=4&' . - 'gaifrom=T&prop=imageinfo' => array( - 'Using as Generator', - 'Show info about 4 files starting at the letter "T"', - ), + 'action=query&list=allimages&aifrom=B' + => 'apihelp-query+allimages-example-B', + 'action=query&list=allimages&aiprop=user|timestamp|url&' . + 'aisort=timestamp&aidir=older' + => 'apihelp-query+allimages-example-recent', + 'action=query&generator=allimages&gailimit=4&' . + 'gaifrom=T&prop=imageinfo' + => 'apihelp-query+allimages-example-generator', ); } diff --git a/includes/api/ApiQueryAllLinks.php b/includes/api/ApiQueryAllLinks.php index 903dee42d4..075d199a5d 100644 --- a/includes/api/ApiQueryAllLinks.php +++ b/includes/api/ApiQueryAllLinks.php @@ -31,13 +31,12 @@ */ class ApiQueryAllLinks extends ApiQueryGeneratorBase { - private $table, $tablePrefix, $indexTag, - $description, $descriptionWhat, $descriptionTargets, $descriptionLinking; + private $table, $tablePrefix, $indexTag; private $fieldTitle = 'title'; private $dfltNamespace = NS_MAIN; private $hasNamespace = true; private $useIndex = null; - private $props = array(), $propHelp = array(); + private $props = array(); public function __construct( ApiQuery $query, $moduleName ) { switch ( $moduleName ) { @@ -47,10 +46,6 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { $this->tablePrefix = 'pl_'; $this->useIndex = 'pl_namespace'; $this->indexTag = 'l'; - $this->description = 'Enumerate all links that point to a given namespace'; - $this->descriptionWhat = 'link'; - $this->descriptionTargets = 'linked titles'; - $this->descriptionLinking = 'linking'; break; case 'alltransclusions': $prefix = 'at'; @@ -59,11 +54,6 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { $this->dfltNamespace = NS_TEMPLATE; $this->useIndex = 'tl_namespace'; $this->indexTag = 't'; - $this->description = - 'List all transclusions (pages embedded using {{x}}), including non-existing'; - $this->descriptionWhat = 'transclusion'; - $this->descriptionTargets = 'transcluded titles'; - $this->descriptionLinking = 'transcluding'; break; case 'allfileusages': $prefix = 'af'; @@ -73,28 +63,16 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { $this->dfltNamespace = NS_FILE; $this->hasNamespace = false; $this->indexTag = 'f'; - $this->description = 'List all file usages, including non-existing'; - $this->descriptionWhat = 'file'; - $this->descriptionTargets = 'file titles'; - $this->descriptionLinking = 'using'; break; case 'allredirects': $prefix = 'ar'; $this->table = 'redirect'; $this->tablePrefix = 'rd_'; $this->indexTag = 'r'; - $this->description = 'List all redirects to a namespace'; - $this->descriptionWhat = 'redirect'; - $this->descriptionTargets = 'target pages'; - $this->descriptionLinking = 'redirecting'; $this->props = array( 'fragment' => 'rd_fragment', 'interwiki' => 'rd_interwiki', ); - $this->propHelp = array( - ' fragment - Adds the fragment from the redirect, if any', - ' interwiki - Adds the interwiki prefix from the redirect, if any', - ); break; default: ApiBase::dieDebug( __METHOD__, 'Unknown module name' ); @@ -262,7 +240,9 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { public function getAllowedParams() { $allowedParams = array( - 'continue' => null, + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), 'from' => null, 'to' => null, 'prefix' => null, @@ -300,59 +280,20 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { return $allowedParams; } - public function getParamDescription() { - $p = $this->getModulePrefix(); - $what = $this->descriptionWhat; - $targets = $this->descriptionTargets; - $linking = $this->descriptionLinking; - $paramDescription = array( - 'from' => "The title of the $what to start enumerating from", - 'to' => "The title of the $what to stop enumerating at", - 'prefix' => "Search for all $targets that begin with this value", - 'unique' => array( - "Only show distinct $targets. Cannot be used with {$p}prop=" . - join( '|', array_keys( array( 'ids' => 1 ) + $this->props ) ) . '.', - 'When used as a generator, yields target pages instead of source pages.', - ), - 'prop' => array( - 'What pieces of information to include', - " ids - Adds the pageid of the $linking page (Cannot be used with {$p}unique)", - " title - Adds the title of the $what", - ), - 'namespace' => 'The namespace to enumerate', - 'limit' => 'How many total items to return', - 'continue' => 'When more results are available, use this to continue', - 'dir' => 'The direction in which to list', - ); - foreach ( $this->propHelp as $help ) { - $paramDescription['prop'][] = "$help (Cannot be used with {$p}unique)"; - } - if ( !$this->hasNamespace ) { - unset( $paramDescription['namespace'] ); - } - - return $paramDescription; - } - - public function getDescription() { - return $this->description; - } - - public function getExamples() { + public function getExamplesMessages() { $p = $this->getModulePrefix(); $name = $this->getModuleName(); - $what = $this->descriptionWhat; - $targets = $this->descriptionTargets; + $path = $this->getModulePath(); return array( - "api.php?action=query&list={$name}&{$p}from=B&{$p}prop=ids|title" - => "List $targets with page ids they are from, including missing ones. Start at B", - "api.php?action=query&list={$name}&{$p}unique=&{$p}from=B" - => "List unique $targets", - "api.php?action=query&generator={$name}&g{$p}unique=&g{$p}from=B" - => "Gets all $targets, marking the missing ones", - "api.php?action=query&generator={$name}&g{$p}from=B" - => "Gets pages containing the {$what}s", + "action=query&list={$name}&{$p}from=B&{$p}prop=ids|title" + => "apihelp-$path-example-B", + "action=query&list={$name}&{$p}unique=&{$p}from=B" + => "apihelp-$path-example-unique", + "action=query&generator={$name}&g{$p}unique=&g{$p}from=B" + => "apihelp-$path-example-unique-generator", + "action=query&generator={$name}&g{$p}from=B" + => "apihelp-$path-example-generator", ); } diff --git a/includes/api/ApiQueryAllMessages.php b/includes/api/ApiQueryAllMessages.php index a75a16fcbc..7e0ceff3d9 100644 --- a/includes/api/ApiQueryAllMessages.php +++ b/includes/api/ApiQueryAllMessages.php @@ -235,35 +235,12 @@ class ApiQueryAllMessages extends ApiQueryBase { ); } - public function getParamDescription() { + public function getExamplesMessages() { return array( - 'messages' => 'Which messages to output. "*" (default) means all messages', - 'prop' => 'Which properties to get', - 'enableparser' => array( 'Set to enable parser, will preprocess the wikitext of message', - 'Will substitute magic words, handle templates etc.' ), - 'nocontent' => 'If set, do not include the content of the messages in the output.', - 'includelocal' => array( "Also include local messages, i.e. messages that don't exist in the software but do exist as a MediaWiki: page.", - "This lists all MediaWiki: pages, so it will also list those that aren't 'really' messages such as Common.js", - ), - 'title' => 'Page name to use as context when parsing message (for enableparser option)', - 'args' => 'Arguments to be substituted into message', - 'prefix' => 'Return messages with this prefix', - 'filter' => 'Return only messages with names that contain this string', - 'customised' => 'Return only messages in this customisation state', - 'lang' => 'Return messages in this language', - 'from' => 'Return messages starting at this message', - 'to' => 'Return messages ending at this message', - ); - } - - public function getDescription() { - return 'Return messages from this site.'; - } - - public function getExamples() { - return array( - 'api.php?action=query&meta=allmessages&refix=ipb-', - 'api.php?action=query&meta=allmessages&ammessages=august|mainpage&amlang=de', + 'action=query&meta=allmessages&refix=ipb-' + => 'apihelp-query+allmessages-example-ipb', + 'action=query&meta=allmessages&ammessages=august|mainpage&amlang=de' + => 'apihelp-query+allmessages-example-de', ); } diff --git a/includes/api/ApiQueryAllPages.php b/includes/api/ApiQueryAllPages.php index b7bd65a53c..d7d71b3e60 100644 --- a/includes/api/ApiQueryAllPages.php +++ b/includes/api/ApiQueryAllPages.php @@ -227,7 +227,9 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase { public function getAllowedParams() { return array( 'from' => null, - 'continue' => null, + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), 'to' => null, 'prefix' => null, 'namespace' => array( @@ -297,54 +299,15 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase { ); } - public function getParamDescription() { - $p = $this->getModulePrefix(); - - return array( - 'from' => 'The page title to start enumerating from', - 'continue' => 'When more results are available, use this to continue', - 'to' => 'The page title to stop enumerating at', - 'prefix' => 'Search for all page titles that begin with this value', - 'namespace' => 'The namespace to enumerate', - 'filterredir' => 'Which pages to list', - 'dir' => 'The direction in which to list', - 'minsize' => 'Limit to pages with at least this many bytes', - 'maxsize' => 'Limit to pages with at most this many bytes', - 'prtype' => 'Limit to protected pages only', - 'prlevel' => "The protection level (must be used with {$p}prtype= parameter)", - 'prfiltercascade' - => "Filter protections based on cascadingness (ignored when {$p}prtype isn't set)", - 'filterlanglinks' => array( - 'Filter based on whether a page has langlinks', - 'Note that this may not consider langlinks added by extensions.', - ), - 'limit' => 'How many total pages to return.', - 'prexpiry' => array( - 'Which protection expiry to filter the page on', - ' indefinite - Get only pages with indefinite protection expiry', - ' definite - Get only pages with a definite (specific) protection expiry', - ' all - Get pages with any protections expiry' - ), - ); - } - - public function getDescription() { - return 'Enumerate all pages sequentially in a given namespace.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&list=allpages&apfrom=B' => array( - 'Simple Use', - 'Show a list of pages starting at the letter "B"', - ), - 'api.php?action=query&generator=allpages&gaplimit=4&gapfrom=T&prop=info' => array( - 'Using as Generator', - 'Show info about 4 pages starting at the letter "T"', - ), - 'api.php?action=query&generator=allpages&gaplimit=2&' . + 'action=query&list=allpages&apfrom=B' + => 'apihelp-query+allpages-example-B', + 'action=query&generator=allpages&gaplimit=4&gapfrom=T&prop=info' + => 'apihelp-query+allpages-example-generator', + 'action=query&generator=allpages&gaplimit=2&' . 'gapfilterredir=nonredirects&gapfrom=Re&prop=revisions&rvprop=content' - => array( 'Show content of first 2 non-redirect pages beginning at "Re"' ) + => 'apihelp-query+allpages-example-generator-revisions', ); } diff --git a/includes/api/ApiQueryAllUsers.php b/includes/api/ApiQueryAllUsers.php index e1cc75a637..d9a173d685 100644 --- a/includes/api/ApiQueryAllUsers.php +++ b/includes/api/ApiQueryAllUsers.php @@ -352,43 +352,20 @@ class ApiQueryAllUsers extends ApiQueryBase { ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 ), 'witheditsonly' => false, - 'activeusers' => false, - ); - } - - public function getParamDescription() { - return array( - 'from' => 'The user name to start enumerating from', - 'to' => 'The user name to stop enumerating at', - 'prefix' => 'Search for all users that begin with this value', - 'dir' => 'Direction to sort in', - 'group' => 'Limit users to given group name(s)', - 'excludegroup' => 'Exclude users in given group name(s)', - 'rights' => 'Limit users to given right(s) (does not include rights ' . - 'granted by implicit or auto-promoted groups like *, user, or autoconfirmed)', - 'prop' => array( - 'What pieces of information to include.', - ' blockinfo - Adds the information about a current block on the user', - ' groups - Lists groups that the user is in. This uses ' . - 'more server resources and may return fewer results than the limit', - ' implicitgroups - Lists all the groups the user is automatically in', - ' rights - Lists rights that the user has', - ' editcount - Adds the edit count of the user', - ' registration - Adds the timestamp of when the user registered if available (may be blank)', + 'activeusers' => array( + ApiBase::PARAM_DFLT => false, + ApiBase::PARAM_HELP_MSG => array( + 'apihelp-query+allusers-param-activeusers', + $this->getConfig()->get( 'ActiveUserDays' ) + ), ), - 'limit' => 'How many total user names to return', - 'witheditsonly' => 'Only list users who have made edits', - 'activeusers' => "Only list users active in the last {$this->getConfig()->get( 'ActiveUserDays' )} days(s)" ); } - public function getDescription() { - return 'Enumerate all registered users.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&list=allusers&aufrom=Y', + 'action=query&list=allusers&aufrom=Y' + => 'apihelp-query+allusers-example-Y', ); } diff --git a/includes/api/ApiQueryBacklinks.php b/includes/api/ApiQueryBacklinks.php index f00a6e7f33..a0786b05c6 100644 --- a/includes/api/ApiQueryBacklinks.php +++ b/includes/api/ApiQueryBacklinks.php @@ -512,7 +512,9 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase { 'pageid' => array( ApiBase::PARAM_TYPE => 'integer', ), - 'continue' => null, + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), 'namespace' => array( ApiBase::PARAM_ISMULTI => true, ApiBase::PARAM_TYPE => 'namespace' @@ -548,59 +550,25 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase { return $retval; } - public function getParamDescription() { - $retval = array( - 'title' => "Title to search. Cannot be used together with {$this->bl_code}pageid", - 'pageid' => "Pageid to search. Cannot be used together with {$this->bl_code}title", - 'continue' => 'When more results are available, use this to continue', - 'namespace' => 'The namespace to enumerate', - 'dir' => 'The direction in which to list', - ); - if ( $this->getModuleName() != 'embeddedin' ) { - return array_merge( $retval, array( - 'redirect' => 'If linking page is a redirect, find all pages ' . - 'that link to that redirect as well. Maximum limit is halved.', - 'filterredir' => 'How to filter for redirects. If set to ' . - "nonredirects when {$this->bl_code}redirect is enabled, " . - 'this is only applied to the second level', - 'limit' => 'How many total pages to return. If ' . - "{$this->bl_code}redirect is enabled, limit applies to each " . - 'level separately (which means you may get up to 2 * limit results).' - ) ); - } - - return array_merge( $retval, array( - 'filterredir' => 'How to filter for redirects', - 'limit' => 'How many total pages to return' - ) ); - } - - public function getDescription() { - switch ( $this->getModuleName() ) { - case 'backlinks': - return 'Find all pages that link to the given page.'; - case 'embeddedin': - return 'Find all pages that embed (transclude) the given title.'; - case 'imageusage': - return 'Find all pages that use the given image title.'; - default: - ApiBase::dieDebug( __METHOD__, 'Unknown module name.' ); - } - } - - public function getExamples() { + public function getExamplesMessages() { static $examples = array( 'backlinks' => array( - 'api.php?action=query&list=backlinks&bltitle=Main%20Page', - 'api.php?action=query&generator=backlinks&gbltitle=Main%20Page&prop=info' + 'action=query&list=backlinks&bltitle=Main%20Page' + => 'apihelp-query+backlinks-example-simple', + 'action=query&generator=backlinks&gbltitle=Main%20Page&prop=info' + => 'apihelp-query+backlinks-example-generator', ), 'embeddedin' => array( - 'api.php?action=query&list=embeddedin&eititle=Template:Stub', - 'api.php?action=query&generator=embeddedin&geititle=Template:Stub&prop=info' + 'action=query&list=embeddedin&eititle=Template:Stub' + => 'apihelp-query+embeddedin-example-simple', + 'action=query&generator=embeddedin&geititle=Template:Stub&prop=info' + => 'apihelp-query+embeddedin-example-generator', ), 'imageusage' => array( - 'api.php?action=query&list=imageusage&iutitle=File:Albert%20Einstein%20Head.jpg', - 'api.php?action=query&generator=imageusage&giutitle=File:Albert%20Einstein%20Head.jpg&prop=info' + 'action=query&list=imageusage&iutitle=File:Albert%20Einstein%20Head.jpg' + => 'apihelp-query+imageusage-example-simple', + 'action=query&generator=imageusage&giutitle=File:Albert%20Einstein%20Head.jpg&prop=info' + => 'apihelp-query+imageusage-example-generator', ) ); diff --git a/includes/api/ApiQueryBacklinksprop.php b/includes/api/ApiQueryBacklinksprop.php index 2458a26517..7804dbf739 100644 --- a/includes/api/ApiQueryBacklinksprop.php +++ b/includes/api/ApiQueryBacklinksprop.php @@ -40,15 +40,13 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase { 'code' => 'rd', 'prefix' => 'rd', 'linktable' => 'redirect', - 'what' => 'redirects to', - 'description' => 'Returns all redirects to the given pages.', 'props' => array( - 'fragment' => 'Fragment of each redirect, if any', + 'fragment', ), 'showredirects' => false, 'show' => array( - 'fragment' => 'Only show redirects with a fragment', - '!fragment' => 'Only show redirects without a fragment', + 'fragment', + '!fragment', ), ), 'linkshere' => array( @@ -56,8 +54,6 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase { 'prefix' => 'pl', 'linktable' => 'pagelinks', 'from_namespace' => true, - 'what' => 'pages linking to', - 'description' => 'Find all pages that link to the given pages.', 'showredirects' => true, ), 'transcludedin' => array( @@ -65,8 +61,6 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase { 'prefix' => 'tl', 'linktable' => 'templatelinks', 'from_namespace' => true, - 'what' => 'pages transcluding', - 'description' => 'Find all pages that transclude the given pages.', 'showredirects' => true, ), 'fileusage' => array( @@ -75,9 +69,7 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase { 'linktable' => 'imagelinks', 'from_namespace' => true, 'to_namespace' => NS_FILE, - 'what' => 'pages using', 'exampletitle' => 'File:Example.jpg', - 'description' => 'Find all pages that use the given files.', 'showredirects' => true, ), ); @@ -348,6 +340,7 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase { ApiBase::PARAM_ISMULTI => true, ApiBase::PARAM_TYPE => 'namespace', ), + 'show' => null, // Will be filled/removed below 'limit' => array( ApiBase::PARAM_DFLT => 10, ApiBase::PARAM_TYPE => 'limit', @@ -355,16 +348,24 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase { ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1, ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 ), - 'continue' => null, + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), ); + if ( empty( $settings['from_namespace'] ) && $this->getConfig()->get( 'MiserMode' ) ) { + $ret['namespace'][ApiBase::PARAM_HELP_MSG_APPEND] = array( + 'api-help-param-limited-in-miser-mode', + ); + } + if ( !empty( $settings['showredirects'] ) ) { $ret['prop'][ApiBase::PARAM_TYPE][] = 'redirect'; $ret['prop'][ApiBase::PARAM_DFLT] .= '|redirect'; } if ( isset( $settings['props'] ) ) { $ret['prop'][ApiBase::PARAM_TYPE] = array_merge( - $ret['prop'][ApiBase::PARAM_TYPE], array_keys( $settings['props'] ) + $ret['prop'][ApiBase::PARAM_TYPE], $settings['props'] ); } @@ -374,93 +375,32 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase { $show[] = '!redirect'; } if ( isset( $settings['show'] ) ) { - $show = array_merge( $show, array_keys( $settings['show'] ) ); + $show = array_merge( $show, $settings['show'] ); } if ( $show ) { $ret['show'] = array( ApiBase::PARAM_TYPE => $show, ApiBase::PARAM_ISMULTI => true, ); + } else { + unset( $ret['show'] ); } return $ret; } - public function getParamDescription() { - $settings = self::$settings[$this->getModuleName()]; - $p = $this->getModulePrefix(); - - $ret = array( - 'prop' => array( - 'Which properties to get:', - ), - 'show' => array( - 'Show only items that meet this criteria.', - ), - 'namespace' => 'Only include pages in these namespaces', - 'limit' => 'How many to return', - 'continue' => 'When more results are available, use this to continue', - ); - - if ( empty( $settings['from_namespace'] ) && $this->getConfig()->get( 'MiserMode' ) ) { - $ret['namespace'] = array( - $ret['namespace'], - "NOTE: Due to \$wgMiserMode, using this may result in fewer than \"{$p}limit\" results", - 'returned before continuing; in extreme cases, zero results may be returned.', - ); - if ( isset( $ret['type'] ) ) { - $ret['namespace'][] = "Note that you can use {$p}type=subcat or {$p}type=file " . - "instead of {$p}namespace=14 or 6."; - } - } - - $props = array( - 'pageid' => 'Adds the ID of page', - 'title' => 'Adds the title and namespace ID of the page', - ); - if ( !empty( $settings['showredirects'] ) ) { - $props['redirect'] = 'Indicate if the page is a redirect'; - } - if ( isset( $settings['props'] ) ) { - $props += $settings['props']; - } - foreach ( $props as $k => $v ) { - $ret['props'][] = sprintf( "%-9s - %s", $k, $v ); - } - - $show = array(); - if ( !empty( $settings['showredirects'] ) ) { - $show += array( - 'redirect' => 'Only show redirects', - '!redirect' => 'Only show non-redirects', - ); - } - if ( isset( $settings['show'] ) ) { - $show += $settings['show']; - } - foreach ( $show as $k => $v ) { - $ret['show'][] = sprintf( "%-9s - %s", $k, $v ); - } - - return $ret; - } - - public function getDescription() { - return self::$settings[$this->getModuleName()]['description']; - } - - public function getExamples() { + public function getExamplesMessages() { $settings = self::$settings[$this->getModuleName()]; $name = $this->getModuleName(); - $what = $settings['what']; + $path = $this->getModulePath(); $title = isset( $settings['exampletitle'] ) ? $settings['exampletitle'] : 'Main Page'; $etitle = rawurlencode( $title ); return array( - "api.php?action=query&prop={$name}&titles={$etitle}" - => "Get a list of $what [[$title]]", - "api.php?action=query&generator={$name}&titles={$etitle}&prop=info" - => "Get information about $what [[$title]]", + "action=query&prop={$name}&titles={$etitle}" + => "apihelp-$path-example-simple", + "action=query&generator={$name}&titles={$etitle}&prop=info" + => "apihelp-$path-example-generator", ); } diff --git a/includes/api/ApiQueryBlocks.php b/includes/api/ApiQueryBlocks.php index 33b25fd927..159b1c8927 100644 --- a/includes/api/ApiQueryBlocks.php +++ b/includes/api/ApiQueryBlocks.php @@ -268,6 +268,8 @@ class ApiQueryBlocks extends ApiQueryBase { } public function getAllowedParams() { + $blockCIDRLimit = $this->getConfig()->get( 'BlockCIDRLimit' ); + return array( 'start' => array( ApiBase::PARAM_TYPE => 'timestamp' @@ -280,7 +282,8 @@ class ApiQueryBlocks extends ApiQueryBase { 'newer', 'older' ), - ApiBase::PARAM_DFLT => 'older' + ApiBase::PARAM_DFLT => 'older', + ApiBase::PARAM_HELP_MSG => 'api-help-param-direction', ), 'ids' => array( ApiBase::PARAM_TYPE => 'integer', @@ -289,7 +292,13 @@ class ApiQueryBlocks extends ApiQueryBase { 'users' => array( ApiBase::PARAM_ISMULTI => true ), - 'ip' => null, + 'ip' => array( + ApiBase::PARAM_HELP_MSG => array( + 'apihelp-query+blocks-param-ip', + $blockCIDRLimit['IPv4'], + $blockCIDRLimit['IPv6'], + ), + ), 'limit' => array( ApiBase::PARAM_DFLT => 10, ApiBase::PARAM_TYPE => 'limit', @@ -326,56 +335,18 @@ class ApiQueryBlocks extends ApiQueryBase { ), ApiBase::PARAM_ISMULTI => true ), - 'continue' => null, - ); - } - - public function getParamDescription() { - $blockCIDRLimit = $this->getConfig()->get( 'BlockCIDRLimit' ); - $p = $this->getModulePrefix(); - - return array( - 'start' => 'The timestamp to start enumerating from', - 'end' => 'The timestamp to stop enumerating at', - 'dir' => $this->getDirectionDescription( $p ), - 'ids' => 'List of block IDs to list (optional)', - 'users' => 'List of users to search for (optional)', - 'ip' => array( - 'Get all blocks applying to this IP or CIDR range, including range blocks.', - "Cannot be used together with bkusers. CIDR ranges broader than " . - "IPv4/{$blockCIDRLimit['IPv4']} or IPv6/{$blockCIDRLimit['IPv6']} " . - "are not accepted" - ), - 'limit' => 'The maximum amount of blocks to list', - 'prop' => array( - 'Which properties to get', - ' id - Adds the ID of the block', - ' user - Adds the username of the blocked user', - ' userid - Adds the user ID of the blocked user', - ' by - Adds the username of the blocking user', - ' byid - Adds the user ID of the blocking user', - ' timestamp - Adds the timestamp of when the block was given', - ' expiry - Adds the timestamp of when the block expires', - ' reason - Adds the reason given for the block', - ' range - Adds the range of IPs affected by the block', - ' flags - Tags the ban with (autoblock, anononly, etc)', + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', ), - 'show' => array( - 'Show only items that meet this criteria.', - "For example, to see only indefinite blocks on IPs, set {$p}show=ip|!temp" - ), - 'continue' => 'When more results are available, use this to continue', ); } - public function getDescription() { - return 'List all blocked users and IP addresses.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&list=blocks', - 'api.php?action=query&list=blocks&bkusers=Alice|Bob' + 'action=query&list=blocks' + => 'apihelp-query+blocks-example-simple', + 'action=query&list=blocks&bkusers=Alice|Bob' + => 'apihelp-query+blocks-example-users', ); } diff --git a/includes/api/ApiQueryCategories.php b/includes/api/ApiQueryCategories.php index 1926dd0946..7518dadbc6 100644 --- a/includes/api/ApiQueryCategories.php +++ b/includes/api/ApiQueryCategories.php @@ -202,7 +202,9 @@ class ApiQueryCategories extends ApiQueryGeneratorBase { ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1, ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 ), - 'continue' => null, + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), 'categories' => array( ApiBase::PARAM_ISMULTI => true, ), @@ -216,34 +218,12 @@ class ApiQueryCategories extends ApiQueryGeneratorBase { ); } - public function getParamDescription() { - return array( - 'prop' => array( - 'Which additional properties to get for each category', - ' sortkey - Adds the sortkey (hexadecimal string) and sortkey prefix', - ' (human-readable part) for the category', - ' timestamp - Adds timestamp of when the category was added', - ' hidden - Tags categories that are hidden with __HIDDENCAT__', - ), - 'limit' => 'How many categories to return', - 'show' => 'Which kind of categories to show', - 'continue' => 'When more results are available, use this to continue', - 'categories' => 'Only list these categories. Useful for checking ' . - 'whether a certain page is in a certain category', - 'dir' => 'The direction in which to list', - ); - } - - public function getDescription() { - return 'List all categories the page(s) belong to.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&prop=categories&titles=Albert%20Einstein' - => 'Get a list of categories [[Albert Einstein]] belongs to', - 'api.php?action=query&generator=categories&titles=Albert%20Einstein&prop=info' - => 'Get information about all categories used in the [[Albert Einstein]]', + 'action=query&prop=categories&titles=Albert%20Einstein' + => 'apihelp-query+categories-example-simple', + 'action=query&generator=categories&titles=Albert%20Einstein&prop=info' + => 'apihelp-query+categories-example-generator', ); } diff --git a/includes/api/ApiQueryCategoryInfo.php b/includes/api/ApiQueryCategoryInfo.php index 3dd4c6563e..8f9b229af1 100644 --- a/includes/api/ApiQueryCategoryInfo.php +++ b/includes/api/ApiQueryCategoryInfo.php @@ -103,24 +103,19 @@ class ApiQueryCategoryInfo extends ApiQueryBase { public function getAllowedParams() { return array( - 'continue' => null, + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), ); } - public function getParamDescription() { + public function getExamplesMessages() { return array( - 'continue' => 'When more results are available, use this to continue', + 'action=query&prop=categoryinfo&titles=Category:Foo|Category:Bar' + => 'apihelp-query+categoryinfo-example-simple', ); } - public function getDescription() { - return 'Returns information about the given categories.'; - } - - public function getExamples() { - return 'api.php?action=query&prop=categoryinfo&titles=Category:Foo|Category:Bar'; - } - public function getHelpUrls() { return 'https://www.mediawiki.org/wiki/API:Properties#categoryinfo_.2F_ci'; } diff --git a/includes/api/ApiQueryCategoryMembers.php b/includes/api/ApiQueryCategoryMembers.php index a88a9cb1f9..5b4a766744 100644 --- a/includes/api/ApiQueryCategoryMembers.php +++ b/includes/api/ApiQueryCategoryMembers.php @@ -275,7 +275,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase { } public function getAllowedParams() { - return array( + $ret = array( 'title' => array( ApiBase::PARAM_TYPE => 'string', ), @@ -307,7 +307,9 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase { 'file' ) ), - 'continue' => null, + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), 'limit' => array( ApiBase::PARAM_TYPE => 'limit', ApiBase::PARAM_DFLT => 10, @@ -351,67 +353,22 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase { ApiBase::PARAM_DEPRECATED => true, ), ); - } - - public function getParamDescription() { - $p = $this->getModulePrefix(); - $desc = array( - 'title' => "Which category to enumerate (required). Must include " . - "'Category:' prefix. Cannot be used together with {$p}pageid", - 'pageid' => "Page ID of the category to enumerate. Cannot be used together with {$p}title", - 'prop' => array( - 'What pieces of information to include', - ' ids - Adds the page ID', - ' title - Adds the title and namespace ID of the page', - ' sortkey - Adds the sortkey used for sorting in the category (hexadecimal string)', - ' sortkeyprefix - Adds the sortkey prefix used for sorting in the ' . - 'category (human-readable part of the sortkey)', - ' type - Adds the type that the page has been categorised as (page, subcat or file)', - ' timestamp - Adds the timestamp of when the page was included', - ), - 'namespace' => 'Only include pages in these namespaces', - 'type' => "What type of category members to include. Ignored when {$p}sort=timestamp is set", - 'sort' => 'Property to sort by', - 'dir' => 'In which direction to sort', - 'start' => "Timestamp to start listing from. Can only be used with {$p}sort=timestamp", - 'end' => "Timestamp to end listing at. Can only be used with {$p}sort=timestamp", - 'starthexsortkey' => "Sortkey to start listing from, as returned by prop=sortkey. " . - "Can only be used with {$p}sort=sortkey", - 'endhexsortkey' => "Sortkey to end listing from, as returned by prop=sortkey. " . - "Can only be used with {$p}sort=sortkey", - 'startsortkeyprefix' => "Sortkey prefix to start listing from. Can " . - "only be used with {$p}sort=sortkey. Overrides {$p}starthexsortkey", - 'endsortkeyprefix' => "Sortkey prefix to end listing BEFORE (not at, " . - "if this value occurs it will not be included!). Can only be used with " . - "{$p}sort=sortkey. Overrides {$p}endhexsortkey", - 'startsortkey' => "Use starthexsortkey instead", - 'endsortkey' => "Use endhexsortkey instead", - 'continue' => 'For large categories, give the value returned from previous query', - 'limit' => 'The maximum number of pages to return.', - ); if ( $this->getConfig()->get( 'MiserMode' ) ) { - $desc['namespace'] = array( - $desc['namespace'], - "NOTE: Due to \$wgMiserMode, using this may result in fewer than \"{$p}limit\" results", - 'returned before continuing; in extreme cases, zero results may be returned.', - "Note that you can use {$p}type=subcat or {$p}type=file instead of {$p}namespace=14 or 6.", + $ret['namespace'][ApiBase::PARAM_HELP_MSG_APPEND] = array( + 'api-help-param-limited-in-miser-mode', ); } - return $desc; - } - - public function getDescription() { - return 'List all pages in a given category.'; + return $ret; } - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&list=categorymembers&cmtitle=Category:Physics' - => 'Get first 10 pages in [[Category:Physics]]', - 'api.php?action=query&generator=categorymembers&gcmtitle=Category:Physics&prop=info' - => 'Get page info about first 10 pages in [[Category:Physics]]', + 'action=query&list=categorymembers&cmtitle=Category:Physics' + => 'apihelp-query+categorymembers-example-simple', + 'action=query&generator=categorymembers&gcmtitle=Category:Physics&prop=info' + => 'apihelp-query+categorymembers-example-generator', ); } diff --git a/includes/api/ApiQueryContributors.php b/includes/api/ApiQueryContributors.php index 55ea47025e..b31b14b4b3 100644 --- a/includes/api/ApiQueryContributors.php +++ b/includes/api/ApiQueryContributors.php @@ -236,43 +236,16 @@ class ApiQueryContributors extends ApiQueryBase { ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1, ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 ), - 'continue' => null, - ); - } - - public function getParamDescription() { - return array( - 'group' => array( - 'Limit users to given group name(s)', - 'Does not include implicit or auto-promoted groups like *, user, or autoconfirmed' - ), - 'excludegroup' => array( - 'Exclude users in given group name(s)', - 'Does not include implicit or auto-promoted groups like *, user, or autoconfirmed' + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', ), - 'rights' => array( - 'Limit users to those having given right(s)', - 'Does not include rights granted by implicit or auto-promoted groups ' . - 'like *, user, or autoconfirmed' - ), - 'excluderights' => array( - 'Limit users to those not having given right(s)', - 'Does not include rights granted by implicit or auto-promoted groups ' . - 'like *, user, or autoconfirmed' - ), - 'limit' => 'How many contributors to return', - 'continue' => 'When more results are available, use this to continue', ); } - public function getDescription() { - return 'Get the list of logged-in contributors and ' . - 'the count of anonymous contributors to a page.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&prop=contributors&titles=Main_Page', + 'action=query&prop=contributors&titles=Main_Page' + => 'apihelp-query+contributors-example-simple', ); } diff --git a/includes/api/ApiQueryDeletedrevs.php b/includes/api/ApiQueryDeletedrevs.php index 9042696bee..9d34724470 100644 --- a/includes/api/ApiQueryDeletedrevs.php +++ b/includes/api/ApiQueryDeletedrevs.php @@ -423,40 +423,46 @@ class ApiQueryDeletedrevs extends ApiQueryBase { public function getAllowedParams() { return array( 'start' => array( - ApiBase::PARAM_TYPE => 'timestamp' + ApiBase::PARAM_TYPE => 'timestamp', + ApiBase::PARAM_HELP_MSG_INFO => array( array( 'modes', 1, 2 ) ), ), 'end' => array( ApiBase::PARAM_TYPE => 'timestamp', + ApiBase::PARAM_HELP_MSG_INFO => array( array( 'modes', 1, 2 ) ), ), 'dir' => array( ApiBase::PARAM_TYPE => array( 'newer', 'older' ), - ApiBase::PARAM_DFLT => 'older' + ApiBase::PARAM_DFLT => 'older', + ApiBase::PARAM_HELP_MSG => 'api-help-param-direction', + ApiBase::PARAM_HELP_MSG_INFO => array( array( 'modes', 1, 3 ) ), ), - 'from' => null, - 'to' => null, - 'prefix' => null, - 'continue' => null, - 'unique' => false, - 'tag' => null, - 'user' => array( - ApiBase::PARAM_TYPE => 'user' + 'from' => array( + ApiBase::PARAM_HELP_MSG_INFO => array( array( 'modes', 3 ) ), ), - 'excludeuser' => array( - ApiBase::PARAM_TYPE => 'user' + 'to' => array( + ApiBase::PARAM_HELP_MSG_INFO => array( array( 'modes', 3 ) ), + ), + 'prefix' => array( + ApiBase::PARAM_HELP_MSG_INFO => array( array( 'modes', 3 ) ), + ), + 'unique' => array( + ApiBase::PARAM_DFLT => false, + ApiBase::PARAM_HELP_MSG_INFO => array( array( 'modes', 3 ) ), ), 'namespace' => array( ApiBase::PARAM_TYPE => 'namespace', ApiBase::PARAM_DFLT => NS_MAIN, + ApiBase::PARAM_HELP_MSG_INFO => array( array( 'modes', 3 ) ), ), - 'limit' => array( - ApiBase::PARAM_DFLT => 10, - ApiBase::PARAM_TYPE => 'limit', - ApiBase::PARAM_MIN => 1, - ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1, - ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 + 'tag' => null, + 'user' => array( + ApiBase::PARAM_TYPE => 'user' + ), + 'excludeuser' => array( + ApiBase::PARAM_TYPE => 'user' ), 'prop' => array( ApiBase::PARAM_DFLT => 'user|comment', @@ -476,68 +482,30 @@ class ApiQueryDeletedrevs extends ApiQueryBase { ), ApiBase::PARAM_ISMULTI => true ), - ); - } - - public function getParamDescription() { - return array( - 'start' => 'The timestamp to start enumerating from (1, 2)', - 'end' => 'The timestamp to stop enumerating at (1, 2)', - 'dir' => $this->getDirectionDescription( $this->getModulePrefix(), ' (1, 3)' ), - 'from' => 'Start listing at this title (3)', - 'to' => 'Stop listing at this title (3)', - 'prefix' => 'Search for all page titles that begin with this value (3)', - 'limit' => 'The maximum amount of revisions to list', - 'prop' => array( - 'Which properties to get', - ' revid - Adds the revision ID of the deleted revision', - ' parentid - Adds the revision ID of the previous revision to the page', - ' user - Adds the user who made the revision', - ' userid - Adds the user ID whom made the revision', - ' comment - Adds the comment of the revision', - ' parsedcomment - Adds the parsed comment of the revision', - ' minor - Tags if the revision is minor', - ' len - Adds the length (bytes) of the revision', - ' sha1 - Adds the SHA-1 (base 16) of the revision', - ' content - Adds the content of the revision', - ' token - DEPRECATED! Gives the edit token', - ' tags - Tags for the revision', + 'limit' => array( + ApiBase::PARAM_DFLT => 10, + ApiBase::PARAM_TYPE => 'limit', + ApiBase::PARAM_MIN => 1, + ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1, + ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 + ), + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', ), - 'namespace' => 'Only list pages in this namespace (3)', - 'user' => 'Only list revisions by this user', - 'excludeuser' => 'Don\'t list revisions by this user', - 'continue' => 'When more results are available, use this to continue', - 'unique' => 'List only one revision for each page (3)', - 'tag' => 'Only list revisions tagged with this tag', - ); - } - - public function getDescription() { - $p = $this->getModulePrefix(); - - return array( - 'List deleted revisions.', - 'Operates in three modes:', - ' 1) List deleted revisions for the given title(s), sorted by timestamp.', - ' 2) List deleted contributions for the given user, sorted by timestamp (no titles specified).', - ' 3) List all deleted revisions in the given namespace, sorted by title and timestamp', - " (no titles specified, {$p}user not set).", - 'Certain parameters only apply to some modes and are ignored in others.', - 'For instance, a parameter marked (1) only applies to mode 1 and is ignored in modes 2 and 3.', ); } - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&list=deletedrevs&titles=Main%20Page|Talk:Main%20Page&' . + 'action=query&list=deletedrevs&titles=Main%20Page|Talk:Main%20Page&' . 'drprop=user|comment|content' - => 'List the last deleted revisions of Main Page and Talk:Main Page, with content (mode 1)', - 'api.php?action=query&list=deletedrevs&druser=Bob&drlimit=50' - => 'List the last 50 deleted contributions by Bob (mode 2)', - 'api.php?action=query&list=deletedrevs&drdir=newer&drlimit=50' - => 'List the first 50 deleted revisions in the main namespace (mode 3)', - 'api.php?action=query&list=deletedrevs&drdir=newer&drlimit=50&drnamespace=1&drunique=' - => 'List the first 50 deleted pages in the Talk namespace (mode 3):', + => 'apihelp-query+deletedrevs-example-mode1', + 'action=query&list=deletedrevs&druser=Bob&drlimit=50' + => 'apihelp-query+deletedrevs-example-mode2', + 'action=query&list=deletedrevs&drdir=newer&drlimit=50' + => 'apihelp-query+deletedrevs-example-mode3-main', + 'action=query&list=deletedrevs&drdir=newer&drlimit=50&drnamespace=1&drunique=' + => 'apihelp-query+deletedrevs-example-mode3-talk', ); } diff --git a/includes/api/ApiQueryDisabled.php b/includes/api/ApiQueryDisabled.php index cf0d841eaa..a6509d413c 100644 --- a/includes/api/ApiQueryDisabled.php +++ b/includes/api/ApiQueryDisabled.php @@ -44,17 +44,7 @@ class ApiQueryDisabled extends ApiQueryBase { return array(); } - public function getParamDescription() { - return array(); - } - - public function getDescription() { - return array( - 'This module has been disabled.' - ); - } - - public function getExamples() { - return array(); + public function getDescriptionMessage() { + return 'apihelp-query+disabled-description'; } } diff --git a/includes/api/ApiQueryDuplicateFiles.php b/includes/api/ApiQueryDuplicateFiles.php index 2212957716..763c3062b4 100644 --- a/includes/api/ApiQueryDuplicateFiles.php +++ b/includes/api/ApiQueryDuplicateFiles.php @@ -167,7 +167,9 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase { ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1, ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 ), - 'continue' => null, + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), 'dir' => array( ApiBase::PARAM_DFLT => 'ascending', ApiBase::PARAM_TYPE => array( @@ -179,23 +181,12 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase { ); } - public function getParamDescription() { - return array( - 'limit' => 'How many duplicate files to return', - 'continue' => 'When more results are available, use this to continue', - 'dir' => 'The direction in which to list', - 'localonly' => 'Look only for files in the local repository', - ); - } - - public function getDescription() { - return 'List all files that are duplicates of the given file(s) based on hash values.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&titles=File:Albert_Einstein_Head.jpg&prop=duplicatefiles', - 'api.php?action=query&generator=allimages&prop=duplicatefiles', + 'action=query&titles=File:Albert_Einstein_Head.jpg&prop=duplicatefiles' + => 'apihelp-query+duplicatefiles-example-simple', + 'action=query&generator=allimages&prop=duplicatefiles' + => 'apihelp-query+duplicatefiles-example-generated', ); } diff --git a/includes/api/ApiQueryExtLinksUsage.php b/includes/api/ApiQueryExtLinksUsage.php index faabb920eb..983635268c 100644 --- a/includes/api/ApiQueryExtLinksUsage.php +++ b/includes/api/ApiQueryExtLinksUsage.php @@ -145,7 +145,7 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase { } public function getAllowedParams() { - return array( + $ret = array( 'prop' => array( ApiBase::PARAM_ISMULTI => true, ApiBase::PARAM_DFLT => 'ids|title|url', @@ -156,7 +156,8 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase { ) ), 'offset' => array( - ApiBase::PARAM_TYPE => 'integer' + ApiBase::PARAM_TYPE => 'integer', + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', ), 'protocol' => array( ApiBase::PARAM_TYPE => self::prepareProtocols(), @@ -176,6 +177,14 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase { ), 'expandurl' => false, ); + + if ( $this->getConfig()->get( 'MiserMode' ) ) { + $ret['namespace'][ApiBase::PARAM_HELP_MSG_APPEND] = array( + 'api-help-param-limited-in-miser-mode', + ); + } + + return $ret; } public static function prepareProtocols() { @@ -207,45 +216,10 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase { } } - public function getParamDescription() { - $p = $this->getModulePrefix(); - $desc = array( - 'prop' => array( - 'What pieces of information to include', - ' ids - Adds the ID of page', - ' title - Adds the title and namespace ID of the page', - ' url - Adds the URL used in the page', - ), - 'offset' => 'Used for paging. Use the value returned for "continue"', - 'protocol' => array( - "Protocol of the URL. If empty and {$p}query set, the protocol is http.", - "Leave both this and {$p}query empty to list all external links" - ), - 'query' => 'Search string without protocol. See [[Special:LinkSearch]]. ' . - 'Leave empty to list all external links', - 'namespace' => 'The page namespace(s) to enumerate.', - 'limit' => 'How many pages to return.', - 'expandurl' => 'Expand protocol-relative URLs with the canonical protocol', - ); - - if ( $this->getConfig()->get( 'MiserMode' ) ) { - $desc['namespace'] = array( - $desc['namespace'], - "NOTE: Due to \$wgMiserMode, using this may result in fewer than \"{$p}limit\" results", - 'returned before continuing; in extreme cases, zero results may be returned', - ); - } - - return $desc; - } - - public function getDescription() { - return 'Enumerate pages that contain a given URL.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&list=exturlusage&euquery=www.mediawiki.org' + 'action=query&list=exturlusage&euquery=www.mediawiki.org' + => 'apihelp-query+exturlusage-example-simple', ); } diff --git a/includes/api/ApiQueryExternalLinks.php b/includes/api/ApiQueryExternalLinks.php index 95666354a2..b9a4263d64 100644 --- a/includes/api/ApiQueryExternalLinks.php +++ b/includes/api/ApiQueryExternalLinks.php @@ -114,7 +114,8 @@ class ApiQueryExternalLinks extends ApiQueryBase { ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 ), 'offset' => array( - ApiBase::PARAM_TYPE => 'integer' + ApiBase::PARAM_TYPE => 'integer', + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', ), 'protocol' => array( ApiBase::PARAM_TYPE => ApiQueryExtLinksUsage::prepareProtocols(), @@ -125,30 +126,10 @@ class ApiQueryExternalLinks extends ApiQueryBase { ); } - public function getParamDescription() { - $p = $this->getModulePrefix(); - - return array( - 'limit' => 'How many links to return', - 'offset' => 'When more results are available, use this to continue', - 'protocol' => array( - "Protocol of the URL. If empty and {$p}query set, the protocol is http.", - "Leave both this and {$p}query empty to list all external links" - ), - 'query' => 'Search string without protocol. Useful for checking ' . - 'whether a certain page contains a certain external url', - 'expandurl' => 'Expand protocol-relative URLs with the canonical protocol', - ); - } - - public function getDescription() { - return 'Returns all external URLs (not interwikis) from the given page(s).'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&prop=extlinks&titles=Main%20Page' - => 'Get a list of external links on the [[Main Page]]', + 'action=query&prop=extlinks&titles=Main%20Page' + => 'apihelp-query+extlinks-example-simple', ); } diff --git a/includes/api/ApiQueryFileRepoInfo.php b/includes/api/ApiQueryFileRepoInfo.php index d1600efe39..cb5af2f3ff 100644 --- a/includes/api/ApiQueryFileRepoInfo.php +++ b/includes/api/ApiQueryFileRepoInfo.php @@ -89,27 +89,10 @@ class ApiQueryFileRepoInfo extends ApiQueryBase { ) ) ); } - public function getParamDescription() { + public function getExamplesMessages() { return array( - 'prop' => array( - 'Which repository properties to get (there may be more available on some wikis):', - ' apiurl - URL to the repository API - helpful for getting image info from the host.', - ' name - The key of the repository - used in e.g. ' . - '$wgForeignFileRepos and imageinfo return values.', - ' displayname - The human-readable name of the repository wiki.', - ' rooturl - Root URL for image paths.', - ' local - Whether that repository is the local one or not.', - ), - ); - } - - public function getDescription() { - return 'Return meta information about image repositories configured on the wiki.'; - } - - public function getExamples() { - return array( - 'api.php?action=query&meta=filerepoinfo&friprop=apiurl|name|displayname', + 'action=query&meta=filerepoinfo&friprop=apiurl|name|displayname' + => 'apihelp-query+filerepoinfo-example-simple', ); } } diff --git a/includes/api/ApiQueryFilearchive.php b/includes/api/ApiQueryFilearchive.php index f047d8d414..b4638d97ff 100644 --- a/includes/api/ApiQueryFilearchive.php +++ b/includes/api/ApiQueryFilearchive.php @@ -246,16 +246,8 @@ class ApiQueryFilearchive extends ApiQueryBase { public function getAllowedParams() { return array( 'from' => null, - 'continue' => null, 'to' => null, 'prefix' => null, - 'limit' => array( - ApiBase::PARAM_DFLT => 10, - ApiBase::PARAM_TYPE => 'limit', - ApiBase::PARAM_MIN => 1, - ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1, - ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 - ), 'dir' => array( ApiBase::PARAM_DFLT => 'ascending', ApiBase::PARAM_TYPE => array( @@ -283,48 +275,23 @@ class ApiQueryFilearchive extends ApiQueryBase { 'archivename', ), ), - ); - } - - public function getParamDescription() { - return array( - 'from' => 'The image title to start enumerating from', - 'continue' => 'When more results are available, use this to continue', - 'to' => 'The image title to stop enumerating at', - 'prefix' => 'Search for all image titles that begin with this value', - 'dir' => 'The direction in which to list', - 'limit' => 'How many images to return in total', - 'sha1' => "SHA1 hash of image. Overrides {$this->getModulePrefix()}sha1base36", - 'sha1base36' => 'SHA1 hash of image in base 36 (used in MediaWiki)', - 'prop' => array( - 'What image information to get:', - ' sha1 - Adds SHA-1 hash for the image', - ' timestamp - Adds timestamp for the uploaded version', - ' user - Adds user who uploaded the image version', - ' size - Adds the size of the image in bytes and the height, ' . - 'width and page count (if applicable)', - ' dimensions - Alias for size', - ' description - Adds description the image version', - ' parseddescription - Parse the description on the version', - ' mime - Adds MIME of the image', - ' mediatype - Adds the media type of the image', - ' metadata - Lists Exif metadata for the version of the image', - ' bitdepth - Adds the bit depth of the version', - ' archivename - Adds the file name of the archive version for non-latest versions' + 'limit' => array( + ApiBase::PARAM_DFLT => 10, + ApiBase::PARAM_TYPE => 'limit', + ApiBase::PARAM_MIN => 1, + ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1, + ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 + ), + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', ), ); } - public function getDescription() { - return 'Enumerate all deleted files sequentially.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&list=filearchive' => array( - 'Simple Use', - 'Show a list of all deleted files', - ), + 'action=query&list=filearchive' + => 'apihelp-query+filearchive-example-simple', ); } diff --git a/includes/api/ApiQueryIWBacklinks.php b/includes/api/ApiQueryIWBacklinks.php index b5aa45bfff..23f647793a 100644 --- a/includes/api/ApiQueryIWBacklinks.php +++ b/includes/api/ApiQueryIWBacklinks.php @@ -169,7 +169,9 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase { return array( 'prefix' => null, 'title' => null, - 'continue' => null, + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), 'limit' => array( ApiBase::PARAM_DFLT => 10, ApiBase::PARAM_TYPE => 'limit', @@ -195,33 +197,12 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase { ); } - public function getParamDescription() { - return array( - 'prefix' => 'Prefix for the interwiki', - 'title' => "Interwiki link to search for. Must be used with {$this->getModulePrefix()}prefix", - 'continue' => 'When more results are available, use this to continue', - 'prop' => array( - 'Which properties to get', - ' iwprefix - Adds the prefix of the interwiki', - ' iwtitle - Adds the title of the interwiki', - ), - 'limit' => 'How many total pages to return', - 'dir' => 'The direction in which to list', - ); - } - - public function getDescription() { - return array( 'Find all pages that link to the given interwiki link.', - 'Can be used to find all links with a prefix, or', - 'all links to a title (with a given prefix).', - 'Using neither parameter is effectively "All IW Links".', - ); - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&list=iwbacklinks&iwbltitle=Test&iwblprefix=wikibooks', - 'api.php?action=query&generator=iwbacklinks&giwbltitle=Test&giwblprefix=wikibooks&prop=info' + 'action=query&list=iwbacklinks&iwbltitle=Test&iwblprefix=wikibooks' + => 'apihelp-query+iwbacklinks-example-simple', + 'action=query&generator=iwbacklinks&giwbltitle=Test&giwblprefix=wikibooks&prop=info' + => 'apihelp-query+iwbacklinks-example-generator', ); } diff --git a/includes/api/ApiQueryIWLinks.php b/includes/api/ApiQueryIWLinks.php index a185ee24e6..fb398dd2af 100644 --- a/includes/api/ApiQueryIWLinks.php +++ b/includes/api/ApiQueryIWLinks.php @@ -147,24 +147,12 @@ class ApiQueryIWLinks extends ApiQueryBase { public function getAllowedParams() { return array( - 'url' => array( - ApiBase::PARAM_DFLT => false, - ApiBase::PARAM_DEPRECATED => true, - ), 'prop' => array( ApiBase::PARAM_ISMULTI => true, ApiBase::PARAM_TYPE => array( 'url', ) ), - 'limit' => array( - ApiBase::PARAM_DFLT => 10, - ApiBase::PARAM_TYPE => 'limit', - ApiBase::PARAM_MIN => 1, - ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1, - ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 - ), - 'continue' => null, 'prefix' => null, 'title' => null, 'dir' => array( @@ -174,32 +162,27 @@ class ApiQueryIWLinks extends ApiQueryBase { 'descending' ) ), - ); - } - - public function getParamDescription() { - return array( - 'prop' => array( - 'Which additional properties to get for each interlanguage link', - ' url - Adds the full URL', + 'limit' => array( + ApiBase::PARAM_DFLT => 10, + ApiBase::PARAM_TYPE => 'limit', + ApiBase::PARAM_MIN => 1, + ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1, + ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 + ), + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), + 'url' => array( + ApiBase::PARAM_DFLT => false, + ApiBase::PARAM_DEPRECATED => true, ), - 'url' => "Whether to get the full URL (Cannot be used with {$this->getModulePrefix()}prop)", - 'limit' => 'How many interwiki links to return', - 'continue' => 'When more results are available, use this to continue', - 'prefix' => 'Prefix for the interwiki', - 'title' => "Interwiki link to search for. Must be used with {$this->getModulePrefix()}prefix", - 'dir' => 'The direction in which to list', ); } - public function getDescription() { - return 'Returns all interwiki links from the given page(s).'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&prop=iwlinks&titles=Main%20Page' - => 'Get interwiki links from the [[Main Page]]', + 'action=query&prop=iwlinks&titles=Main%20Page' + => 'apihelp-query+iwlinks-example-simple', ); } diff --git a/includes/api/ApiQueryImageInfo.php b/includes/api/ApiQueryImageInfo.php index ad5cdbd4c6..18da1e6de0 100644 --- a/includes/api/ApiQueryImageInfo.php +++ b/includes/api/ApiQueryImageInfo.php @@ -649,7 +649,11 @@ class ApiQueryImageInfo extends ApiQueryBase { ), 'urlwidth' => array( ApiBase::PARAM_TYPE => 'integer', - ApiBase::PARAM_DFLT => -1 + ApiBase::PARAM_DFLT => -1, + ApiBase::PARAM_HELP_MSG => array( + 'apihelp-query+imageinfo-param-urlwidth', + ApiQueryImageInfo::TRANSFORM_LIMIT, + ), ), 'urlheight' => array( ApiBase::PARAM_TYPE => 'integer', @@ -675,7 +679,9 @@ class ApiQueryImageInfo extends ApiQueryBase { ApiBase::PARAM_DFLT => '', ApiBase::PARAM_TYPE => 'string', ), - 'continue' => null, + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), 'localonly' => false, ); } @@ -694,6 +700,7 @@ class ApiQueryImageInfo extends ApiQueryBase { /** * Returns array key value pairs of properties and their descriptions * + * @deprecated since 1.25 * @param string $modulePrefix * @return array */ @@ -730,6 +737,7 @@ class ApiQueryImageInfo extends ApiQueryBase { /** * Returns the descriptions for the properties provided by getPropertyNames() * + * @deprecated since 1.25 * @param array $filter List of properties to filter out * @param string $modulePrefix * @return array @@ -741,55 +749,13 @@ class ApiQueryImageInfo extends ApiQueryBase { ); } - /** - * Return the API documentation for the parameters. - * @return array Parameter documentation. - */ - public function getParamDescription() { - $p = $this->getModulePrefix(); - - return array( - 'prop' => self::getPropertyDescriptions( array(), $p ), - 'urlwidth' => array( - "If {$p}prop=url is set, a URL to an image scaled to this width will be returned.", - 'For performance reasons if this option is used, ' . - 'no more than ' . self::TRANSFORM_LIMIT . ' scaled images will be returned.' - ), - 'urlheight' => "Similar to {$p}urlwidth.", - 'urlparam' => array( - "A handler specific parameter string. For example, pdf's ", - "might use 'page15-100px'." - ), - 'limit' => 'How many image revisions to return per image', - 'start' => 'Timestamp to start listing from', - 'end' => 'Timestamp to stop listing at', - 'metadataversion' - => array( "Version of metadata to use. if 'latest' is specified, use latest version.", - "Defaults to '1' for backwards compatibility" ), - 'extmetadatalanguage' => array( - 'What language to fetch extmetadata in. This affects both which', - 'translation to fetch, if multiple are available, as well as how things', - 'like numbers and various values are formatted.' - ), - 'extmetadatamultilang' - =>'If translations for extmetadata property are available, fetch all of them.', - 'extmetadatafilter' - => "If specified and non-empty, only these keys will be returned for {$p}prop=extmetadata", - 'continue' => 'If the query response includes a continue value, ' . - 'use it here to get another page of results', - 'localonly' => 'Look only for files in the local repository', - ); - } - - public function getDescription() { - return 'Returns image information and upload history.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&titles=File:Albert%20Einstein%20Head.jpg&prop=imageinfo', - 'api.php?action=query&titles=File:Test.jpg&prop=imageinfo&iilimit=50&' . - 'iiend=20071231235959&iiprop=timestamp|user|url', + 'action=query&titles=File:Albert%20Einstein%20Head.jpg&prop=imageinfo' + => 'apihelp-query+imageinfo-example-simple', + 'action=query&titles=File:Test.jpg&prop=imageinfo&iilimit=50&' . + 'iiend=2007-12-31T23:59:59Z&iiprop=timestamp|user|url' + => 'apihelp-query+imageinfo-example-dated', ); } diff --git a/includes/api/ApiQueryImages.php b/includes/api/ApiQueryImages.php index 9bc3abedd6..e23ce45e27 100644 --- a/includes/api/ApiQueryImages.php +++ b/includes/api/ApiQueryImages.php @@ -146,7 +146,9 @@ class ApiQueryImages extends ApiQueryGeneratorBase { ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1, ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 ), - 'continue' => null, + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), 'images' => array( ApiBase::PARAM_ISMULTI => true, ), @@ -160,26 +162,12 @@ class ApiQueryImages extends ApiQueryGeneratorBase { ); } - public function getParamDescription() { - return array( - 'limit' => 'How many images to return', - 'continue' => 'When more results are available, use this to continue', - 'images' => 'Only list these images. Useful for checking whether a ' . - 'certain page has a certain Image.', - 'dir' => 'The direction in which to list', - ); - } - - public function getDescription() { - return 'Returns all images contained on the given page(s).'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&prop=images&titles=Main%20Page' - => 'Get a list of images used in the [[Main Page]]', - 'api.php?action=query&generator=images&titles=Main%20Page&prop=info' - => 'Get information about all images used in the [[Main Page]]', + 'action=query&prop=images&titles=Main%20Page' + => 'apihelp-query+images-example-simple', + 'action=query&generator=images&titles=Main%20Page&prop=info' + => 'apihelp-query+images-example-generator', ); } diff --git a/includes/api/ApiQueryInfo.php b/includes/api/ApiQueryInfo.php index d7037e3a19..3a924b0bb7 100644 --- a/includes/api/ApiQueryInfo.php +++ b/includes/api/ApiQueryInfo.php @@ -64,9 +64,6 @@ class ApiQueryInfo extends ApiQueryBase { } $pageSet->requestField( 'page_is_new' ); $config = $this->getConfig(); - if ( !$config->get( 'DisableCounters' ) ) { - $pageSet->requestField( 'page_counter' ); - } $pageSet->requestField( 'page_touched' ); $pageSet->requestField( 'page_latest' ); $pageSet->requestField( 'page_len' ); @@ -328,9 +325,6 @@ class ApiQueryInfo extends ApiQueryBase { : array(); $this->pageIsNew = $pageSet->getCustomField( 'page_is_new' ); - if ( !$this->getConfig()->get( 'DisableCounters' ) ) { - $this->pageCounter = $pageSet->getCustomField( 'page_counter' ); - } $this->pageTouched = $pageSet->getCustomField( 'page_touched' ); $this->pageLatest = $pageSet->getCustomField( 'page_latest' ); $this->pageLength = $pageSet->getCustomField( 'page_len' ); @@ -392,9 +386,6 @@ class ApiQueryInfo extends ApiQueryBase { if ( $titleExists ) { $pageInfo['touched'] = wfTimestamp( TS_ISO_8601, $this->pageTouched[$pageid] ); $pageInfo['lastrevid'] = intval( $this->pageLatest[$pageid] ); - $pageInfo['counter'] = $this->getConfig()->get( 'DisableCounters' ) - ? '' - : intval( $this->pageCounter[$pageid] ); $pageInfo['length'] = intval( $this->pageLength[$pageid] ); if ( isset( $this->pageIsRedir[$pageid] ) && $this->pageIsRedir[$pageid] ) { @@ -824,38 +815,18 @@ class ApiQueryInfo extends ApiQueryBase { ApiBase::PARAM_ISMULTI => true, ApiBase::PARAM_TYPE => array_keys( $this->getTokenFunctions() ) ), - 'continue' => null, - ); - } - - public function getParamDescription() { - return array( - 'prop' => array( - 'Which additional properties to get:', - ' protection - List the protection level of each page', - ' talkid - The page ID of the talk page for each non-talk page', - ' watched - List the watched status of each page', - ' watchers - The number of watchers, if allowed', - ' notificationtimestamp - The watchlist notification timestamp of each page', - ' subjectid - The page ID of the parent page for each talk page', - ' url - Gives a full URL, an edit URL, and the canonical URL for each page', - ' readable - Whether the user can read this page', - ' preload - Gives the text returned by EditFormPreloadText', - ' displaytitle - Gives the way the page title is actually displayed', + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', ), - 'token' => 'Request a token to perform a data-modifying action on a page', - 'continue' => 'When more results are available, use this to continue', ); } - public function getDescription() { - return 'Get basic page information such as namespace, title, last touched date, ...'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&prop=info&titles=Main%20Page', - 'api.php?action=query&prop=info&inprop=protection&titles=Main%20Page' + 'action=query&prop=info&titles=Main%20Page' + => 'apihelp-query+info-example-simple', + 'action=query&prop=info&inprop=protection&titles=Main%20Page' + => 'apihelp-query+info-example-protection', ); } diff --git a/includes/api/ApiQueryLangBacklinks.php b/includes/api/ApiQueryLangBacklinks.php index 34842c6333..a3a285b093 100644 --- a/includes/api/ApiQueryLangBacklinks.php +++ b/includes/api/ApiQueryLangBacklinks.php @@ -168,7 +168,9 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase { return array( 'lang' => null, 'title' => null, - 'continue' => null, + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), 'limit' => array( ApiBase::PARAM_DFLT => 10, ApiBase::PARAM_TYPE => 'limit', @@ -194,34 +196,12 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase { ); } - public function getParamDescription() { - return array( - 'lang' => 'Language for the language link', - 'title' => "Language link to search for. Must be used with {$this->getModulePrefix()}lang", - 'continue' => 'When more results are available, use this to continue', - 'prop' => array( - 'Which properties to get', - ' lllang - Adds the language code of the language link', - ' lltitle - Adds the title of the language link', - ), - 'limit' => 'How many total pages to return', - 'dir' => 'The direction in which to list', - ); - } - - public function getDescription() { - return array( 'Find all pages that link to the given language link.', - 'Can be used to find all links with a language code, or', - 'all links to a title (with a given language).', - 'Using neither parameter is effectively "All Language Links".', - 'Note that this may not consider language links added by extensions.', - ); - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&list=langbacklinks&lbltitle=Test&lbllang=fr', - 'api.php?action=query&generator=langbacklinks&glbltitle=Test&glbllang=fr&prop=info' + 'action=query&list=langbacklinks&lbltitle=Test&lbllang=fr' + => 'apihelp-query+langbacklinks-example-simple', + 'action=query&generator=langbacklinks&glbltitle=Test&glbllang=fr&prop=info' + => 'apihelp-query+langbacklinks-example-generator', ); } diff --git a/includes/api/ApiQueryLangLinks.php b/includes/api/ApiQueryLangLinks.php index da05f2732b..2b555d3441 100644 --- a/includes/api/ApiQueryLangLinks.php +++ b/includes/api/ApiQueryLangLinks.php @@ -140,18 +140,6 @@ class ApiQueryLangLinks extends ApiQueryBase { public function getAllowedParams() { global $wgContLang; return array( - 'limit' => array( - ApiBase::PARAM_DFLT => 10, - ApiBase::PARAM_TYPE => 'limit', - ApiBase::PARAM_MIN => 1, - ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1, - ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 - ), - 'continue' => null, - 'url' => array( - ApiBase::PARAM_DFLT => false, - ApiBase::PARAM_DEPRECATED => true, - ), 'prop' => array( ApiBase::PARAM_ISMULTI => true, ApiBase::PARAM_TYPE => array( @@ -170,36 +158,27 @@ class ApiQueryLangLinks extends ApiQueryBase { ) ), 'inlanguagecode' => $wgContLang->getCode(), - ); - } - - public function getParamDescription() { - return array( - 'limit' => 'How many langlinks to return', - 'continue' => 'When more results are available, use this to continue', - 'url' => "Whether to get the full URL (Cannot be used with {$this->getModulePrefix()}prop)", - 'prop' => array( - 'Which additional properties to get for each interlanguage link', - ' url - Adds the full URL', - ' langname - Adds the localised language name (best effort, use CLDR extension)', - " Use {$this->getModulePrefix()}inlanguagecode to control the language", - ' autonym - Adds the native language name', + 'limit' => array( + ApiBase::PARAM_DFLT => 10, + ApiBase::PARAM_TYPE => 'limit', + ApiBase::PARAM_MIN => 1, + ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1, + ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 + ), + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), + 'url' => array( + ApiBase::PARAM_DFLT => false, + ApiBase::PARAM_DEPRECATED => true, ), - 'lang' => 'Language code', - 'title' => "Link to search for. Must be used with {$this->getModulePrefix()}lang", - 'dir' => 'The direction in which to list', - 'inlanguagecode' => 'Language code for localised language names', ); } - public function getDescription() { - return 'Returns all interlanguage links from the given page(s).'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&prop=langlinks&titles=Main%20Page&redirects=' - => 'Get interlanguage links from the [[Main Page]]', + 'action=query&prop=langlinks&titles=Main%20Page&redirects=' + => 'apihelp-query+langlinks-example-simple', ); } diff --git a/includes/api/ApiQueryLinks.php b/includes/api/ApiQueryLinks.php index 71329c4d41..d6545508fe 100644 --- a/includes/api/ApiQueryLinks.php +++ b/includes/api/ApiQueryLinks.php @@ -34,26 +34,20 @@ class ApiQueryLinks extends ApiQueryGeneratorBase { const LINKS = 'links'; const TEMPLATES = 'templates'; - private $table, $prefix, $description, $helpUrl; + private $table, $prefix, $helpUrl; public function __construct( ApiQuery $query, $moduleName ) { switch ( $moduleName ) { case self::LINKS: $this->table = 'pagelinks'; $this->prefix = 'pl'; - $this->description = 'link'; $this->titlesParam = 'titles'; - $this->titlesParamDescription = 'Only list links to these titles. Useful ' . - 'for checking whether a certain page links to a certain title.'; $this->helpUrl = 'https://www.mediawiki.org/wiki/API:Properties#links_.2F_pl'; break; case self::TEMPLATES: $this->table = 'templatelinks'; $this->prefix = 'tl'; - $this->description = 'template'; $this->titlesParam = 'templates'; - $this->titlesParamDescription = 'Only list these templates. Useful ' . - 'for checking whether a certain page uses a certain template.'; $this->helpUrl = 'https://www.mediawiki.org/wiki/API:Properties#templates_.2F_tl'; break; default: @@ -197,7 +191,9 @@ class ApiQueryLinks extends ApiQueryGeneratorBase { ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1, ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 ), - 'continue' => null, + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), $this->titlesParam => array( ApiBase::PARAM_ISMULTI => true, ), @@ -211,32 +207,17 @@ class ApiQueryLinks extends ApiQueryGeneratorBase { ); } - public function getParamDescription() { - $desc = $this->description; - - return array( - 'namespace' => "Show {$desc}s in this namespace(s) only", - 'limit' => "How many {$desc}s to return", - 'continue' => 'When more results are available, use this to continue', - $this->titlesParam => $this->titlesParamDescription, - 'dir' => 'The direction in which to list', - ); - } - - public function getDescription() { - return "Returns all {$this->description}s from the given page(s)."; - } - - public function getExamples() { - $desc = $this->description; + public function getExamplesMessages() { $name = $this->getModuleName(); + $path = $this->getModulePath(); return array( - "api.php?action=query&prop={$name}&titles=Main%20Page" => "Get {$desc}s from the [[Main Page]]", - "api.php?action=query&generator={$name}&titles=Main%20Page&prop=info" - => "Get information about the {$desc} pages in the [[Main Page]]", - "api.php?action=query&prop={$name}&titles=Main%20Page&{$this->prefix}namespace=2|10" - => "Get {$desc}s from the Main Page in the User and Template namespaces", + "action=query&prop={$name}&titles=Main%20Page" + => "apihelp-{$path}-example-simple", + "action=query&generator={$name}&titles=Main%20Page&prop=info" + => "apihelp-{$path}-example-generator", + "action=query&prop={$name}&titles=Main%20Page&{$this->prefix}namespace=2|10" + => "apihelp-{$path}-example-namespaces", ); } diff --git a/includes/api/ApiQueryLogEvents.php b/includes/api/ApiQueryLogEvents.php index d3607e111c..f83fe6905a 100644 --- a/includes/api/ApiQueryLogEvents.php +++ b/includes/api/ApiQueryLogEvents.php @@ -474,7 +474,7 @@ class ApiQueryLogEvents extends ApiQueryBase { public function getAllowedParams( $flags = 0 ) { $config = $this->getConfig(); - return array( + $ret = array( 'prop' => array( ApiBase::PARAM_ISMULTI => true, ApiBase::PARAM_DFLT => 'ids|title|type|user|timestamp|comment|details', @@ -511,14 +511,15 @@ class ApiQueryLogEvents extends ApiQueryBase { ApiBase::PARAM_TYPE => array( 'newer', 'older' - ) + ), + ApiBase::PARAM_HELP_MSG => 'api-help-param-direction', ), 'user' => null, 'title' => null, 'namespace' => array( ApiBase::PARAM_TYPE => 'namespace' ), - 'prefix' => null, + 'prefix' => array(), 'tag' => null, 'limit' => array( ApiBase::PARAM_DFLT => 10, @@ -527,52 +528,22 @@ class ApiQueryLogEvents extends ApiQueryBase { ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1, ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 ), - 'continue' => null, - ); - } - - public function getParamDescription() { - $p = $this->getModulePrefix(); - - return array( - 'prop' => array( - 'Which properties to get', - ' ids - Adds the ID of the log event', - ' title - Adds the title of the page for the log event', - ' type - Adds the type of log event', - ' user - Adds the user responsible for the log event', - ' userid - Adds the user ID who was responsible for the log event', - ' timestamp - Adds the timestamp for the event', - ' comment - Adds the comment of the event', - ' parsedcomment - Adds the parsed comment of the event', - ' details - Lists additional details about the event', - ' tags - Lists tags for the event', - ), - 'type' => 'Filter log entries to only this type', - 'action' => array( - "Filter log actions to only this action. Overrides {$p}type", - "Wildcard actions like 'action/*' allows to specify any string for the asterisk" + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', ), - 'start' => 'The timestamp to start enumerating from', - 'end' => 'The timestamp to end enumerating', - 'dir' => $this->getDirectionDescription( $p ), - 'user' => 'Filter entries to those made by the given user', - 'title' => 'Filter entries to those related to a page', - 'namespace' => 'Filter entries to those in the given namespace', - 'prefix' => 'Filter entries that start with this prefix. Disabled in Miser Mode', - 'limit' => 'How many total event entries to return', - 'tag' => 'Only list event entries tagged with this tag', - 'continue' => 'When more results are available, use this to continue', ); - } - public function getDescription() { - return 'Get events from logs.'; + if ( $config->get( 'MiserMode' ) ) { + $ret['prefix'][ApiBase::PARAM_HELP_MSG] = 'api-help-param-disabled-in-miser-mode'; + } + + return $ret; } - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&list=logevents' + 'action=query&list=logevents' + => 'apihelp-query+logevents-example-simple', ); } diff --git a/includes/api/ApiQueryORM.php b/includes/api/ApiQueryORM.php index 469b2972b9..035f9017ce 100644 --- a/includes/api/ApiQueryORM.php +++ b/includes/api/ApiQueryORM.php @@ -233,15 +233,19 @@ abstract class ApiQueryORM extends ApiQueryBase { ApiBase::PARAM_TYPE => $this->getTable()->getFieldNames(), ApiBase::PARAM_ISMULTI => true, ApiBase::PARAM_REQUIRED => true, + ApiBase::PARAM_HELP_MSG => 'api-orm-param-props', ), 'limit' => array( ApiBase::PARAM_DFLT => 20, ApiBase::PARAM_TYPE => 'limit', ApiBase::PARAM_MIN => 1, ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1, - ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 + ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2, + ApiBase::PARAM_HELP_MSG => 'api-orm-param-limit', + ), + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', ), - 'continue' => null, ); return array_merge( $this->getTable()->getAPIParams(), $params ); @@ -249,6 +253,7 @@ abstract class ApiQueryORM extends ApiQueryBase { /** * @see ApiBase::getParamDescription() + * @deprecated since 1.25 * @return array */ public function getParamDescription() { diff --git a/includes/api/ApiQueryPagePropNames.php b/includes/api/ApiQueryPagePropNames.php index 8cd9c6cffa..e4a5002a97 100644 --- a/includes/api/ApiQueryPagePropNames.php +++ b/includes/api/ApiQueryPagePropNames.php @@ -83,7 +83,9 @@ class ApiQueryPagePropNames extends ApiQueryBase { public function getAllowedParams() { return array( - 'continue' => null, + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), 'limit' => array( ApiBase::PARAM_TYPE => 'limit', ApiBase::PARAM_DFLT => 10, @@ -94,20 +96,10 @@ class ApiQueryPagePropNames extends ApiQueryBase { ); } - public function getParamDescription() { - return array( - 'continue' => 'When more results are available, use this to continue', - 'limit' => 'The maximum number of pages to return', - ); - } - - public function getDescription() { - return 'List all page prop names in use on the wiki.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&list=pagepropnames' => 'Get first 10 prop names', + 'action=query&list=pagepropnames' + => 'apihelp-query+pagepropnames-example-simple', ); } diff --git a/includes/api/ApiQueryPageProps.php b/includes/api/ApiQueryPageProps.php index e370c39f42..130b829ade 100644 --- a/includes/api/ApiQueryPageProps.php +++ b/includes/api/ApiQueryPageProps.php @@ -125,28 +125,19 @@ class ApiQueryPageProps extends ApiQueryBase { public function getAllowedParams() { return array( - 'continue' => null, + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), 'prop' => array( ApiBase::PARAM_ISMULTI => true, ), ); } - public function getParamDescription() { - return array( - 'continue' => 'When more results are available, use this to continue', - 'prop' => 'Only list these props. Useful for checking whether a ' . - 'certain page uses a certain page prop', - ); - } - - public function getDescription() { - return 'Get various properties defined in the page content.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&prop=pageprops&titles=Category:Foo', + 'action=query&prop=pageprops&titles=Category:Foo' + => 'apihelp-query+pageprops-example-simple', ); } diff --git a/includes/api/ApiQueryPagesWithProp.php b/includes/api/ApiQueryPagesWithProp.php index b6c8525388..1e9bc4df6b 100644 --- a/includes/api/ApiQueryPagesWithProp.php +++ b/includes/api/ApiQueryPagesWithProp.php @@ -140,7 +140,9 @@ class ApiQueryPagesWithProp extends ApiQueryGeneratorBase { 'value', ) ), - 'continue' => null, + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), 'limit' => array( ApiBase::PARAM_TYPE => 'limit', ApiBase::PARAM_DFLT => 10, @@ -158,31 +160,12 @@ class ApiQueryPagesWithProp extends ApiQueryGeneratorBase { ); } - public function getParamDescription() { - return array( - 'propname' => 'Page prop for which to enumerate pages', - 'prop' => array( - 'What pieces of information to include', - ' ids - Adds the page ID', - ' title - Adds the title and namespace ID of the page', - ' value - Adds the value of the page prop', - ), - 'dir' => 'In which direction to sort', - 'continue' => 'When more results are available, use this to continue', - 'limit' => 'The maximum number of pages to return', - ); - } - - public function getDescription() { - return 'List all pages using a given page prop.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&list=pageswithprop&pwppropname=displaytitle&pwpprop=ids|title|value' - => 'Get first 10 pages using {{DISPLAYTITLE:}}', - 'api.php?action=query&generator=pageswithprop&gpwppropname=notoc&prop=info' - => 'Get page info about first 10 pages using __NOTOC__', + 'action=query&list=pageswithprop&pwppropname=displaytitle&pwpprop=ids|title|value' + => 'apihelp-query+pageswithprop-example-simple', + 'action=query&generator=pageswithprop&gpwppropname=notoc&prop=info' + => 'apihelp-query+pageswithprop-example-generator', ); } diff --git a/includes/api/ApiQueryPrefixSearch.php b/includes/api/ApiQueryPrefixSearch.php index 4abd7f0ee6..2694067fd1 100644 --- a/includes/api/ApiQueryPrefixSearch.php +++ b/includes/api/ApiQueryPrefixSearch.php @@ -100,21 +100,10 @@ class ApiQueryPrefixSearch extends ApiQueryGeneratorBase { ); } - public function getParamDescription() { + public function getExamplesMessages() { return array( - 'search' => 'Search string', - 'limit' => 'Maximum amount of results to return', - 'namespace' => 'Namespaces to search', - ); - } - - public function getDescription() { - return 'Perform a prefix search for page titles'; - } - - public function getExamples() { - return array( - 'api.php?action=query&list=prefixsearch&pssearch=meaning', + 'action=query&list=prefixsearch&pssearch=meaning' + => 'apihelp-query+prefixsearch-example-simple', ); } diff --git a/includes/api/ApiQueryProtectedTitles.php b/includes/api/ApiQueryProtectedTitles.php index 4c88be7a9d..098bfc7bfd 100644 --- a/includes/api/ApiQueryProtectedTitles.php +++ b/includes/api/ApiQueryProtectedTitles.php @@ -196,7 +196,8 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase { ApiBase::PARAM_TYPE => array( 'newer', 'older' - ) + ), + ApiBase::PARAM_HELP_MSG => 'api-help-param-direction', ), 'start' => array( ApiBase::PARAM_TYPE => 'timestamp' @@ -217,39 +218,18 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase { 'level' ) ), - 'continue' => null, - ); - } - - public function getParamDescription() { - return array( - 'namespace' => 'Only list titles in these namespaces', - 'start' => 'Start listing at this protection timestamp', - 'end' => 'Stop listing at this protection timestamp', - 'dir' => $this->getDirectionDescription( $this->getModulePrefix() ), - 'limit' => 'How many total pages to return', - 'prop' => array( - 'Which properties to get', - ' timestamp - Adds the timestamp of when protection was added', - ' user - Adds the user that added the protection', - ' userid - Adds the user id that added the protection', - ' comment - Adds the comment for the protection', - ' parsedcomment - Adds the parsed comment for the protection', - ' expiry - Adds the timestamp of when the protection will be lifted', - ' level - Adds the protection level', + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', ), - 'level' => 'Only list titles with these protection levels', - 'continue' => 'When more results are available, use this to continue', ); } - public function getDescription() { - return 'List all titles protected from creation.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&list=protectedtitles', + 'action=query&list=protectedtitles' + => 'apihelp-query+protectedtitles-example-simple', + 'action=query&generator=protectedtitles&gptnamespace=0&prop=linkshere' + => 'apihelp-query+protectedtitles-example-generator', ); } diff --git a/includes/api/ApiQueryQueryPage.php b/includes/api/ApiQueryQueryPage.php index 5ddd94508c..2da5777ef4 100644 --- a/includes/api/ApiQueryQueryPage.php +++ b/includes/api/ApiQueryQueryPage.php @@ -144,7 +144,10 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase { ApiBase::PARAM_TYPE => array_keys( $this->qpMap ), ApiBase::PARAM_REQUIRED => true ), - 'offset' => 0, + 'offset' => array( + ApiBase::PARAM_DFLT => 0, + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), 'limit' => array( ApiBase::PARAM_DFLT => 10, ApiBase::PARAM_TYPE => 'limit', @@ -155,21 +158,10 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase { ); } - public function getParamDescription() { - return array( - 'page' => 'The name of the special page. Note, this is case sensitive', - 'offset' => 'When more results are available, use this to continue', - 'limit' => 'Number of results to return', - ); - } - - public function getDescription() { - return 'Get a list provided by a QueryPage-based special page.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&list=querypage&qppage=Ancientpages' + 'action=query&list=querypage&qppage=Ancientpages' + => 'apihelp-query+querypage-example-ancientpages', ); } diff --git a/includes/api/ApiQueryRandom.php b/includes/api/ApiQueryRandom.php index 530557e6c4..f4061e7b52 100644 --- a/includes/api/ApiQueryRandom.php +++ b/includes/api/ApiQueryRandom.php @@ -165,30 +165,15 @@ class ApiQueryRandom extends ApiQueryGeneratorBase { ); } - public function getParamDescription() { + public function getExamplesMessages() { return array( - 'namespace' => 'Return pages in these namespaces only', - 'limit' => 'Limit how many random pages will be returned', - 'redirect' => 'Load a random redirect instead of a random page' + 'action=query&list=random&rnnamespace=0&rnlimit=2' + => 'apihelp-query+random-example-simple', + 'action=query&generator=random&grnnamespace=0&grnlimit=2&prop=info' + => 'apihelp-query+random-example-generator', ); } - public function getDescription() { - return array( - 'Get a set of random pages.', - 'NOTE: Pages are listed in a fixed sequence, only the starting point is random.', - ' This means that if, for example, "Main Page" is the first random page on', - ' your list, "List of fictional monkeys" will *always* be second, "List of', - ' people on stamps of Vanuatu" third, etc.', - 'NOTE: If the number of pages in the namespace is lower than rnlimit, you will', - ' get fewer pages. You will not get the same page twice.' - ); - } - - public function getExamples() { - return 'api.php?action=query&list=random&rnnamespace=0&rnlimit=2'; - } - public function getHelpUrls() { return 'https://www.mediawiki.org/wiki/API:Random'; } diff --git a/includes/api/ApiQueryRecentChanges.php b/includes/api/ApiQueryRecentChanges.php index 6f0c5d3477..a620a9fdf6 100644 --- a/includes/api/ApiQueryRecentChanges.php +++ b/includes/api/ApiQueryRecentChanges.php @@ -625,7 +625,8 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase { ApiBase::PARAM_TYPE => array( 'newer', 'older' - ) + ), + ApiBase::PARAM_HELP_MSG => 'api-help-param-direction', ), 'namespace' => array( ApiBase::PARAM_ISMULTI => true, @@ -696,57 +697,18 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase { ) ), 'toponly' => false, - 'continue' => null, - ); - } - - public function getParamDescription() { - $p = $this->getModulePrefix(); - - return array( - 'start' => 'The timestamp to start enumerating from', - 'end' => 'The timestamp to end enumerating', - 'dir' => $this->getDirectionDescription( $p ), - 'namespace' => 'Filter log entries to only this namespace(s)', - 'user' => 'Only list changes by this user', - 'excludeuser' => 'Don\'t list changes by this user', - 'prop' => array( - 'Include additional pieces of information', - ' user - Adds the user responsible for the edit and tags if they are an IP', - ' userid - Adds the user id responsible for the edit', - ' comment - Adds the comment for the edit', - ' parsedcomment - Adds the parsed comment for the edit', - ' flags - Adds flags for the edit', - ' timestamp - Adds timestamp of the edit', - ' title - Adds the page title of the edit', - ' ids - Adds the page ID, recent changes ID and the new and old revision ID', - ' sizes - Adds the new and old page length in bytes', - ' redirect - Tags edit if page is a redirect', - ' patrolled - Tags patrollable edits as being patrolled or unpatrolled', - ' loginfo - Adds log information (logid, logtype, etc) to log entries', - ' tags - Lists tags for the entry', - ' sha1 - Adds the content checksum for entries associated with a revision', - ), - 'token' => 'Which tokens to obtain for each change', - 'show' => array( - 'Show only items that meet this criteria.', - "For example, to see only minor edits done by logged-in users, set {$p}show=minor|!anon" + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', ), - 'type' => 'Which types of changes to show', - 'limit' => 'How many total changes to return', - 'tag' => 'Only list changes tagged with this tag', - 'toponly' => 'Only list changes which are the latest revision', - 'continue' => 'When more results are available, use this to continue', ); } - public function getDescription() { - return 'Enumerate recent changes.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&list=recentchanges' + 'action=query&list=recentchanges' + => 'apihelp-query+recentchanges-example-simple', + 'action=query&generator=recentchanges&grcshow=!patrolled&prop=info' + => 'apihelp-query+recentchanges-example-generator', ); } diff --git a/includes/api/ApiQueryRevisions.php b/includes/api/ApiQueryRevisions.php index da4ec19541..d547929a65 100644 --- a/includes/api/ApiQueryRevisions.php +++ b/includes/api/ApiQueryRevisions.php @@ -717,32 +717,41 @@ class ApiQueryRevisions extends ApiQueryBase { ApiBase::PARAM_TYPE => 'limit', ApiBase::PARAM_MIN => 1, ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1, - ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 + ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2, + ApiBase::PARAM_HELP_MSG_INFO => array( array( 'singlepageonly' ) ), ), 'startid' => array( - ApiBase::PARAM_TYPE => 'integer' + ApiBase::PARAM_TYPE => 'integer', + ApiBase::PARAM_HELP_MSG_INFO => array( array( 'singlepageonly' ) ), ), 'endid' => array( - ApiBase::PARAM_TYPE => 'integer' + ApiBase::PARAM_TYPE => 'integer', + ApiBase::PARAM_HELP_MSG_INFO => array( array( 'singlepageonly' ) ), ), 'start' => array( - ApiBase::PARAM_TYPE => 'timestamp' + ApiBase::PARAM_TYPE => 'timestamp', + ApiBase::PARAM_HELP_MSG_INFO => array( array( 'singlepageonly' ) ), ), 'end' => array( - ApiBase::PARAM_TYPE => 'timestamp' + ApiBase::PARAM_TYPE => 'timestamp', + ApiBase::PARAM_HELP_MSG_INFO => array( array( 'singlepageonly' ) ), ), 'dir' => array( ApiBase::PARAM_DFLT => 'older', ApiBase::PARAM_TYPE => array( 'newer', 'older' - ) + ), + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ApiBase::PARAM_HELP_MSG_INFO => array( array( 'singlepageonly' ) ), ), 'user' => array( - ApiBase::PARAM_TYPE => 'user' + ApiBase::PARAM_TYPE => 'user', + ApiBase::PARAM_HELP_MSG_INFO => array( array( 'singlepageonly' ) ), ), 'excludeuser' => array( - ApiBase::PARAM_TYPE => 'user' + ApiBase::PARAM_TYPE => 'user', + ApiBase::PARAM_HELP_MSG_INFO => array( array( 'singlepageonly' ) ), ), 'tag' => null, 'expandtemplates' => false, @@ -754,7 +763,9 @@ class ApiQueryRevisions extends ApiQueryBase { ApiBase::PARAM_TYPE => array_keys( $this->getTokenFunctions() ), ApiBase::PARAM_ISMULTI => true ), - 'continue' => null, + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), 'diffto' => null, 'difftotext' => null, 'contentformat' => array( @@ -764,83 +775,26 @@ class ApiQueryRevisions extends ApiQueryBase { ); } - public function getParamDescription() { - $p = $this->getModulePrefix(); - - return array( - 'prop' => array( - 'Which properties to get for each revision:', - ' ids - The ID of the revision', - ' flags - Revision flags (minor)', - ' timestamp - The timestamp of the revision', - ' user - User that made the revision', - ' userid - User id of revision creator', - ' size - Length (bytes) of the revision', - ' sha1 - SHA-1 (base 16) of the revision', - ' contentmodel - Content model id', - ' comment - Comment by the user for revision', - ' parsedcomment - Parsed comment by the user for the revision', - ' content - Text of the revision', - ' tags - Tags for the revision', - ), - 'limit' => 'Limit how many revisions will be returned (enum)', - 'startid' => 'From which revision id to start enumeration (enum)', - 'endid' => 'Stop revision enumeration on this revid (enum)', - 'start' => 'From which revision timestamp to start enumeration (enum)', - 'end' => 'Enumerate up to this timestamp (enum)', - 'dir' => $this->getDirectionDescription( $p, ' (enum)' ), - 'user' => 'Only include revisions made by user (enum)', - 'excludeuser' => 'Exclude revisions made by user (enum)', - 'expandtemplates' => "Expand templates in revision content (requires {$p}prop=content)", - 'generatexml' => "Generate XML parse tree for revision content (requires {$p}prop=content)", - 'parse' => array( "Parse revision content (requires {$p}prop=content).", - 'For performance reasons if this option is used, rvlimit is enforced to 1.' ), - 'section' => 'Only retrieve the content of this section number', - 'token' => 'Which tokens to obtain for each revision', - 'continue' => 'When more results are available, use this to continue', - 'diffto' => array( 'Revision ID to diff each revision to.', - 'Use "prev", "next" and "cur" for the previous, next and current revision respectively' ), - 'difftotext' => array( - 'Text to diff each revision to. Only diffs a limited number of revisions.', - "Overrides {$p}diffto. If {$p}section is set, only that section will be", - 'diffed against this text', - ), - 'tag' => 'Only list revisions tagged with this tag', - 'contentformat' => 'Serialization format used for difftotext and expected for output of content', - ); - } - - public function getDescription() { - return array( - 'Get revision information.', - 'May be used in several ways:', - ' 1) Get data about a set of pages (last revision), by setting titles or pageids parameter.', - ' 2) Get revisions for one given page, by using titles/pageids with start/end/limit params.', - ' 3) Get data about a set of revisions by setting their IDs with revids parameter.', - 'All parameters marked as (enum) may only be used with a single page (#2).' - ); - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'Get data with content for the last revision of titles "API" and "Main Page"', - ' api.php?action=query&prop=revisions&titles=API|Main%20Page&' . - 'rvprop=timestamp|user|comment|content', - 'Get last 5 revisions of the "Main Page"', - ' api.php?action=query&prop=revisions&titles=Main%20Page&rvlimit=5&' . - 'rvprop=timestamp|user|comment', - 'Get first 5 revisions of the "Main Page"', - ' api.php?action=query&prop=revisions&titles=Main%20Page&rvlimit=5&' . - 'rvprop=timestamp|user|comment&rvdir=newer', - 'Get first 5 revisions of the "Main Page" made after 2006-05-01', - ' api.php?action=query&prop=revisions&titles=Main%20Page&rvlimit=5&' . - 'rvprop=timestamp|user|comment&rvdir=newer&rvstart=20060501000000', - 'Get first 5 revisions of the "Main Page" that were not made made by anonymous user "127.0.0.1"', - ' api.php?action=query&prop=revisions&titles=Main%20Page&rvlimit=5&' . - 'rvprop=timestamp|user|comment&rvexcludeuser=127.0.0.1', - 'Get first 5 revisions of the "Main Page" that were made by the user "MediaWiki default"', - ' api.php?action=query&prop=revisions&titles=Main%20Page&rvlimit=5&' . - 'rvprop=timestamp|user|comment&rvuser=MediaWiki%20default', + 'action=query&prop=revisions&titles=API|Main%20Page&' . + 'rvprop=timestamp|user|comment|content' + => 'apihelp-query+revisions-example-content', + 'action=query&prop=revisions&titles=Main%20Page&rvlimit=5&' . + 'rvprop=timestamp|user|comment' + => 'apihelp-query+revisions-example-last5', + 'action=query&prop=revisions&titles=Main%20Page&rvlimit=5&' . + 'rvprop=timestamp|user|comment&rvdir=newer' + => 'apihelp-query+revisions-example-first5', + 'action=query&prop=revisions&titles=Main%20Page&rvlimit=5&' . + 'rvprop=timestamp|user|comment&rvdir=newer&rvstart=2006-05-01T00:00:00Z' + => 'apihelp-query+revisions-example-first5-after', + 'action=query&prop=revisions&titles=Main%20Page&rvlimit=5&' . + 'rvprop=timestamp|user|comment&rvexcludeuser=127.0.0.1' + => 'apihelp-query+revisions-example-first5-not-localhost', + 'action=query&prop=revisions&titles=Main%20Page&rvlimit=5&' . + 'rvprop=timestamp|user|comment&rvuser=MediaWiki%20default' + => 'apihelp-query+revisions-example-first5-user', ); } diff --git a/includes/api/ApiQuerySearch.php b/includes/api/ApiQuerySearch.php index bcf5d910f8..7d07f5786c 100644 --- a/includes/api/ApiQuerySearch.php +++ b/includes/api/ApiQuerySearch.php @@ -303,7 +303,10 @@ class ApiQuerySearch extends ApiQueryGeneratorBase { ), ApiBase::PARAM_ISMULTI => true, ), - 'offset' => 0, + 'offset' => array( + ApiBase::PARAM_DFLT => 0, + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), 'limit' => array( ApiBase::PARAM_DFLT => 10, ApiBase::PARAM_TYPE => 'limit', @@ -328,47 +331,14 @@ class ApiQuerySearch extends ApiQueryGeneratorBase { return $params; } - public function getParamDescription() { - $descriptions = array( - 'search' => 'Search for all page titles (or content) that has this value', - 'namespace' => 'The namespace(s) to enumerate', - 'what' => 'Search inside the text or titles', - 'info' => 'What metadata to return', - 'prop' => array( - 'What properties to return', - ' size - Adds the size of the page in bytes', - ' wordcount - Adds the word count of the page', - ' timestamp - Adds the timestamp of when the page was last edited', - ' score - DEPRECATED and IGNORED', - ' snippet - Adds a parsed snippet of the page', - ' titlesnippet - Adds a parsed snippet of the page title', - ' redirectsnippet - Adds a parsed snippet of the redirect title', - ' redirecttitle - Adds the title of the matching redirect', - ' sectionsnippet - Adds a parsed snippet of the matching section title', - ' sectiontitle - Adds the title of the matching section', - ' hasrelated - DEPRECATED and IGNORED', - ), - 'offset' => 'Use this value to continue paging (return by query)', - 'limit' => 'How many total pages to return', - 'interwiki' => 'Include interwiki results in the search, if available' - ); - - if ( count( SearchEngine::getSearchTypes() ) > 1 ) { - $descriptions['backend'] = 'Which search backend to use, if not the default'; - } - - return $descriptions; - } - - public function getDescription() { - return 'Perform a full text search.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&list=search&srsearch=meaning', - 'api.php?action=query&list=search&srwhat=text&srsearch=meaning', - 'api.php?action=query&generator=search&gsrsearch=meaning&prop=info', + 'action=query&list=search&srsearch=meaning' + => 'apihelp-query+search-example-simple', + 'action=query&list=search&srwhat=text&srsearch=meaning' + => 'apihelp-query+search-example-text', + 'action=query&generator=search&gsrsearch=meaning&prop=info' + => 'apihelp-query+search-example-generator', ); } diff --git a/includes/api/ApiQuerySiteinfo.php b/includes/api/ApiQuerySiteinfo.php index 311438fd0e..068418d4a7 100644 --- a/includes/api/ApiQuerySiteinfo.php +++ b/includes/api/ApiQuerySiteinfo.php @@ -481,9 +481,6 @@ class ApiQuerySiteinfo extends ApiQueryBase { $data = array(); $data['pages'] = intval( SiteStats::pages() ); $data['articles'] = intval( SiteStats::articles() ); - if ( !$this->getConfig()->get( 'DisableCounters' ) ) { - $data['views'] = intval( SiteStats::views() ); - } $data['edits'] = intval( SiteStats::edits() ); $data['images'] = intval( SiteStats::images() ); $data['users'] = intval( SiteStats::users() ); @@ -837,54 +834,14 @@ class ApiQuerySiteinfo extends ApiQueryBase { ); } - public function getParamDescription() { - $p = $this->getModulePrefix(); - - return array( - 'prop' => array( - 'Which sysinfo properties to get:', - ' general - Overall system information', - ' namespaces - List of registered namespaces and their canonical names', - ' namespacealiases - List of registered namespace aliases', - ' specialpagealiases - List of special page aliases', - ' magicwords - List of magic words and their aliases', - ' statistics - Returns site statistics', - ' interwikimap - Returns interwiki map ' . - "(optionally filtered, (optionally localised by using {$p}inlanguagecode))", - ' dbrepllag - Returns database server with the highest replication lag', - ' usergroups - Returns user groups and the associated permissions', - ' extensions - Returns extensions installed on the wiki', - ' fileextensions - Returns list of file extensions allowed to be uploaded', - ' rightsinfo - Returns wiki rights (license) information if available', - ' restrictions - Returns information on available restriction (protection) types', - ' languages - Returns a list of languages MediaWiki supports ' . - "(optionally localised by using {$p}inlanguagecode)", - ' skins - Returns a list of all enabled skins ' . - "(optionally localised by using {$p}inlanguagecode, otherwise in content language)", - ' extensiontags - Returns a list of parser extension tags', - ' functionhooks - Returns a list of parser function hooks', - ' showhooks - Returns a list of all subscribed hooks (contents of $wgHooks)', - ' variables - Returns a list of variable IDs', - ' protocols - Returns a list of protocols that are allowed in external links.', - ' defaultoptions - Returns the default values for user preferences.', - ), - 'filteriw' => 'Return only local or only nonlocal entries of the interwiki map', - 'showalldb' => 'List all database servers, not just the one lagging the most', - 'numberingroup' => 'Lists the number of users in user groups', - 'inlanguagecode' => 'Language code for localised language names ' . - '(best effort, use CLDR extension) and skin names', - ); - } - - public function getDescription() { - return 'Return general information about the site.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&meta=siteinfo&siprop=general|namespaces|namespacealiases|statistics', - 'api.php?action=query&meta=siteinfo&siprop=interwikimap&sifilteriw=local', - 'api.php?action=query&meta=siteinfo&siprop=dbrepllag&sishowalldb=', + 'action=query&meta=siteinfo&siprop=general|namespaces|namespacealiases|statistics' + => 'apihelp-query+siteinfo-example-simple', + 'action=query&meta=siteinfo&siprop=interwikimap&sifilteriw=local' + => 'apihelp-query+siteinfo-example-interwiki', + 'action=query&meta=siteinfo&siprop=dbrepllag&sishowalldb=' + => 'apihelp-query+siteinfo-example-replag', ); } diff --git a/includes/api/ApiQueryStashImageInfo.php b/includes/api/ApiQueryStashImageInfo.php index db9285602a..21b58af1ee 100644 --- a/includes/api/ApiQueryStashImageInfo.php +++ b/includes/api/ApiQueryStashImageInfo.php @@ -94,46 +94,32 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo { ), 'urlwidth' => array( ApiBase::PARAM_TYPE => 'integer', - ApiBase::PARAM_DFLT => -1 + ApiBase::PARAM_DFLT => -1, + ApiBase::PARAM_HELP_MSG => array( + 'apihelp-query+imageinfo-param-urlwidth', + ApiQueryImageInfo::TRANSFORM_LIMIT, + ), ), 'urlheight' => array( ApiBase::PARAM_TYPE => 'integer', - ApiBase::PARAM_DFLT => -1 + ApiBase::PARAM_DFLT => -1, + ApiBase::PARAM_HELP_MSG => 'apihelp-query+imageinfo-param-urlheight', ), 'urlparam' => array( ApiBase::PARAM_TYPE => 'string', ApiBase::PARAM_DFLT => '', + ApiBase::PARAM_HELP_MSG => 'apihelp-query+imageinfo-param-urlparam', ), ); } - /** - * Return the API documentation for the parameters. - * @return array Parameter documentation. - */ - public function getParamDescription() { - $p = $this->getModulePrefix(); - - return array( - 'prop' => self::getPropertyDescriptions( $this->propertyFilter, $p ), - 'filekey' => 'Key that identifies a previous upload that was stashed temporarily.', - 'sessionkey' => 'Alias for filekey, for backward compatibility.', - 'urlwidth' => "If {$p}prop=url is set, a URL to an image scaled to this width will be returned.", - 'urlheight' => "Similar to {$p}urlwidth. Cannot be used without {$p}urlwidth", - 'urlparam' => array( "A handler specific parameter string. For example, pdf's ", - "might use 'page15-100px'. {$p}urlwidth must be used and be consistent with {$p}urlparam" ), - ); - } - - public function getDescription() { - return 'Returns image information for stashed images.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&prop=stashimageinfo&siifilekey=124sd34rsdf567', - 'api.php?action=query&prop=stashimageinfo&siifilekey=b34edoe3|bceffd4&' . - 'siiurlwidth=120&siiprop=url', + 'action=query&prop=stashimageinfo&siifilekey=124sd34rsdf567' + => 'apihelp-query+stashimageinfo-example-simple', + 'action=query&prop=stashimageinfo&siifilekey=b34edoe3|bceffd4&' . + 'siiurlwidth=120&siiprop=url' + => 'apihelp-query+stashimageinfo-example-params', ); } } diff --git a/includes/api/ApiQueryTags.php b/includes/api/ApiQueryTags.php index 3184564845..d1e6e2896c 100644 --- a/includes/api/ApiQueryTags.php +++ b/includes/api/ApiQueryTags.php @@ -135,7 +135,9 @@ class ApiQueryTags extends ApiQueryBase { public function getAllowedParams() { return array( - 'continue' => null, + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), 'limit' => array( ApiBase::PARAM_DFLT => 10, ApiBase::PARAM_TYPE => 'limit', @@ -156,27 +158,10 @@ class ApiQueryTags extends ApiQueryBase { ); } - public function getParamDescription() { - return array( - 'continue' => 'When more results are available, use this to continue', - 'limit' => 'The maximum number of tags to list', - 'prop' => array( - 'Which properties to get', - ' name - Adds name of tag', - ' displayname - Adds system message for the tag', - ' description - Adds description of the tag', - ' hitcount - Adds the amount of revisions that have this tag', - ), - ); - } - - public function getDescription() { - return 'List change tags.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&list=tags&tgprop=displayname|description|hitcount' + 'action=query&list=tags&tgprop=displayname|description|hitcount' + => 'apihelp-query+tags-example-simple', ); } diff --git a/includes/api/ApiQueryTokens.php b/includes/api/ApiQueryTokens.php index ba9c937712..279e8e304f 100644 --- a/includes/api/ApiQueryTokens.php +++ b/includes/api/ApiQueryTokens.php @@ -81,20 +81,12 @@ class ApiQueryTokens extends ApiQueryBase { ); } - public function getParamDescription() { + protected function getExamplesMessages() { return array( - 'type' => 'Type of token(s) to request' - ); - } - - public function getDescription() { - return 'Gets tokens for data-modifying actions.'; - } - - protected function getExamples() { - return array( - 'api.php?action=query&meta=tokens' => 'Retrieve a csrf token (the default)', - 'api.php?action=query&meta=tokens&type=watch|patrol' => 'Retrieve a watch token and a patrol token' + 'action=query&meta=tokens' + => 'apihelp-query+tokens-example-simple', + 'action=query&meta=tokens&type=watch|patrol' + => 'apihelp-query+tokens-example-types', ); } diff --git a/includes/api/ApiQueryUserContributions.php b/includes/api/ApiQueryUserContributions.php index 4b167b8b7a..10d62cb10d 100644 --- a/includes/api/ApiQueryUserContributions.php +++ b/includes/api/ApiQueryUserContributions.php @@ -464,7 +464,9 @@ class ApiQueryContributions extends ApiQueryBase { 'end' => array( ApiBase::PARAM_TYPE => 'timestamp' ), - 'continue' => null, + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), 'user' => array( ApiBase::PARAM_ISMULTI => true ), @@ -474,7 +476,8 @@ class ApiQueryContributions extends ApiQueryBase { ApiBase::PARAM_TYPE => array( 'newer', 'older' - ) + ), + ApiBase::PARAM_HELP_MSG => 'api-help-param-direction', ), 'namespace' => array( ApiBase::PARAM_ISMULTI => true, @@ -507,7 +510,11 @@ class ApiQueryContributions extends ApiQueryBase { '!top', 'new', '!new', - ) + ), + ApiBase::PARAM_HELP_MSG => array( + 'apihelp-query+usercontribs-param-show', + $this->getConfig()->get( 'RCMaxAge' ) + ), ), 'tag' => null, 'toponly' => array( @@ -517,53 +524,12 @@ class ApiQueryContributions extends ApiQueryBase { ); } - public function getParamDescription() { - $p = $this->getModulePrefix(); - $RCMaxAge = $this->getConfig()->get( 'RCMaxAge' ); - - return array( - 'limit' => 'The maximum number of contributions to return', - 'start' => 'The start timestamp to return from', - 'end' => 'The end timestamp to return to', - 'continue' => 'When more results are available, use this to continue', - 'user' => 'The users to retrieve contributions for', - 'userprefix' => array( - "Retrieve contributions for all users whose names begin with this value.", - "Overrides {$p}user", - ), - 'dir' => $this->getDirectionDescription( $p ), - 'namespace' => 'Only list contributions in these namespaces', - 'prop' => array( - 'Include additional pieces of information', - ' ids - Adds the page ID and revision ID', - ' title - Adds the title and namespace ID of the page', - ' timestamp - Adds the timestamp of the edit', - ' comment - Adds the comment of the edit', - ' parsedcomment - Adds the parsed comment of the edit', - ' size - Adds the new size of the edit', - ' sizediff - Adds the size delta of the edit against its parent', - ' flags - Adds flags of the edit', - ' patrolled - Tags patrolled edits', - ' tags - Lists tags for the edit', - ), - 'show' => array( - "Show only items that meet thse criteria, e.g. non minor edits only: {$p}show=!minor", - "NOTE: If {$p}show=patrolled or {$p}show=!patrolled is set, revisions older than", - "\$wgRCMaxAge ($RCMaxAge) won't be shown", - ), - 'tag' => 'Only list revisions tagged with this tag', - 'toponly' => 'Only list changes which are the latest revision', - ); - } - - public function getDescription() { - return 'Get all edits by a user.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&list=usercontribs&ucuser=YurikBot', - 'api.php?action=query&list=usercontribs&ucuserprefix=217.121.114.', + 'action=query&list=usercontribs&ucuser=Example' + => 'apihelp-query+usercontribs-example-user', + 'action=query&list=usercontribs&ucuserprefix=192.0.2.' + => 'apihelp-query+usercontribs-example-ipprefix', ); } diff --git a/includes/api/ApiQueryUserInfo.php b/includes/api/ApiQueryUserInfo.php index fd5f47b4fe..f9eb6777f9 100644 --- a/includes/api/ApiQueryUserInfo.php +++ b/includes/api/ApiQueryUserInfo.php @@ -246,45 +246,22 @@ class ApiQueryUserInfo extends ApiQueryBase { 'acceptlang', 'registrationdate', 'unreadcount', - ) - ) - ); - } - - public function getParamDescription() { - return array( - 'prop' => array( - 'What pieces of information to include', - ' blockinfo - Tags if the current user is blocked, by whom, and for what reason', - ' hasmsg - Adds a tag "message" if the current user has pending messages', - ' groups - Lists all the groups the current user belongs to', - ' implicitgroups - Lists all the groups the current user is automatically a member of', - ' rights - Lists all the rights the current user has', - ' changeablegroups - Lists the groups the current user can add to and remove from', - ' options - Lists all preferences the current user has set', - ' preferencestoken - DEPRECATED! Get a token to change current user\'s preferences', - ' editcount - Adds the current user\'s edit count', - ' ratelimits - Lists all rate limits applying to the current user', - ' realname - Adds the user\'s real name', - ' email - Adds the user\'s email address and email authentication date', - ' acceptlang - Echoes the Accept-Language header sent by ' . - 'the client in a structured format', - ' registrationdate - Adds the user\'s registration date', - ' unreadcount - Adds the count of unread pages on the user\'s watchlist ' . - '(maximum ' . ( self::WL_UNREAD_LIMIT - 1 ) . '; returns "' . - self::WL_UNREAD_LIMIT . '+" if more)', + ), + ApiBase::PARAM_HELP_MSG => array( + 'apihelp-query+userinfo-param-prop', + self::WL_UNREAD_LIMIT - 1, + self::WL_UNREAD_LIMIT . '+', + ), ) ); } - public function getDescription() { - return 'Get information about the current user.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&meta=userinfo', - 'api.php?action=query&meta=userinfo&uiprop=blockinfo|groups|rights|hasmsg', + 'action=query&meta=userinfo' + => 'apihelp-query+userinfo-example-simple', + 'action=query&meta=userinfo&uiprop=blockinfo|groups|rights|hasmsg' + => 'apihelp-query+userinfo-example-data', ); } diff --git a/includes/api/ApiQueryUsers.php b/includes/api/ApiQueryUsers.php index c1472790ba..6d145234e3 100644 --- a/includes/api/ApiQueryUsers.php +++ b/includes/api/ApiQueryUsers.php @@ -314,33 +314,13 @@ class ApiQueryUsers extends ApiQueryBase { ); } - public function getParamDescription() { + public function getExamplesMessages() { return array( - 'prop' => array( - 'What pieces of information to include', - ' blockinfo - Tags if the user is blocked, by whom, and for what reason', - ' groups - Lists all the groups the user(s) belongs to', - ' implicitgroups - Lists all the groups a user is automatically a member of', - ' rights - Lists all the rights the user(s) has', - ' editcount - Adds the user\'s edit count', - ' registration - Adds the user\'s registration timestamp', - ' emailable - Tags if the user can and wants to receive ' . - 'email through [[Special:Emailuser]]', - ' gender - Tags the gender of the user. Returns "male", "female", or "unknown"', - ), - 'users' => 'A list of users to obtain the same information for', - 'token' => 'Which tokens to obtain for each user', + 'action=query&list=users&ususers=Example&usprop=groups|editcount|gender' + => 'apihelp-query+users-example-simple', ); } - public function getDescription() { - return 'Get information about a list of users.'; - } - - public function getExamples() { - return 'api.php?action=query&list=users&ususers=brion|TimStarling&usprop=groups|editcount|gender'; - } - public function getHelpUrls() { return 'https://www.mediawiki.org/wiki/API:Users'; } diff --git a/includes/api/ApiQueryWatchlist.php b/includes/api/ApiQueryWatchlist.php index efbe05ee65..bb6e59a722 100644 --- a/includes/api/ApiQueryWatchlist.php +++ b/includes/api/ApiQueryWatchlist.php @@ -455,7 +455,8 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase { ApiBase::PARAM_TYPE => array( 'newer', 'older' - ) + ), + ApiHelp::PARAM_HELP_MSG => 'api-help-param-direction', ), 'limit' => array( ApiBase::PARAM_DFLT => 10, @@ -512,67 +513,26 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase { 'token' => array( ApiBase::PARAM_TYPE => 'string' ), - 'continue' => null, - ); - } - - public function getParamDescription() { - $p = $this->getModulePrefix(); - - return array( - 'allrev' => 'Include multiple revisions of the same page within given timeframe', - 'start' => 'The timestamp to start enumerating from', - 'end' => 'The timestamp to end enumerating', - 'namespace' => 'Filter changes to only the given namespace(s)', - 'user' => 'Only list changes by this user', - 'excludeuser' => 'Don\'t list changes by this user', - 'dir' => $this->getDirectionDescription( $p ), - 'limit' => 'How many total results to return per request', - 'prop' => array( - 'Which additional items to get (non-generator mode only).', - ' ids - Adds revision ids and page ids', - ' title - Adds title of the page', - ' flags - Adds flags for the edit', - ' user - Adds the user who made the edit', - ' userid - Adds user id of whom made the edit', - ' comment - Adds comment of the edit', - ' parsedcomment - Adds parsed comment of the edit', - ' timestamp - Adds timestamp of the edit', - ' patrol - Tags edits that are patrolled', - ' sizes - Adds the old and new lengths of the page', - ' notificationtimestamp - Adds timestamp of when the user was last notified about the edit', - ' loginfo - Adds log information where appropriate', + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', ), - 'show' => array( - 'Show only items that meet this criteria.', - "For example, to see only minor edits done by logged-in users, set {$p}show=minor|!anon" - ), - 'type' => array( - 'Which types of changes to show', - ' edit - Regular page edits', - ' external - External changes', - ' new - Page creations', - ' log - Log entries', - ), - 'owner' => 'The name of the user whose watchlist you\'d like to access', - 'token' => 'Give a security token (settable in preferences) to ' . - 'allow access to another user\'s watchlist', - 'continue' => 'When more results are available, use this to continue', ); } - public function getDescription() { - return "Get all recent changes to pages in the logged in user's watchlist."; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&list=watchlist', - 'api.php?action=query&list=watchlist&wlprop=ids|title|timestamp|user|comment', - 'api.php?action=query&list=watchlist&wlallrev=&wlprop=ids|title|timestamp|user|comment', - 'api.php?action=query&generator=watchlist&prop=info', - 'api.php?action=query&generator=watchlist&gwlallrev=&prop=revisions&rvprop=timestamp|user', - 'api.php?action=query&list=watchlist&wlowner=Bob_Smith&wltoken=123ABC' + 'action=query&list=watchlist' + => 'apihelp-query+watchlist-example-simple', + 'action=query&list=watchlist&wlprop=ids|title|timestamp|user|comment' + => 'apihelp-query+watchlist-example-props', + 'action=query&list=watchlist&wlallrev=&wlprop=ids|title|timestamp|user|comment' + => 'apihelp-query+watchlist-example-allrev', + 'action=query&generator=watchlist&prop=info' + => 'apihelp-query+watchlist-example-generator', + 'action=query&generator=watchlist&gwlallrev=&prop=revisions&rvprop=timestamp|user' + => 'apihelp-query+watchlist-example-generator-rev', + 'action=query&list=watchlist&wlowner=Example&wltoken=123ABC' + => 'apihelp-query+watchlist-example-wlowner', ); } diff --git a/includes/api/ApiQueryWatchlistRaw.php b/includes/api/ApiQueryWatchlistRaw.php index 6b2223ac87..71ce27f832 100644 --- a/includes/api/ApiQueryWatchlistRaw.php +++ b/includes/api/ApiQueryWatchlistRaw.php @@ -131,7 +131,9 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase { public function getAllowedParams() { return array( - 'continue' => null, + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), 'namespace' => array( ApiBase::PARAM_ISMULTI => true, ApiBase::PARAM_TYPE => 'namespace' @@ -168,35 +170,17 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase { 'ascending', 'descending' ), + ApiBase::PARAM_HELP_MSG => 'api-help-param-direction', ), ); } - public function getParamDescription() { - return array( - 'continue' => 'When more results are available, use this to continue', - 'namespace' => 'Only list pages in the given namespace(s)', - 'limit' => 'How many total results to return per request', - 'prop' => array( - 'Which additional properties to get (non-generator mode only)', - ' changed - Adds timestamp of when the user was last notified about the edit', - ), - 'show' => 'Only list items that meet these criteria', - 'owner' => 'The name of the user whose watchlist you\'d like to access', - 'token' => 'Give a security token (settable in preferences) to allow ' . - 'access to another user\'s watchlist', - 'dir' => 'Direction to sort the titles and namespaces in', - ); - } - - public function getDescription() { - return "Get all pages on the logged in user's watchlist."; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=query&list=watchlistraw', - 'api.php?action=query&generator=watchlistraw&gwrshow=changed&prop=revisions', + 'action=query&list=watchlistraw' + => 'apihelp-query+watchlistraw-example-simple', + 'action=query&generator=watchlistraw&gwrshow=changed&prop=info' + => 'apihelp-query+watchlistraw-example-generator', ); } diff --git a/includes/api/ApiRevisionDelete.php b/includes/api/ApiRevisionDelete.php index cbc3070422..5107455dc8 100644 --- a/includes/api/ApiRevisionDelete.php +++ b/includes/api/ApiRevisionDelete.php @@ -199,34 +199,18 @@ class ApiRevisionDelete extends ApiBase { ); } - public function getParamDescription() { - return array( - 'type' => 'Type of revision deletion being performed', - 'target' => 'Page title for the revision deletion, if required for the type', - 'ids' => 'Identifiers for the revisions to be deleted', - 'hide' => 'What to hide for each revision', - 'show' => 'What to unhide for each revision', - 'suppress' => 'Whether to suppress data from administrators as well as others', - 'reason' => 'Reason for the deletion/undeletion', - ); - } - - public function getDescription() { - return 'Delete/undelete revisions.'; - } - public function needsToken() { return 'csrf'; } - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=revisiondelete&target=Main%20Page&type=revision&ids=12345&' . + 'action=revisiondelete&target=Main%20Page&type=revision&ids=12345&' . 'hide=content&token=123ABC' - => 'Hide content for revision 12345 on the Main Page', - 'api.php?action=revisiondelete&type=logging&ids=67890&hide=content|comment|user&' . + => 'apihelp-revisiondelete-example-revision', + 'action=revisiondelete&type=logging&ids=67890&hide=content|comment|user&' . 'reason=BLP%20violation&token=123ABC' - => 'Hide all data on log entry 67890 with the reason "BLP violation"', + => 'apihelp-revisiondelete-example-log', ); } diff --git a/includes/api/ApiRollback.php b/includes/api/ApiRollback.php index f4d3c5414d..471fb435e6 100644 --- a/includes/api/ApiRollback.php +++ b/includes/api/ApiRollback.php @@ -120,31 +120,10 @@ class ApiRollback extends ApiBase { 'nochange' ), ), - ); - } - - public function getParamDescription() { - $p = $this->getModulePrefix(); - - return array( - 'title' => "Title of the page you want to roll back. Cannot be used together with {$p}pageid", - 'pageid' => "Page ID of the page you want to roll back. Cannot be used together with {$p}title", - 'user' => 'Name of the user whose edits are to be rolled back.', 'token' => array( - /* Standard description automatically prepended */ - 'For compatibility, the token used in the web UI is also accepted.' + // Standard definition automatically inserted + ApiBase::PARAM_HELP_MSG_APPEND => array( 'api-help-param-token-webui' ), ), - 'summary' => 'Custom edit summary. If empty, default summary will be used', - 'markbot' => 'Mark the reverted edits and the revert as bot edits', - 'watchlist' => 'Unconditionally add or remove the page from your watchlist, ' . - 'use preferences or do not change watch', - ); - } - - public function getDescription() { - return array( - 'Undo the last edit to the page. If the last user who edited the page made', - 'multiple edits in a row, they will all be rolled back.' ); } @@ -211,12 +190,13 @@ class ApiRollback extends ApiBase { return $this->mTitleObj; } - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=rollback&title=Main%20Page&user=Catrope&token=123ABC', - 'api.php?action=rollback&pageid=122&user=Catrope&token=123ABC', - 'api.php?action=rollback&title=Main%20Page&user=217.121.114.116&' . - 'token=123ABC&summary=Reverting%20vandalism&markbot=1' + 'action=rollback&title=Main%20Page&user=Example&token=123ABC' => + 'apihelp-rollback-example-simple', + 'action=rollback&title=Main%20Page&user=192.0.2.5&' . + 'token=123ABC&summary=Reverting%20vandalism&markbot=1' => + 'apihelp-rollback-example-summary', ); } diff --git a/includes/api/ApiRsd.php b/includes/api/ApiRsd.php index a2771a0c4f..d32b0dd8ed 100644 --- a/includes/api/ApiRsd.php +++ b/includes/api/ApiRsd.php @@ -51,21 +51,10 @@ class ApiRsd extends ApiBase { return new ApiFormatXmlRsd( $this->getMain(), 'xml' ); } - public function getAllowedParams() { - return array(); - } - - public function getParamDescription() { - return array(); - } - - public function getDescription() { - return 'Export an RSD (Really Simple Discovery) schema.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=rsd' + 'action=rsd' + => 'apihelp-rsd-example-simple', ); } diff --git a/includes/api/ApiSetNotificationTimestamp.php b/includes/api/ApiSetNotificationTimestamp.php index 5d527fc79b..ed3ea15a47 100644 --- a/includes/api/ApiSetNotificationTimestamp.php +++ b/includes/api/ApiSetNotificationTimestamp.php @@ -219,7 +219,9 @@ class ApiSetNotificationTimestamp extends ApiBase { 'newerthanrevid' => array( ApiBase::PARAM_TYPE => 'integer' ), - 'continue' => '', + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), ); if ( $flags ) { $result += $this->getPageSet()->getFinalParams( $flags ); @@ -228,34 +230,17 @@ class ApiSetNotificationTimestamp extends ApiBase { return $result; } - public function getParamDescription() { - return $this->getPageSet()->getFinalParamDescription() + array( - 'entirewatchlist' => 'Work on all watched pages', - 'timestamp' => 'Timestamp to which to set the notification timestamp', - 'torevid' => 'Revision to set the notification timestamp to (one page only)', - 'newerthanrevid' => 'Revision to set the notification timestamp newer than (one page only)', - 'continue' => 'When more results are available, use this to continue', - ); - } - - public function getDescription() { - return array( 'Update the notification timestamp for watched pages.', - 'This affects the highlighting of changed pages in the watchlist and history,', - 'and the sending of email when the "Email me when a page on my watchlist is', - 'changed" preference is enabled.' - ); - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=setnotificationtimestamp&entirewatchlist=&token=123ABC' - => 'Reset the notification status for the entire watchlist', - 'api.php?action=setnotificationtimestamp&titles=Main_page&token=123ABC' - => 'Reset the notification status for "Main page"', - 'api.php?action=setnotificationtimestamp&titles=Main_page&' . + 'action=setnotificationtimestamp&entirewatchlist=&token=123ABC' + => 'apihelp-setnotificationtimestamp-example-all', + 'action=setnotificationtimestamp&titles=Main_page&token=123ABC' + => 'apihelp-setnotificationtimestamp-example-page', + 'action=setnotificationtimestamp&titles=Main_page&' . 'timestamp=2012-01-01T00:00:00Z&token=123ABC' - => 'Set the notification timestamp for "Main page" so all edits ' . - 'since 1 January 2012 are unviewed', + => 'apihelp-setnotificationtimestamp-example-pagetimestamp', + 'action=setnotificationtimestamp&generator=allpages&gapnamespace=2&token=123ABC' + => 'apihelp-setnotificationtimestamp-example-allpages', ); } diff --git a/includes/api/ApiTokens.php b/includes/api/ApiTokens.php index e5e9d5d4c9..2a60af99d7 100644 --- a/includes/api/ApiTokens.php +++ b/includes/api/ApiTokens.php @@ -91,23 +91,12 @@ class ApiTokens extends ApiBase { ); } - public function getParamDescription() { + protected function getExamplesMessages() { return array( - 'type' => 'Type of token(s) to request' - ); - } - - public function getDescription() { - return array( - 'This module is deprecated in favor of action=query&meta=tokens.', - 'Gets tokens for data-modifying actions.' - ); - } - - protected function getExamples() { - return array( - 'api.php?action=tokens' => 'Retrieve an edit token (the default)', - 'api.php?action=tokens&type=email|move' => 'Retrieve an email token and a move token' + 'action=tokens' + => 'apihelp-tokens-example-edit', + 'action=tokens&type=email|move' + => 'apihelp-tokens-example-emailmove', ); } } diff --git a/includes/api/ApiUnblock.php b/includes/api/ApiUnblock.php index 2854a82529..fb4183957f 100644 --- a/includes/api/ApiUnblock.php +++ b/includes/api/ApiUnblock.php @@ -93,30 +93,16 @@ class ApiUnblock extends ApiBase { ); } - public function getParamDescription() { - $p = $this->getModulePrefix(); - - return array( - 'id' => "ID of the block you want to unblock (obtained through list=blocks). " . - "Cannot be used together with {$p}user", - 'user' => "Username, IP address or IP range you want to unblock. " . - "Cannot be used together with {$p}id", - 'reason' => 'Reason for unblock', - ); - } - - public function getDescription() { - return 'Unblock a user.'; - } - public function needsToken() { return 'csrf'; } - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=unblock&id=105', - 'api.php?action=unblock&user=Bob&reason=Sorry%20Bob' + 'action=unblock&id=105' + => 'apihelp-unblock-example-id', + 'action=unblock&user=Bob&reason=Sorry%20Bob' + => 'apihelp-unblock-example-user', ); } diff --git a/includes/api/ApiUndelete.php b/includes/api/ApiUndelete.php index 07aad9f57d..39b63f4f4d 100644 --- a/includes/api/ApiUndelete.php +++ b/includes/api/ApiUndelete.php @@ -117,39 +117,17 @@ class ApiUndelete extends ApiBase { ); } - public function getParamDescription() { - return array( - 'title' => 'Title of the page you want to restore', - 'reason' => 'Reason for restoring', - 'timestamps' => array( - 'Timestamps of the revisions to restore.', - 'If both timestamps and fileids are empty, all will be restored.', - ), - 'fileids' => array( - 'IDs of the file revisions to restore.', - 'If both timestamps and fileids are empty, all will be restored.', - ), - 'watchlist' => 'Unconditionally add or remove the page from your ' . - 'watchlist, use preferences or do not change watch', - ); - } - - public function getDescription() { - return array( - 'Restore certain revisions of a deleted page. A list of deleted revisions ', - '(including timestamps) can be retrieved through list=deletedrevs, and a list', - 'of deleted file ids can be retrieved through list=filearchive.' - ); - } - public function needsToken() { return 'csrf'; } - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=undelete&title=Main%20Page&token=123ABC&reason=Restoring%20main%20page', - 'api.php?action=undelete&title=Main%20Page&token=123ABC×tamps=20070703220045|20070702194856' + 'action=undelete&title=Main%20Page&token=123ABC&reason=Restoring%20main%20page' + => 'apihelp-undelete-example-page', + 'action=undelete&title=Main%20Page&token=123ABC' . + '×tamps=2007-07-03T22:00:45Z|2007-07-02T19:48:56Z' + => 'apihelp-undelete-example-revisions', ); } diff --git a/includes/api/ApiUpload.php b/includes/api/ApiUpload.php index 2770bdcf68..8cf53d7944 100644 --- a/includes/api/ApiUpload.php +++ b/includes/api/ApiUpload.php @@ -732,59 +732,17 @@ class ApiUpload extends ApiBase { return $params; } - public function getParamDescription() { - $params = array( - 'filename' => 'Target filename', - 'comment' => 'Upload comment. Also used as the initial page text for new ' . - 'files if "text" is not specified', - 'text' => 'Initial page text for new files', - 'watch' => 'Watch the page', - 'watchlist' => 'Unconditionally add or remove the page from your watchlist, ' . - 'use preferences or do not change watch', - 'ignorewarnings' => 'Ignore any warnings', - 'file' => 'File contents', - 'url' => 'URL to fetch the file from', - 'filekey' => 'Key that identifies a previous upload that was stashed temporarily.', - 'sessionkey' => 'Same as filekey, maintained for backward compatibility.', - 'stash' => 'If set, the server will not add the file to the repository ' . - 'and stash it temporarily.', - - 'chunk' => 'Chunk contents', - 'offset' => 'Offset of chunk in bytes', - 'filesize' => 'Filesize of entire upload', - - 'async' => 'Make potentially large file operations asynchronous when possible', - 'asyncdownload' => 'Make fetching a URL asynchronous', - 'leavemessage' => 'If asyncdownload is used, leave a message on the user talk page if finished', - 'statuskey' => 'Fetch the upload status for this file key (upload by URL)', - 'checkstatus' => 'Only fetch the upload status for the given file key', - ); - - return $params; - } - - public function getDescription() { - return array( - 'Upload a file, or get the status of pending uploads. Several methods are available:', - ' * Upload file contents directly, using the "file" parameter', - ' * Have the MediaWiki server fetch a file from a URL, using the "url" parameter', - ' * Complete an earlier upload that failed due to warnings, using the "filekey" parameter', - 'Note that the HTTP POST must be done as a file upload (i.e. using multipart/form-data) when', - 'sending the "file".', - ); - } - public function needsToken() { return 'csrf'; } - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=upload&filename=Wiki.png' . - '&url=http%3A//upload.wikimedia.org/wikipedia/en/b/bc/Wiki.png&token=123ABC' - => 'Upload from a URL', - 'api.php?action=upload&filename=Wiki.png&filekey=filekey&ignorewarnings=1&token=123ABC' - => 'Complete an upload that failed due to warnings', + 'action=upload&filename=Wiki.png' . + '&url=http%3A//upload.wikimedia.org/wikipedia/en/b/bc/Wiki.png&token=123ABC' + => 'apihelp-upload-example-url', + 'action=upload&filename=Wiki.png&filekey=filekey&ignorewarnings=1&token=123ABC' + => 'apihelp-upload-example-filekey', ); } diff --git a/includes/api/ApiUserrights.php b/includes/api/ApiUserrights.php index 66af4c574c..7e93c3ef68 100644 --- a/includes/api/ApiUserrights.php +++ b/includes/api/ApiUserrights.php @@ -119,28 +119,14 @@ class ApiUserrights extends ApiBase { ), 'reason' => array( ApiBase::PARAM_DFLT => '' - ) - ); - } - - public function getParamDescription() { - return array( - 'user' => 'User name', - 'userid' => 'User id', - 'add' => 'Add the user to these groups', - 'remove' => 'Remove the user from these groups', + ), 'token' => array( - /* Standard description automatically prepended */ - 'For compatibility, the token used in the web UI is also accepted.' + // Standard definition automatically inserted + ApiBase::PARAM_HELP_MSG_APPEND => array( 'api-help-param-token-webui' ), ), - 'reason' => 'Reason for the change', ); } - public function getDescription() { - return 'Add/remove a user to/from groups.'; - } - public function needsToken() { return 'userrights'; } @@ -149,10 +135,12 @@ class ApiUserrights extends ApiBase { return $this->getUrUser( $params )->getName(); } - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=userrights&user=FooBot&add=bot&remove=sysop|bureaucrat&token=123ABC', - 'api.php?action=userrights&userid=123&add=bot&remove=sysop|bureaucrat&token=123ABC' + 'action=userrights&user=FooBot&add=bot&remove=sysop|bureaucrat&token=123ABC' + => 'apihelp-userrights-example-user', + 'action=userrights&userid=123&add=bot&remove=sysop|bureaucrat&token=123ABC' + => 'apihelp-userrights-example-userid', ); } diff --git a/includes/api/ApiWatch.php b/includes/api/ApiWatch.php index 8cd0f05934..3ba06e1334 100644 --- a/includes/api/ApiWatch.php +++ b/includes/api/ApiWatch.php @@ -161,7 +161,9 @@ class ApiWatch extends ApiBase { ApiBase::PARAM_DEPRECATED => true ), 'unwatch' => false, - 'continue' => '', + 'continue' => array( + ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', + ), ); if ( $flags ) { $result += $this->getPageSet()->getFinalParams( $flags ); @@ -170,24 +172,14 @@ class ApiWatch extends ApiBase { return $result; } - public function getParamDescription() { - $psModule = $this->getPageSet(); - - return $psModule->getParamDescription() + array( - 'title' => 'The page to (un)watch. use titles instead', - 'unwatch' => 'If set the page will be unwatched rather than watched', - 'continue' => 'When more results are available, use this to continue', - ); - } - - public function getDescription() { - return 'Add or remove pages from/to the current user\'s watchlist.'; - } - - public function getExamples() { + public function getExamplesMessages() { return array( - 'api.php?action=watch&titles=Main_Page' => 'Watch the page "Main Page"', - 'api.php?action=watch&titles=Main_Page&unwatch=' => 'Unwatch the page "Main Page"', + 'action=watch&titles=Main_Page&token=123ABC' + => 'apihelp-watch-example-watch', + 'action=watch&titles=Main_Page&unwatch=&token=123ABC' + => 'apihelp-watch-example-unwatch', + 'action=watch&generator=allpages&gapnamespace=0&token=123ABC' + => 'apihelp-watch-example-generator', ); } diff --git a/includes/api/i18n/en.json b/includes/api/i18n/en.json index c871be0b46..82a2c91f11 100644 --- a/includes/api/i18n/en.json +++ b/includes/api/i18n/en.json @@ -18,6 +18,981 @@ "apihelp-main-param-origin": "When accessing the API using a cross-domain AJAX request (CORS), set this to the originating domain. This must be included in any pre-flight request, and therefore must be part of the request URI (not the POST body). This must match one of the origins in the Origin: header exactly, so it has to be set to something like http://en.wikipedia.org or https://meta.wikimedia.org. If this parameter does not match the Origin: header, a 403 response will be returned. If this parameter matches the Origin: header and the origin is whitelisted, an Access-Control-Allow-Origin header will be set.", "apihelp-main-param-uselang": "Language to use for message translations. A list of codes may be fetched from [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo&siprop=languages]], or specify \"user\" to use the current user's language preference.", + "apihelp-block-description": "Block a user.", + "apihelp-block-param-user": "Username, IP address or IP range you want to block.", + "apihelp-block-param-expiry": "Expiry time. May be relative (e.g. \"5 months\" or \"2 weeks\") or absolute (e.g. \"2014-09-18T12:34:56Z\"). If set to \"infinite\", \"indefinite\" or \"never\", the block will never expire.", + "apihelp-block-param-reason": "Reason for block.", + "apihelp-block-param-anononly": "Block anonymous users only (i.e. disable anonymous edits for this IP).", + "apihelp-block-param-nocreate": "Prevent account creation.", + "apihelp-block-param-autoblock": "Automatically block the last used IP address, and any subsequent IP addresses they try to login from.", + "apihelp-block-param-noemail": "Prevent user from sending email through the wiki. (Requires the \"blockemail\" right).", + "apihelp-block-param-hidename": "Hide the username from the block log. (Requires the \"hideuser\" right).", + "apihelp-block-param-allowusertalk": "Allow the user to edit their own talk page (depends on $wgBlockAllowsUTEdit).", + "apihelp-block-param-reblock": "If the user is already blocked, overwrite the existing block.", + "apihelp-block-param-watchuser": "Watch the user's or IP's user and talk pages.", + "apihelp-block-example-ip-simple": "Block IP 192.0.2.5 for three days with reason \"First strike\"", + "apihelp-block-example-user-complex": "Block user Vandal indefinitely with reason \"Vandalism\", and prevent new account creation and email", + + "apihelp-clearhasmsg-description": "Clears the hasmsg flag for current user.", + "apihelp-clearhasmsg-example-1": "Clear the hasmsg flag for current user", + + "apihelp-compare-description": "Get the difference between 2 pages.\n\nYou must pass a revision number, a page title, or a page ID for both \"from\" and \"to\".", + "apihelp-compare-param-fromtitle": "First title to compare.", + "apihelp-compare-param-fromid": "First page ID to compare.", + "apihelp-compare-param-fromrev": "First revision to compare.", + "apihelp-compare-param-totitle": "Second title to compare.", + "apihelp-compare-param-toid": "Second page ID to compare.", + "apihelp-compare-param-torev": "Second revision to compare.", + "apihelp-compare-example-1": "Create a diff between revision 1 and 2", + + "apihelp-createaccount-description": "Create a new user account.", + "apihelp-createaccount-param-name": "Username.", + "apihelp-createaccount-param-password": "Password (ignored if $1mailpassword is set).", + "apihelp-createaccount-param-domain": "Domain for external authentication (optional).", + "apihelp-createaccount-param-token": "Account creation token obtained in first request.", + "apihelp-createaccount-param-email": "Email address of user (optional).", + "apihelp-createaccount-param-realname": "Real name of user (optional).", + "apihelp-createaccount-param-mailpassword": "If set to any value, a random password will be emailed to the user.", + "apihelp-createaccount-param-reason": "Optional reason for creating the account to be put in the logs.", + "apihelp-createaccount-param-language": "Language code to set as default for the user (optional, defaults to content language).", + "apihelp-createaccount-example-pass": "Create user \"testuser\" with password \"test123\"", + "apihelp-createaccount-example-mail": "Create user \"testmailuser\" and email a randomly-generated password", + + "apihelp-delete-description": "Delete a page.", + "apihelp-delete-param-title": "Title of the page you want to delete. Cannot be used together with $1pageid.", + "apihelp-delete-param-pageid": "Page ID of the page you want to delete. Cannot be used together with $1title.", + "apihelp-delete-param-reason": "Reason for the deletion. If not set, an automatically generated reason will be used.", + "apihelp-delete-param-watch": "Add the page to your watchlist.", + "apihelp-delete-param-watchlist": "Unconditionally add or remove the page from your watchlist, use preferences or do not change watch.", + "apihelp-delete-param-unwatch": "Remove the page from your watchlist.", + "apihelp-delete-param-oldimage": "The name of the old image to delete as provided by [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].", + "apihelp-delete-example-simple": "Delete the Main Page", + "apihelp-delete-example-reason": "Delete the Main Page with the reason \"Preparing for move\"", + + "apihelp-disabled-description": "This module has been disabled.", + + "apihelp-edit-description": "Create and edit pages.", + "apihelp-edit-param-title": "Title of the page you want to edit. Cannot be used together with $1pageid.", + "apihelp-edit-param-pageid": "Page ID of the page you want to edit. Cannot be used together with $1title.", + "apihelp-edit-param-section": "Section number. 0 for the top section, \"new\" for a new section.", + "apihelp-edit-param-sectiontitle": "The title for a new section.", + "apihelp-edit-param-text": "Page content.", + "apihelp-edit-param-summary": "Edit summary. Also section title when $1section=new and $1sectiontitle is not set.", + "apihelp-edit-param-minor": "Minor edit.", + "apihelp-edit-param-notminor": "Non-minor edit.", + "apihelp-edit-param-bot": "Mark this edit as bot.", + "apihelp-edit-param-basetimestamp": "Timestamp of the base revision, used to detect edit conflicts. May be obtained through [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].", + "apihelp-edit-param-starttimestamp": "Timestamp when you began the editing process, used to detect edit conflicts. An appropriate value may be obtained using [[Special:ApiHelp/main|curtimestamp]] when beginning the edit process (e.g. when loading the page content to edit).", + "apihelp-edit-param-recreate": "Override any errors about the article having been deleted in the meantime.", + "apihelp-edit-param-createonly": "Don't edit the page if it exists already.", + "apihelp-edit-param-nocreate": "Throw an error if the page doesn't exist.", + "apihelp-edit-param-watch": "Add the page to your watchlist.", + "apihelp-edit-param-unwatch": "Remove the page from your watchlist.", + "apihelp-edit-param-watchlist": "Unconditionally add or remove the page from your watchlist, use preferences or do not change watch.", + "apihelp-edit-param-md5": "The MD5 hash of the $1text parameter, or the $1prependtext and $1appendtext parameters concatenated. If set, the edit won't be done unless the hash is correct.", + "apihelp-edit-param-prependtext": "Add this text to the beginning of the page. Overrides $1text.", + "apihelp-edit-param-appendtext": "Add this text to the end of the page. Overrides $1text.\n\nUse $1section=new to append a new section, rather than this parameter.", + "apihelp-edit-param-undo": "Undo this revision. Overrides $1text, $1prependtext and $1appendtext.", + "apihelp-edit-param-undoafter": "Undo all revisions from $1undo to this one. If not set, just undo one revision.", + "apihelp-edit-param-redirect": "Automatically resolve redirects.", + "apihelp-edit-param-contentformat": "Content serialization format used for the input text.", + "apihelp-edit-param-contentmodel": "Content model of the new content.", + "apihelp-edit-param-token": "The token should always be sent as the last parameter, or at least after the $1text parameter.", + "apihelp-edit-example-edit": "Edit a page", + "apihelp-edit-example-prepend": "Prepend __NOTOC__ to a page", + "apihelp-edit-example-undo": "Undo revisions 13579 through 13585 with autosummary", + + "apihelp-emailuser-description": "Email a user.", + "apihelp-emailuser-param-target": "User to send email to.", + "apihelp-emailuser-param-subject": "Subject header.", + "apihelp-emailuser-param-text": "Mail body.", + "apihelp-emailuser-param-ccme": "Send a copy of this mail to me.", + "apihelp-emailuser-example-email": "Send an email to the User \"WikiSysop\" with the text \"Content\"", + + "apihelp-expandtemplates-description": "Expands all templates in wikitext.", + "apihelp-expandtemplates-param-title": "Title of page.", + "apihelp-expandtemplates-param-text": "Wikitext to convert.", + "apihelp-expandtemplates-param-prop": "Which pieces of information to get:\n;wikitext:The expanded wikitext.\n;categories:Any categories present in the input that are not represented in the wikitext output.\n;volatile:Whether the output is volatile and should not be reused elsewhere within the page.\n;ttl:The maximum time after which caches of the result should be invalidated.\n;parsetree:The XML parse tree of the input.\nNote that if no values are selected, the result will contain the wikitext, but the output will be in a deprecated format.", + "apihelp-expandtemplates-param-includecomments": "Whether to include HTML comments in the output.", + "apihelp-expandtemplates-param-generatexml": "Generate XML parse tree (replaced by $1prop=parsetree).", + "apihelp-expandtemplates-example-simple": "Expand the wikitext \"{{Project:Sandbox}}\"", + + "apihelp-feedcontributions-description": "Returns a user contributions feed.", + "apihelp-feedcontributions-param-feedformat": "The format of the feed.", + "apihelp-feedcontributions-param-user": "What users to get the contributions for.", + "apihelp-feedcontributions-param-namespace": "Which namespace to filter the contributions by.", + "apihelp-feedcontributions-param-year": "From year (and earlier).", + "apihelp-feedcontributions-param-month": "From month (and earlier).", + "apihelp-feedcontributions-param-tagfilter": "Filter contributions that have these tags.", + "apihelp-feedcontributions-param-deletedonly": "Show only deleted contributions.", + "apihelp-feedcontributions-param-toponly": "Only show edits that are latest revisions.", + "apihelp-feedcontributions-param-newonly": "Only show edits that are page creations.", + "apihelp-feedcontributions-param-showsizediff": "Show the size difference between revisions.", + "apihelp-feedcontributions-example-simple": "Return contributions for [[User:Example]]", + + "apihelp-feedrecentchanges-description": "Returns a recent changes feed.", + "apihelp-feedrecentchanges-param-feedformat": "The format of the feed.", + "apihelp-feedrecentchanges-param-namespace": "Namespace to limit the results to.", + "apihelp-feedrecentchanges-param-invert": "All namespaces but the selected one.", + "apihelp-feedrecentchanges-param-associated": "Include associated (talk or main) namespace.", + "apihelp-feedrecentchanges-param-days": "Days to limit the results to.", + "apihelp-feedrecentchanges-param-limit": "Maximum number of results to return.", + "apihelp-feedrecentchanges-param-from": "Show changes since then.", + "apihelp-feedrecentchanges-param-hideminor": "Hide minor changes.", + "apihelp-feedrecentchanges-param-hidebots": "Hide changes made by bots.", + "apihelp-feedrecentchanges-param-hideanons": "Hide changes made by anonymous users.", + "apihelp-feedrecentchanges-param-hideliu": "Hide changes made by registered users.", + "apihelp-feedrecentchanges-param-hidepatrolled": "Hide patrolled changes.", + "apihelp-feedrecentchanges-param-hidemyself": "Hide changes made by yourself.", + "apihelp-feedrecentchanges-param-tagfilter": "Filter by tag.", + "apihelp-feedrecentchanges-param-target": "Show only changes on pages linked from this page.", + "apihelp-feedrecentchanges-param-showlinkedto": "Show changes on pages linked to the selected page instead.", + "apihelp-feedrecentchanges-example-simple": "Show recent changes", + "apihelp-feedrecentchanges-example-30days": "Show recent changes for 30 days", + + "apihelp-feedwatchlist-description": "Returns a watchlist feed.", + "apihelp-feedwatchlist-param-feedformat": "The format of the feed.", + "apihelp-feedwatchlist-param-hours": "List pages modified within this many hours from now.", + "apihelp-feedwatchlist-param-linktosections": "Link directly to changed sections if possible.", + "apihelp-feedwatchlist-example-default": "Show the watchlist feed", + "apihelp-feedwatchlist-example-all6hrs": "Show all changes to watched pages in the past 6 hours", + + "apihelp-filerevert-description": "Revert a file to an old version.", + "apihelp-filerevert-param-filename": "Target filename, without the File: prefix.", + "apihelp-filerevert-param-comment": "Upload comment.", + "apihelp-filerevert-param-archivename": "Archive name of the revision to revert to.", + "apihelp-filerevert-example-revert": "Revert Wiki.png to the version of 2011-03-05T15:27:40Z", + + "apihelp-help-description": "Display help for the specified modules.", + "apihelp-help-param-modules": "Modules to display help for (values of the action= and format= parameters, or \"main\"). Can specify submodules with a \"+\".", + "apihelp-help-param-submodules": "Include help for submodules of the named module.", + "apihelp-help-param-recursivesubmodules": "Include help for submodules recursively.", + "apihelp-help-param-helpformat": "Format of the help output.", + "apihelp-help-param-wrap": "Wrap the output in a standard API response structure.", + "apihelp-help-param-toc": "Include a table of contents in the HTML output.", + "apihelp-help-example-main": "Help for the main module", + "apihelp-help-example-recursive": "All help in one page", + "apihelp-help-example-help": "Help for the help module itself", + "apihelp-help-example-query": "Help for two query submodules", + + "apihelp-imagerotate-description": "Rotate one or more images.", + "apihelp-imagerotate-param-rotation": "Degrees to rotate image clockwise.", + "apihelp-imagerotate-example-simple": "Rotate [[:File:Example.png]] by 90 degrees", + "apihelp-imagerotate-example-generator": "Rotate all images in [[:Category:Flip]] by 180 degrees", + + "apihelp-import-description": "Import a page from another wiki, or an XML file.\n\nNote that the HTTP POST must be done as a file upload (i.e. using multipart/form-data) when sending a file for the \"xml\" parameter.", + "apihelp-import-param-summary": "Import summary.", + "apihelp-import-param-xml": "Uploaded XML file.", + "apihelp-import-param-interwikisource": "For interwiki imports: wiki to import from.", + "apihelp-import-param-interwikipage": "For interwiki imports: page to import.", + "apihelp-import-param-fullhistory": "For interwiki imports: import the full history, not just the current version.", + "apihelp-import-param-templates": "For interwiki imports: import all included templates as well.", + "apihelp-import-param-namespace": "For interwiki imports: import to this namespace.", + "apihelp-import-param-rootpage": "Import as subpage of this page.", + "apihelp-import-example-import": "Import [[meta:Help:Parserfunctions]] to namespace 100 with full history.", + + "apihelp-login-description": "Log in and get authentication cookies.\n\nIn the event of a successful log-in, the needed cookies will be included in the HTTP response headers. In the event of a failed log-in, further attempts may be throttled to limit automated password guessing attacks.", + "apihelp-login-param-name": "User name.", + "apihelp-login-param-password": "Password.", + "apihelp-login-param-domain": "Domain (optional).", + "apihelp-login-param-token": "Login token obtained in first request.", + "apihelp-login-example-gettoken": "Retrieve a login token", + "apihelp-login-example-login": "Log in", + + "apihelp-logout-description": "Log out and clear session data.", + "apihelp-logout-example-logout": "Log the current user out", + + "apihelp-move-description": "Move a page.", + "apihelp-move-param-from": "Title of the page you want to move. Cannot be used together with $1fromid.", + "apihelp-move-param-fromid": "Page ID of the page you want to move. Cannot be used together with $1from.", + "apihelp-move-param-to": "Title you want to rename the page to.", + "apihelp-move-param-reason": "Reason for the move.", + "apihelp-move-param-movetalk": "Move the talk page, if it exists.", + "apihelp-move-param-movesubpages": "Move subpages, if applicable.", + "apihelp-move-param-noredirect": "Don't create a redirect.", + "apihelp-move-param-watch": "Add the page and the redirect to your watchlist.", + "apihelp-move-param-unwatch": "Remove the page and the redirect from your watchlist.", + "apihelp-move-param-watchlist": "Unconditionally add or remove the page from your watchlist, use preferences or do not change watch.", + "apihelp-move-param-ignorewarnings": "Ignore any warnings.", + "apihelp-move-example-move": "Move \"Badtitle\" to \"Goodtitle\" without leaving a redirect", + + "apihelp-opensearch-description": "Search the wiki using the OpenSearch protocol.", + "apihelp-opensearch-param-search": "Search string.", + "apihelp-opensearch-param-limit": "Maximum number of results to return.", + "apihelp-opensearch-param-namespace": "Namespaces to search.", + "apihelp-opensearch-param-suggest": "Do nothing if [https://www.mediawiki.org/wiki/Manual:$wgEnableOpenSearchSuggest $wgEnableOpenSearchSuggest] is false.", + "apihelp-opensearch-param-format": "The format of the output.", + "apihelp-opensearch-example-te": "Find pages beginning with \"Te\"", + + "apihelp-options-description": "Change preferences of the current user.\n\nOnly options which are registered in core or in one of installed extensions, or options with keys prefixed with \"userjs-\" (intended to be used by user scripts), can be set.", + "apihelp-options-param-reset": "Resets preferences to the site defaults.", + "apihelp-options-param-resetkinds": "List of types of options to reset when the \"$1reset\" option is set.", + "apihelp-options-param-change": "List of changes, formatted name=value (e.g. skin=vector). Value cannot contain pipe characters. If no value is given (not even an equals sign), e.g., optionname|otheroption|..., the option will be reset to its default value.", + "apihelp-options-param-optionname": "A name of a option which should be set to the value given by \"$1optionvalue\".", + "apihelp-options-param-optionvalue": "A value of the option specified by \"$1optionname\", can contain pipe characters.", + "apihelp-options-example-reset": "Reset all preferences", + "apihelp-options-example-change": "Change \"skin\" and \"hideminor\" preferences", + "apihelp-options-example-complex": "Reset all preferences, then set \"skin\" and \"nickname\"", + + "apihelp-paraminfo-description": "Obtain information about API modules.", + "apihelp-paraminfo-param-modules": "List of module names (values of the action= and format= parameters, or \"main\"). Can specify submodules with a \"+\".", + "apihelp-paraminfo-param-helpformat": "Format of help strings.", + "apihelp-paraminfo-param-querymodules": "List of query module names (value of prop=, meta= or list= parameter). Use \"$1modules=query+foo\" instead of \"$1querymodules=foo\".", + "apihelp-paraminfo-param-mainmodule": "Get information about the main (top-level) module as well. Use \"$1modules=main\" instead.", + "apihelp-paraminfo-param-pagesetmodule": "Get information about the pageset module (providing titles= and friends) as well.", + "apihelp-paraminfo-param-formatmodules": "List of format module names (value of format= parameter). Use \"$1modules\" instead.", + "apihelp-paraminfo-example-1": "Show info for [[Special:ApiHelp/parse|action=parse]], [[Special:ApiHelp/jsonfm|format=jsonfm]], [[Special:ApiHelp/query+allpages|action=query&list=allpages]], and [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]", + + "apihelp-parse-description": "Parses content and returns parser output.\n\nSee the various prop-modules of [[Special:ApiHelp/query|action=query]] to get information from the current version of a page.\n\nThere are several ways to specify the text to parse:\n# Specify a page or revision, using $1page, $1pageid, or $1oldid.\n# Specify content explicitly, using $1text, $1title, and $1contentmodel.\n# Specify only a summary to parse. $1prop should be given an empty value.", + "apihelp-parse-param-title": "Title of page the text belongs to. If omitted, $1contentmodel must be specified, and \"[[API]]\" will be used as the title.", + "apihelp-parse-param-text": "Text to parse. Use $1title or $1contentmodel to control the content model.", + "apihelp-parse-param-summary": "Summary to parse.", + "apihelp-parse-param-page": "Parse the content of this page. Cannot be used together with $1text and $1title.", + "apihelp-parse-param-pageid": "Parse the content of this page. Overrides $1page.", + "apihelp-parse-param-redirects": "If the $1page or the $1pageid parameter is set to a redirect, resolve it.", + "apihelp-parse-param-oldid": "Parse the content of this revision. Overrides $1page and $1pageid.", + "apihelp-parse-param-prop": "Which pieces of information to get:\n;text:Gives the parsed text of the wikitext.\n;langlinks:Gives the language links in the parsed wikitext.\n;categories:Gives the categories in the parsed wikitext.\n;categorieshtml:Gives the HTML version of the categories.\n;links:Gives the internal links in the parsed wikitext.\n;templates:Gives the templates in the parsed wikitext.\n;images:Gives the images in the parsed wikitext.\n;externallinks:Gives the external links in the parsed wikitext.\n;sections:Gives the sections in the parsed wikitext.\n;revid:Adds the revision ID of the parsed page.\n;displaytitle:Adds the title of the parsed wikitext.\n;headitems:Gives items to put in the <head> of the page.\n;headhtml:Gives parsed <head> of the page.\n;modules:Gives the ResourceLoader modules used on the page.\n;indicators:Gives the HTML of page status indicators used on the page.\n;iwlinks:Gives interwiki links in the parsed wikitext.\n;wikitext:Gives the original wikitext that was parsed.\n;properties:Gives various properties defined in the parsed wikitext.\n;limitreportdata:Gives the limit report in a structured way. Gives no data, when $1disablepp is set.\n;limitreporthtml:Gives the HTML version of the limit report. Gives no data, when $1disablepp is set.", + "apihelp-parse-param-pst": "Do a pre-save transform on the input before parsing it. Only valid when used with text.", + "apihelp-parse-param-onlypst": "Do a pre-save transform (PST) on the input, but don't parse it Returns the same wikitext, after a PST has been applied. Only valid when used with $1text.", + "apihelp-parse-param-effectivelanglinks": "Includes language links supplied by extensions (for use with $1prop=langlinks).", + "apihelp-parse-param-section": "Only retrieve the content of this section number.", + "apihelp-parse-param-disablepp": "Disable the PP Report from the parser output.", + "apihelp-parse-param-disableeditsection": "Disable edit section links from the parser output.", + "apihelp-parse-param-generatexml": "Generate XML parse tree (requires content model \"$1\").", + "apihelp-parse-param-preview": "Parse in preview mode.", + "apihelp-parse-param-sectionpreview": "Parse in section preview mode (enables preview mode too).", + "apihelp-parse-param-disabletoc": "Disable table of contents in output.", + "apihelp-parse-param-contentformat": "Content serialization format used for the input text. Only valid when used with $1text.", + "apihelp-parse-param-contentmodel": "Content model of the input text. If omitted, $1title must be specified, and default will be the model of the specified title. Only valid when used with $1text.", + "apihelp-parse-example-page": "Parse a page.", + "apihelp-parse-example-text": "Parse wikitext.", + "apihelp-parse-example-texttitle": "Parse wikitext, specifying the page title.", + "apihelp-parse-example-summary": "Parse a summary.", + + "apihelp-patrol-description": "Patrol a page or revision.", + "apihelp-patrol-param-rcid": "Recentchanges ID to patrol.", + "apihelp-patrol-param-revid": "Revision ID to patrol.", + "apihelp-patrol-example-rcid": "Patrol a recent change", + "apihelp-patrol-example-revid": "Patrol a revision", + + "apihelp-protect-description": "Change the protection level of a page.", + "apihelp-protect-param-title": "Title of the page to (un)protect. Cannot be used together with $1pageid.", + "apihelp-protect-param-pageid": "ID of the page to (un)protect. Cannot be used together with $1title.", + "apihelp-protect-param-protections": "List of protection levels, formatted action=level (e.g. edit=sysop).\n\n'''NOTE:''' Any actions not listed will have restrictions removed.", + "apihelp-protect-param-expiry": "Expiry timestamps. If only one timestamp is set, it'll be used for all protections. Use \"infinite\", \"indefinite\", \"infinity\" or \"never\", for a never-expiring protection.", + "apihelp-protect-param-reason": "Reason for (un)protecting.", + "apihelp-protect-param-cascade": "Enable cascading protection (i.e. protect pages included in this page). Ignored if all protection levels given do not support cascading.", + "apihelp-protect-param-watch": "If set, add the page being (un)protected to your watchlist.", + "apihelp-protect-param-watchlist": "Unconditionally add or remove the page from your watchlist, use preferences or do not change watch.", + "apihelp-protect-example-protect": "Protect a page", + "apihelp-protect-example-unprotect": "Unprotect a page by setting restrictions to \"all\"", + "apihelp-protect-example-unprotect2": "Unprotect a page by setting no restrictions", + + "apihelp-purge-description": "Purge the cache for the given titles.\n\nRequires a POST request if the user is not logged in.", + "apihelp-purge-param-forcelinkupdate": "Update the links tables.", + "apihelp-purge-param-forcerecursivelinkupdate": "Update the links table, and update the links tables for any page that uses this page as a template.", + "apihelp-purge-example-simple": "Purge the \"Main Page\" and the \"API\" page", + "apihelp-purge-example-generator": "Purge the first 10 pages in the main namespace", + + "apihelp-query-description": "Fetch data from and about MediaWiki.\n\nAll data modifications will first have to use query to acquire a token to prevent abuse from malicious sites.", + "apihelp-query-param-prop": "Which properties to get for the queried pages.", + "apihelp-query-param-list": "Which lists to get.", + "apihelp-query-param-meta": "Which metadata to get.", + "apihelp-query-param-indexpageids": "Include an additional pageids section listing all returned page IDs.", + "apihelp-query-param-export": "Export the current revisions of all given or generated pages.", + "apihelp-query-param-exportnowrap": "Return the export XML without wrapping it in an XML result (same format as [[Special:Export]]). Can only be used with $1export.", + "apihelp-query-param-iwurl": "Whether to get the full URL if the title is an interwiki link.", + "apihelp-query-param-continue": "When present, formats query-continue as key-value pairs that should simply be merged into the original request. This parameter must be set to an empty string in the initial query.\n\nThis parameter is recommended for all new development, and will be made default in the next API version.", + "apihelp-query-param-rawcontinue": "Currently ignored. In the future, \"$1continue=\" will become the default and this will be needed to receive the raw query-continue data.", + "apihelp-query-example-revisions": "Fetch [[Special:ApiHelp/query+siteinfo|site info]] and [[Special:ApiHelp/query+revisions|revisions]] of the Main Page", + "apihelp-query-example-allpages": "Fetch revisions of pages beginning with \"API/\"", + + "apihelp-query+allcategories-description": "Enumerate all categories.", + "apihelp-query+allcategories-param-from": "The category to start enumerating from.", + "apihelp-query+allcategories-param-to": "The category to stop enumerating at.", + "apihelp-query+allcategories-param-prefix": "Search for all category titles that begin with this value.", + "apihelp-query+allcategories-param-dir": "Direction to sort in.", + "apihelp-query+allcategories-param-min": "Only return categories with at least this many members.", + "apihelp-query+allcategories-param-max": "Only return categories with at most this many members.", + "apihelp-query+allcategories-param-limit": "How many categories to return.", + "apihelp-query+allcategories-param-prop": "Which properties to get:\n;size:Adds number of pages in the category.\n;hidden:Tags categories that are hidden with __HIDDENCAT__.", + "apihelp-query+allcategories-example-size": "List categories with information on the number of pages in each", + "apihelp-query+allcategories-example-generator": "Retrieve info about the category page itself for categories beginning \"List\"", + + "apihelp-query+allfileusages-description": "List all file usages, including non-existing.", + "apihelp-query+allfileusages-param-from": "The title of the file to start enumerating from.", + "apihelp-query+allfileusages-param-to": "The title of the file to stop enumerating at.", + "apihelp-query+allfileusages-param-prefix": "Search for all file titles that begin with this value.", + "apihelp-query+allfileusages-param-unique": "Only show distinct file titles. Cannot be used with $1prop=ids.\nWhen used as a generator, yields target pages instead of source pages.", + "apihelp-query+allfileusages-param-prop": "Which pieces of information to include:\n;ids:Adds the pageid of the using page (cannot be used with $1unique).\n;title:Adds the title of the file.", + "apihelp-query+allfileusages-param-limit": "How many total items to return.", + "apihelp-query+allfileusages-param-dir": "The direction in which to list.", + "apihelp-query+allfileusages-example-B": "List file titles, including missing ones, with page ids they are from, starting at B", + "apihelp-query+allfileusages-example-unique": "List unique file titles", + "apihelp-query+allfileusages-example-unique-generator": "Gets all file titles, marking the missing ones", + "apihelp-query+allfileusages-example-generator": "Gets pages containing the files", + + "apihelp-query+allimages-description": "Enumerate all images sequentially.", + "apihelp-query+allimages-param-sort": "Property to sort by.", + "apihelp-query+allimages-param-dir": "The direction in which to list.", + "apihelp-query+allimages-param-from": "The image title to start enumerating from. Can only be used with $1sort=name.", + "apihelp-query+allimages-param-to": "The image title to stop enumerating at. Can only be used with $1sort=name.", + "apihelp-query+allimages-param-start": "The timestamp to start enumerating from. Can only be used with $1sort=timestamp.", + "apihelp-query+allimages-param-end": "The timestamp to end enumerating. Can only be used with $1sort=timestamp.", + "apihelp-query+allimages-param-prop": "Which image information to get:\n;timestamp:Adds timestamp for the uploaded version.\n;user:Adds the user who uploaded the image version.\n;userid:Add the user ID that uploaded the image version.\n;comment:Comment on the version.\n;parsedcomment:Parse the comment on the version.\n;canonicaltitle:Adds the canonical title of the image file.\n;url:Gives URL to the image and the description page.\n;size:Adds the size of the image in bytes and the height, width and page count (if applicable).\n;dimensions:Alias for size.\n;sha1:Adds SHA-1 hash for the image.\n;mime:Adds MIME type of the image.\n;mediatype:Adds the media type of the image.\n;metadata:Lists Exif metadata for the version of the image.\n;commonmetadata:Lists file format generic metadata for the version of the image.\n;extmetadata:Lists formatted metadata combined from multiple sources. Results are HTML formatted.\n;bitdepth:Adds the bit depth of the version.", + "apihelp-query+allimages-param-prefix": "Search for all image titles that begin with this value. Can only be used with $1sort=name.", + "apihelp-query+allimages-param-minsize": "Limit to images with at least this many bytes.", + "apihelp-query+allimages-param-maxsize": "Limit to images with at most this many bytes.", + "apihelp-query+allimages-param-sha1": "SHA1 hash of image. Overrides $1sha1base36.", + "apihelp-query+allimages-param-sha1base36": "SHA1 hash of image in base 36 (used in MediaWiki).", + "apihelp-query+allimages-param-user": "Only return files uploaded by this user. Can only be used with $1sort=timestamp. Cannot be used together with $1filterbots.", + "apihelp-query+allimages-param-filterbots": "How to filter files uploaded by bots. Can only be used with $1sort=timestamp. Cannot be used together with $1user.", + "apihelp-query+allimages-param-mime": "What MIME type to search for. e.g. image/jpeg.", + "apihelp-query+allimages-param-limit": "How many images in total to return.", + "apihelp-query+allimages-example-B": "Show a list of files starting at the letter \"B\"", + "apihelp-query+allimages-example-recent": "Show a list of recently uploaded files similar to [[Special:NewFiles]]", + "apihelp-query+allimages-example-generator": "Show info about 4 files starting at the letter \"T\"", + + "apihelp-query+alllinks-description": "Enumerate all links that point to a given namespace.", + "apihelp-query+alllinks-param-from": "The title of the link to start enumerating from.", + "apihelp-query+alllinks-param-to": "The title of the link to stop enumerating at.", + "apihelp-query+alllinks-param-prefix": "Search for all linked titles that begin with this value.", + "apihelp-query+alllinks-param-unique": "Only show distinct linked titles. Cannot be used with $1prop=ids.\nWhen used as a generator, yields target pages instead of source pages.", + "apihelp-query+alllinks-param-prop": "Which pieces of information to include:\n;ids:Adds the pageid of the linking page (cannot be used with $1unique).\n;title:Adds the title of the link.", + "apihelp-query+alllinks-param-namespace": "The namespace to enumerate.", + "apihelp-query+alllinks-param-limit": "How many total items to return.", + "apihelp-query+alllinks-param-dir": "The direction in which to list.", + "apihelp-query+alllinks-example-B": "List linked titles, including missing ones, with page ids they are from, starting at B", + "apihelp-query+alllinks-example-unique": "List unique linked titles", + "apihelp-query+alllinks-example-unique-generator": "Gets all linked titles, marking the missing ones", + "apihelp-query+alllinks-example-generator": "Gets pages containing the links", + + "apihelp-query+allmessages-description": "Return messages from this site.", + "apihelp-query+allmessages-param-messages": "Which messages to output. \"*\" (default) means all messages.", + "apihelp-query+allmessages-param-prop": "Which properties to get.", + "apihelp-query+allmessages-param-enableparser": "Set to enable parser, will preprocess the wikitext of message (substitute magic words, handle templates, etc.).", + "apihelp-query+allmessages-param-nocontent": "If set, do not include the content of the messages in the output.", + "apihelp-query+allmessages-param-includelocal": "Also include local messages, i.e. messages that don't exist in the software but do exist as a MediaWiki: page.\nThis lists all MediaWiki: pages, so it will also list those that aren't really messages such as [[MediaWiki:Common.js|Common.js]].", + "apihelp-query+allmessages-param-args": "Arguments to be substituted into message.", + "apihelp-query+allmessages-param-filter": "Return only messages with names that contain this string.", + "apihelp-query+allmessages-param-customised": "Return only messages in this customisation state.", + "apihelp-query+allmessages-param-lang": "Return messages in this language.", + "apihelp-query+allmessages-param-from": "Return messages starting at this message.", + "apihelp-query+allmessages-param-to": "Return messages ending at this message.", + "apihelp-query+allmessages-param-title": "Page name to use as context when parsing message (for $1enableparser option).", + "apihelp-query+allmessages-param-prefix": "Return messages with this prefix.", + "apihelp-query+allmessages-example-ipb": "Show messages starting with \"ipb-\"", + "apihelp-query+allmessages-example-de": "Show messages \"august\" and \"mainpage\" in German", + + "apihelp-query+allpages-description": "Enumerate all pages sequentially in a given namespace.", + "apihelp-query+allpages-param-from": "The page title to start enumerating from.", + "apihelp-query+allpages-param-to": "The page title to stop enumerating at.", + "apihelp-query+allpages-param-prefix": "Search for all page titles that begin with this value.", + "apihelp-query+allpages-param-namespace": "The namespace to enumerate.", + "apihelp-query+allpages-param-filterredir": "Which pages to list.", + "apihelp-query+allpages-param-minsize": "Limit to pages with at least this many bytes.", + "apihelp-query+allpages-param-maxsize": "Limit to pages with at most this many bytes.", + "apihelp-query+allpages-param-prtype": "Limit to protected pages only.", + "apihelp-query+allpages-param-prlevel": "Filter protections based on protection level (must be used with $1prtype= parameter).", + "apihelp-query+allpages-param-prfiltercascade": "Filter protections based on cascadingness (ignored when $1prtype isn't set).", + "apihelp-query+allpages-param-limit": "How many total pages to return.", + "apihelp-query+allpages-param-dir": "The direction in which to list.", + "apihelp-query+allpages-param-filterlanglinks": "Filter based on whether a page has langlinks. Note that this may not consider langlinks added by extensions.", + "apihelp-query+allpages-param-prexpiry": "Which protection expiry to filter the page on:\n;indefinite:Get only pages with indefinite protection expiry.\n;definite:Get only pages with a definite (specific) protection expiry.\n;all:Get pages with any protections expiry.", + "apihelp-query+allpages-example-B": "Show a list of pages starting at the letter \"B\"", + "apihelp-query+allpages-example-generator": "Show info about 4 pages starting at the letter \"T\"", + "apihelp-query+allpages-example-generator-revisions": "Show content of first 2 non-redirect pages beginning at \"Re\"", + + "apihelp-query+allredirects-description": "List all redirects to a namespace.", + "apihelp-query+allredirects-param-from": "The title of the redirect to start enumerating from.", + "apihelp-query+allredirects-param-to": "The title of the redirect to stop enumerating at.", + "apihelp-query+allredirects-param-prefix": "Search for all target pages that begin with this value.", + "apihelp-query+allredirects-param-unique": "Only show distinct target pages. Cannot be used with $1prop=ids|fragment|interwiki.\nWhen used as a generator, yields target pages instead of source pages.", + "apihelp-query+allredirects-param-prop": "Which pieces of information to include:\n;ids:Adds the pageid of the redirecting page (cannot be used with $1unique).\n;title:Adds the title of the redirect.\n;fragment:Adds the fragment from the redirect, if any (cannot be used with $1unique).\n;interwiki:Adds the interwiki prefix from the redirect, if any (cannot be used with $1unique).", + "apihelp-query+allredirects-param-namespace": "The namespace to enumerate.", + "apihelp-query+allredirects-param-limit": "How many total items to return.", + "apihelp-query+allredirects-param-dir": "The direction in which to list.", + "apihelp-query+allredirects-example-B": "List target pages, including missing ones, with page ids they are from, starting at B", + "apihelp-query+allredirects-example-unique": "List unique target pages", + "apihelp-query+allredirects-example-unique-generator": "Gets all target pages, marking the missing ones", + "apihelp-query+allredirects-example-generator": "Gets pages containing the redirects", + + "apihelp-query+alltransclusions-description": "List all transclusions (pages embedded using {{x}}), including non-existing.", + "apihelp-query+alltransclusions-param-from": "The title of the transclusion to start enumerating from.", + "apihelp-query+alltransclusions-param-to": "The title of the transclusion to stop enumerating at.", + "apihelp-query+alltransclusions-param-prefix": "Search for all transcluded titles that begin with this value.", + "apihelp-query+alltransclusions-param-unique": "Only show distinct transcluded titles. Cannot be used with $1prop=ids.\nWhen used as a generator, yields target pages instead of source pages.", + "apihelp-query+alltransclusions-param-prop": "Which pieces of information to include:\n;ids:Adds the pageid of the transcluding page (cannot be used with $1unique).\n;title:Adds the title of the transclusion.", + "apihelp-query+alltransclusions-param-namespace": "The namespace to enumerate.", + "apihelp-query+alltransclusions-param-limit": "How many total items to return.", + "apihelp-query+alltransclusions-param-dir": "The direction in which to list.", + "apihelp-query+alltransclusions-example-B": "List transcluded titles, including missing ones, with page ids they are from, starting at B", + "apihelp-query+alltransclusions-example-unique": "List unique transcluded titles", + "apihelp-query+alltransclusions-example-unique-generator": "Gets all transcluded titles, marking the missing ones", + "apihelp-query+alltransclusions-example-generator": "Gets pages containing the transclusions", + + "apihelp-query+allusers-description": "Enumerate all registered users.", + "apihelp-query+allusers-param-from": "The user name to start enumerating from.", + "apihelp-query+allusers-param-to": "The user name to stop enumerating at.", + "apihelp-query+allusers-param-prefix": "Search for all users that begin with this value.", + "apihelp-query+allusers-param-dir": "Direction to sort in.", + "apihelp-query+allusers-param-group": "Only include users in the given groups.", + "apihelp-query+allusers-param-excludegroup": "Exclude users in the given groups.", + "apihelp-query+allusers-param-rights": "Only include users with the given rights. Does not include rights granted by implicit or auto-promoted groups like *, user, or autoconfirmed.", + "apihelp-query+allusers-param-prop": "Which pieces of information to include:\n;blockinfo:Adds the information about a current block on the user.\n;groups:Lists groups that the user is in. This uses more server resources and may return fewer results than the limit.\n;implicitgroups:Lists all the groups the user is automatically in.\n;rights:Lists rights that the user has.\n;editcount:Adds the edit count of the user.\n;registration:Adds the timestamp of when the user registered if available (may be blank).", + "apihelp-query+allusers-param-limit": "How many total user names to return.", + "apihelp-query+allusers-param-witheditsonly": "Only list users who have made edits.", + "apihelp-query+allusers-param-activeusers": "Only list users active in the last $1 {{PLURAL:$1|day|days}}.", + "apihelp-query+allusers-example-Y": "List users starting at Y", + + "apihelp-query+backlinks-description": "Find all pages that link to the given page.", + "apihelp-query+backlinks-param-title": "Title to search. Cannot be used together with $1pageid.", + "apihelp-query+backlinks-param-pageid": "Pageid to search. Cannot be used together with $1title.", + "apihelp-query+backlinks-param-namespace": "The namespace to enumerate.", + "apihelp-query+backlinks-param-dir": "The direction in which to list.", + "apihelp-query+backlinks-param-filterredir": "How to filter for redirects. If set to nonredirects when $1redirect is enabled, this is only applied to the second level.", + "apihelp-query+backlinks-param-limit": "How many total pages to return. If $1redirect is enabled, limit applies to each level separately (which means you may get up to 2 * limit results).", + "apihelp-query+backlinks-param-redirect": "If linking page is a redirect, find all pages that link to that redirect as well. Maximum limit is halved.", + "apihelp-query+backlinks-example-simple": "Show links to [[Main page]]", + "apihelp-query+backlinks-example-generator": "Get information about pages linking to [[Main page]]", + + "apihelp-query+blocks-description": "List all blocked users and IP addresses.", + "apihelp-query+blocks-param-start": "The timestamp to start enumerating from.", + "apihelp-query+blocks-param-end": "The timestamp to stop enumerating at.", + "apihelp-query+blocks-param-ids": "List of block IDs to list (optional).", + "apihelp-query+blocks-param-users": "List of users to search for (optional).", + "apihelp-query+blocks-param-ip": "Get all blocks applying to this IP or CIDR range, including range blocks.\nCannot be used together with $3users. CIDR ranges broader than IPv4/$1 or IPv6/$2 are not accepted.", + "apihelp-query+blocks-param-limit": "The maximum number of blocks to list.", + "apihelp-query+blocks-param-prop": "Which properties to get:\n;id:Adds the ID of the block.\n;user:Adds the username of the blocked user.\n;userid:Adds the user ID of the blocked user.\n;by:Adds the username of the blocking user.\n;byid:Adds the user ID of the blocking user.\n;timestamp:Adds the timestamp of when the block was given.\n;expiry:Adds the timestamp of when the block expires.\n;reason:Adds the reason given for the block.\n;range:Adds the range of IPs affected by the block.\n;flags:Tags the ban with (autoblock, anononly, etc.).", + "apihelp-query+blocks-param-show": "Show only items that meet these criteria.\nFor example, to see only indefinite blocks on IPs, set $1show=ip|!temp.", + "apihelp-query+blocks-example-simple": "List blocks", + "apihelp-query+blocks-example-users": "List blocks of users Alice and Bob", + + "apihelp-query+categories-description": "List all categories the pages belong to.", + "apihelp-query+categories-param-prop": "Which additional properties to get for each category:\n;sortkey:Adds the sortkey (hexadecimal string) and sortkey prefix (human-readable part) for the category.\n;timestamp:Adds timestamp of when the category was added.\n;hidden:Tags categories that are hidden with __HIDDENCAT__.", + "apihelp-query+categories-param-show": "Which kind of categories to show.", + "apihelp-query+categories-param-limit": "How many categories to return.", + "apihelp-query+categories-param-categories": "Only list these categories. Useful for checking whether a certain page is in a certain category.", + "apihelp-query+categories-param-dir": "The direction in which to list.", + "apihelp-query+categories-example-simple": "Get a list of categories [[Albert Einstein]] belongs to", + "apihelp-query+categories-example-generator": "Get information about all categories used in the [[Albert Einstein]]", + + "apihelp-query+categoryinfo-description": "Returns information about the given categories.", + "apihelp-query+categoryinfo-example-simple": "Get information about [[:Category:Foo]] and [[:Category:Bar]]", + + "apihelp-query+categorymembers-description": "List all pages in a given category.", + "apihelp-query+categorymembers-param-title": "Which category to enumerate (required). Must include the \"Category:\" prefix. Cannot be used together with $1pageid.", + "apihelp-query+categorymembers-param-pageid": "Page ID of the category to enumerate. Cannot be used together with $1title.", + "apihelp-query+categorymembers-param-prop": "Which pieces of information to include:\n;ids:Adds the page ID.\n;title:Adds the title and namespace ID of the page.\n;sortkey:Adds the sortkey used for sorting in the category (hexadecimal string).\n;sortkeyprefix:Adds the sortkey prefix used for sorting in the category (human-readable part of the sortkey).\n;type:Adds the type that the page has been categorised as (page, subcat or file).\n;timestamp:Adds the timestamp of when the page was included.", + "apihelp-query+categorymembers-param-namespace": "Only include pages in these namespaces. Note that $1type=subcat or $1type=file may be used instead of $1namespace=14 or 6.", + "apihelp-query+categorymembers-param-type": "Which type of category members to include. Ignored when $1sort=timestamp is set.", + "apihelp-query+categorymembers-param-limit": "The maximum number of pages to return.", + "apihelp-query+categorymembers-param-sort": "Property to sort by.", + "apihelp-query+categorymembers-param-dir": "In which direction to sort.", + "apihelp-query+categorymembers-param-start": "Timestamp to start listing from. Can only be used with $1sort=timestamp.", + "apihelp-query+categorymembers-param-end": "Timestamp to end listing at. Can only be used with $1sort=timestamp.", + "apihelp-query+categorymembers-param-starthexsortkey": "Sortkey to start listing from, as returned by $1prop=sortkey. Can only be used with $1sort=sortkey.", + "apihelp-query+categorymembers-param-endhexsortkey": "Sortkey to end listing from, as returned by $1prop=sortkey. Can only be used with $1sort=sortkey.", + "apihelp-query+categorymembers-param-startsortkeyprefix": "Sortkey prefix to start listing from. Can only be used with $1sort=sortkey. Overrides $1starthexsortkey.", + "apihelp-query+categorymembers-param-endsortkeyprefix": "Sortkey prefix to end listing BEFORE (not at, if this value occurs it will not be included!). Can only be used with $1sort=sortkey. Overrides $1endhexsortkey.", + "apihelp-query+categorymembers-param-startsortkey": "Use $1starthexsortkey instead.", + "apihelp-query+categorymembers-param-endsortkey": "Use $1endhexsortkey instead.", + "apihelp-query+categorymembers-example-simple": "Get first 10 pages in [[:Category:Physics]]", + "apihelp-query+categorymembers-example-generator": "Get page info about first 10 pages in [[:Category:Physics]]", + + "apihelp-query+contributors-description": "Get the list of logged-in contributors and the count of anonymous contributors to a page.", + "apihelp-query+contributors-param-group": "Only include users in the given groups. Does not include implicit or auto-promoted groups like *, user, or autoconfirmed.", + "apihelp-query+contributors-param-excludegroup": "Exclude users in the given groups. Does not include implicit or auto-promoted groups like *, user, or autoconfirmed.", + "apihelp-query+contributors-param-rights": "Only include users having the given rights. Does not include rights granted by implicit or auto-promoted groups like *, user, or autoconfirmed.", + "apihelp-query+contributors-param-excluderights": "Exclude users having the given rights. Does not include rights granted by implicit or auto-promoted groups like *, user, or autoconfirmed.", + "apihelp-query+contributors-param-limit": "How many contributors to return.", + "apihelp-query+contributors-example-simple": "Show contributors to the [[Main Page]]", + + "apihelp-query+deletedrevs-description": "List deleted revisions.\n\nOperates in three modes:\n# List deleted revisions for the given titles, sorted by timestamp.\n# List deleted contributions for the given user, sorted by timestamp (no titles specified).\n# List all deleted revisions in the given namespace, sorted by title and timestamp (no titles specified, $1user not set).\n\nCertain parameters only apply to some modes and are ignored in others.", + "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Mode|Modes}}: $2", + "apihelp-query+deletedrevs-param-start": "The timestamp to start enumerating from.", + "apihelp-query+deletedrevs-param-end": "The timestamp to stop enumerating at.", + "apihelp-query+deletedrevs-param-from": "Start listing at this title.", + "apihelp-query+deletedrevs-param-to": "Stop listing at this title.", + "apihelp-query+deletedrevs-param-prefix": "Search for all page titles that begin with this value.", + "apihelp-query+deletedrevs-param-unique": "List only one revision for each page.", + "apihelp-query+deletedrevs-param-tag": "Only list revisions tagged with this tag.", + "apihelp-query+deletedrevs-param-user": "Only list revisions by this user.", + "apihelp-query+deletedrevs-param-excludeuser": "Don't list revisions by this user.", + "apihelp-query+deletedrevs-param-namespace": "Only list pages in this namespace.", + "apihelp-query+deletedrevs-param-limit": "The maximum amount of revisions to list.", + "apihelp-query+deletedrevs-param-prop": "Which properties to get:\n;revid:Adds the revision ID of the deleted revision.\n;parentid:Adds the revision ID of the previous revision to the page.\n;user:Adds the user who made the revision.\n;userid:Adds the user ID whom made the revision.\n;comment:Adds the comment of the revision.\n;parsedcomment:Adds the parsed comment of the revision.\n;minor:Tags if the revision is minor.\n;len:Adds the length (bytes) of the revision.\n;sha1:Adds the SHA-1 (base 16) of the revision.\n;content:Adds the content of the revision.\n;token:Deprecated. Gives the edit token.\n;tags:Tags for the revision.", + "apihelp-query+deletedrevs-example-mode1": "List the last deleted revisions of Main Page and Talk:Main Page, with content (mode 1)", + "apihelp-query+deletedrevs-example-mode2": "List the last 50 deleted contributions by Bob (mode 2)", + "apihelp-query+deletedrevs-example-mode3-main": "List the first 50 deleted revisions in the main namespace (mode 3)", + "apihelp-query+deletedrevs-example-mode3-talk": "List the first 50 deleted pages in the Talk namespace (mode 3):", + + "apihelp-query+disabled-description": "This query module has been disabled.", + + "apihelp-query+duplicatefiles-description": "List all files that are duplicates of the given files based on hash values.", + "apihelp-query+duplicatefiles-param-limit": "How many duplicate files to return.", + "apihelp-query+duplicatefiles-param-dir": "The direction in which to list.", + "apihelp-query+duplicatefiles-param-localonly": "Look only for files in the local repository.", + "apihelp-query+duplicatefiles-example-simple": "Look for duplicates of [[:File:Albert Einstein Head.jpg]]", + "apihelp-query+duplicatefiles-example-generated": "Look for duplicates of all files", + + "apihelp-query+embeddedin-description": "Find all pages that embed (transclude) the given title.", + "apihelp-query+embeddedin-param-title": "Title to search. Cannot be used together with $1pageid.", + "apihelp-query+embeddedin-param-pageid": "Pageid to search. Cannot be used together with $1title.", + "apihelp-query+embeddedin-param-namespace": "The namespace to enumerate.", + "apihelp-query+embeddedin-param-dir": "The direction in which to list.", + "apihelp-query+embeddedin-param-filterredir": "How to filter for redirects.", + "apihelp-query+embeddedin-param-limit": "How many total pages to return.", + "apihelp-query+embeddedin-example-simple": "Show pages transcluding [[Template:Stub]]", + "apihelp-query+embeddedin-example-generator": "Get information about pages transcluding [[Template:Stub]]", + + "apihelp-query+extlinks-description": "Returns all external URLs (not interwikis) from the given pages.", + "apihelp-query+extlinks-param-limit": "How many links to return.", + "apihelp-query+extlinks-param-protocol": "Protocol of the URL. If empty and $1query is set, the protocol is \"http\". Leave both this and $1query empty to list all external links.", + "apihelp-query+extlinks-param-query": "Search string without protocol. Useful for checking whether a certain page contains a certain external url.", + "apihelp-query+extlinks-param-expandurl": "Expand protocol-relative URLs with the canonical protocol.", + "apihelp-query+extlinks-example-simple": "Get a list of external links on the [[Main Page]]", + + "apihelp-query+exturlusage-description": "Enumerate pages that contain a given URL.", + "apihelp-query+exturlusage-param-prop": "Which pieces of information to include:\n;ids:Adds the ID of page.\n;title:Adds the title and namespace ID of the page.\n;url:Adds the URL used in the page.", + "apihelp-query+exturlusage-param-protocol": "Protocol of the URL. If empty and $1query set, the protocol is \"http\". Leave both this and $1query empty to list all external links.", + "apihelp-query+exturlusage-param-query": "Search string without protocol. See [[Special:LinkSearch]]. Leave empty to list all external links.", + "apihelp-query+exturlusage-param-namespace": "The page namespaces to enumerate.", + "apihelp-query+exturlusage-param-limit": "How many pages to return.", + "apihelp-query+exturlusage-param-expandurl": "Expand protocol-relative URLs with the canonical protocol.", + "apihelp-query+exturlusage-example-simple": "Show pages linking to http://www.mediawiki.org", + + "apihelp-query+filearchive-description": "Enumerate all deleted files sequentially.", + "apihelp-query+filearchive-param-from": "The image title to start enumerating from.", + "apihelp-query+filearchive-param-to": "The image title to stop enumerating at.", + "apihelp-query+filearchive-param-prefix": "Search for all image titles that begin with this value.", + "apihelp-query+filearchive-param-limit": "How many images to return in total.", + "apihelp-query+filearchive-param-dir": "The direction in which to list.", + "apihelp-query+filearchive-param-sha1": "SHA1 hash of image. Overrides $1sha1base36.", + "apihelp-query+filearchive-param-sha1base36": "SHA1 hash of image in base 36 (used in MediaWiki).", + "apihelp-query+filearchive-param-prop": "Which image information to get:\n;sha1:Adds SHA-1 hash for the image.\n;timestamp:Adds timestamp for the uploaded version.\n;user:Adds user who uploaded the image version.\n;size:Adds the size of the image in bytes and the height, width and page count (if applicable).\n;dimensions:Alias for size.\n;description:Adds description the image version.\n;parseddescription:Parse the description on the version.\n;mime:Adds MIME of the image.\n;mediatype:Adds the media type of the image.\n;metadata:Lists Exif metadata for the version of the image.\n;bitdepth:Adds the bit depth of the version.\n;archivename:Adds the file name of the archive version for non-latest versions.", + "apihelp-query+filearchive-example-simple": "Show a list of all deleted files", + + "apihelp-query+filerepoinfo-description": "Return meta information about image repositories configured on the wiki.", + "apihelp-query+filerepoinfo-param-prop": "Which repository properties to get (there may be more available on some wikis):\n;apiurl:URL to the repository API - helpful for getting image info from the host.\n;name:The key of the repository - used in e.g. $wgForeignFileRepos and imageinfo return values.\n;displayname:The human-readable name of the repository wiki.\n;rooturl:Root URL for image paths.\n;local:Whether that repository is the local one or not.", + "apihelp-query+filerepoinfo-example-simple": "Get information about file repositories", + + "apihelp-query+fileusage-description": "Find all pages that use the given files.", + "apihelp-query+fileusage-param-prop": "Which properties to get:\n;pageid:Page id of each page.\n;title:Title of each page.\n;redirect:Flag if the page is a redirect.", + "apihelp-query+fileusage-param-namespace": "Only include pages in these namespaces.", + "apihelp-query+fileusage-param-limit": "How many to return.", + "apihelp-query+fileusage-param-show": "Show only items that meet these criteria:\n;redirect:Only show redirects.\n;!redirects:Only show non-redirects.", + "apihelp-query+fileusage-example-simple": "Get a list of pages using [[:File:Example.jpg]]", + "apihelp-query+fileusage-example-generator": "Get information about pages using [[:File:Example.jpg]]", + + "apihelp-query+imageinfo-description": "Returns file information and upload history.", + "apihelp-query+imageinfo-param-prop": "Which file information to get:\n;timestamp:Adds timestamp for the uploaded version.\n;user:Adds the user who uploaded each file version.\n;userid:Add the user ID that uploaded each file version.\n;comment:Comment on the version.\n;parsedcomment:Parse the comment on the version.\n;canonicaltitle:Adds the canonical title of the file.\n;url:Gives URL to the file and the description page.\n;size:Adds the size of the file in bytes and the height, width and page count (if applicable).\n;dimensions:Alias for size.\n;sha1:Adds SHA-1 hash for the file.\n;mime:Adds MIME type of the file.\n;thumbmime:Adds MIME type of the image thumbnail (requires url and param $1urlwidth).\n;mediatype:Adds the media type of the file.\n;metadata:Lists Exif metadata for the version of the file.\n;commonmetadata:Lists file format generic metadata for the version of the file.\n;extmetadata:Lists formatted metadata combined from multiple sources. Results are HTML formatted.\n;archivename:Adds the file name of the archive version for non-latest versions.\n;bitdepth:Adds the bit depth of the version.\n;uploadwarning:Used by the Special:Upload page to get information about an existing file. Not intended for use outside MediaWiki core.", + "apihelp-query+imageinfo-param-limit": "How many file revisions to return per file.", + "apihelp-query+imageinfo-param-start": "Timestamp to start listing from.", + "apihelp-query+imageinfo-param-end": "Timestamp to stop listing at.", + "apihelp-query+imageinfo-param-urlwidth": "If $2prop=url is set, a URL to an image scaled to this width will be returned.\nFor performance reasons if this option is used, no more than $1 scaled images will be returned.", + "apihelp-query+imageinfo-param-urlheight": "Similar to $1urlwidth.", + "apihelp-query+imageinfo-param-metadataversion": "Version of metadata to use. if \"latest\" is specified, use latest version. Defaults to \"1\" for backwards compatibility.", + "apihelp-query+imageinfo-param-extmetadatalanguage": "What language to fetch extmetadata in. This affects both which translation to fetch, if multiple are available, as well as how things like numbers and various values are formatted.", + "apihelp-query+imageinfo-param-extmetadatamultilang": "If translations for extmetadata property are available, fetch all of them.", + "apihelp-query+imageinfo-param-extmetadatafilter": "If specified and non-empty, only these keys will be returned for $1prop=extmetadata.", + "apihelp-query+imageinfo-param-urlparam": "A handler specific parameter string. For example, pdfs might use \"page15-100px\". $1urlwidth must be used and be consistent with $1urlparam.", + "apihelp-query+imageinfo-param-localonly": "Look only for files in the local repository.", + "apihelp-query+imageinfo-example-simple": "Fetch information about the current version of [[:File:Albert Einstein Head.jpg]]", + "apihelp-query+imageinfo-example-dated": "Fetch information about versions of [[:File:Test.jpg]] from 2008 and later", + + "apihelp-query+images-description": "Returns all files contained on the given pages.", + "apihelp-query+images-param-limit": "How many files to return.", + "apihelp-query+images-param-images": "Only list these files. Useful for checking whether a certain page has a certain file.", + "apihelp-query+images-param-dir": "The direction in which to list.", + "apihelp-query+images-example-simple": "Get a list of files used in the [[Main Page]]", + "apihelp-query+images-example-generator": "Get information about all files used in the [[Main Page]]", + + "apihelp-query+imageusage-description": "Find all pages that use the given image title.", + "apihelp-query+imageusage-param-title": "Title to search. Cannot be used together with $1pageid.", + "apihelp-query+imageusage-param-pageid": "Pageid to search. Cannot be used together with $1title.", + "apihelp-query+imageusage-param-namespace": "The namespace to enumerate.", + "apihelp-query+imageusage-param-dir": "The direction in which to list.", + "apihelp-query+imageusage-param-filterredir": "How to filter for redirects. If set to nonredirects when $1redirect is enabled, this is only applied to the second level.", + "apihelp-query+imageusage-param-limit": "How many total pages to return. If $1redirect is enabled, limit applies to each level separately (which means you may get up to 2 * limit results).", + "apihelp-query+imageusage-param-redirect": "If linking page is a redirect, find all pages that link to that redirect as well. Maximum limit is halved.", + "apihelp-query+imageusage-example-simple": "Show pages using [[:File:Albert Einstein Head.jpg]]", + "apihelp-query+imageusage-example-generator": "Get information about pages using [[:File:Albert Einstein Head.jpg]]", + + "apihelp-query+info-description": "Get basic page information.", + "apihelp-query+info-param-prop": "Which additional properties to get:\n;protection:List the protection level of each page.\n;talkid:The page ID of the talk page for each non-talk page.\n;watched:List the watched status of each page.\n;watchers:The number of watchers, if allowed.\n;notificationtimestamp:The watchlist notification timestamp of each page.\n;subjectid:The page ID of the parent page for each talk page.\n;url:Gives a full URL, an edit URL, and the canonical URL for each page.\n;readable:Whether the user can read this page.\n;preload:Gives the text returned by EditFormPreloadText.\n;displaytitle:Gives the way the page title is actually displayed.", + "apihelp-query+info-param-token": "Use [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] instead.", + "apihelp-query+info-example-simple": "Get information about the [[Main Page]]", + "apihelp-query+info-example-protection": "Get general and protection information about the [[Main Page]]", + + "apihelp-query+iwbacklinks-description": "Find all pages that link to the given interwiki link.\n\nCan be used to find all links with a prefix, or all links to a title (with a given prefix). Using neither parameter is effectively \"all interwiki links\".", + "apihelp-query+iwbacklinks-param-prefix": "Prefix for the interwiki.", + "apihelp-query+iwbacklinks-param-title": "Interwiki link to search for. Must be used with $1blprefix.", + "apihelp-query+iwbacklinks-param-limit": "How many total pages to return.", + "apihelp-query+iwbacklinks-param-prop": "Which properties to get:\n;iwprefix:Adds the prefix of the interwiki.\n;iwtitle:Adds the title of the interwiki.", + "apihelp-query+iwbacklinks-param-dir": "The direction in which to list.", + "apihelp-query+iwbacklinks-example-simple": "Get pages linking to [[wikibooks:Test]]", + "apihelp-query+iwbacklinks-example-generator": "Get information about pages linking to [[wikibooks:Test]]", + + "apihelp-query+iwlinks-description": "Returns all interwiki links from the given pages.", + "apihelp-query+iwlinks-param-url": "Whether to get the full URL (cannot be used with $1prop).", + "apihelp-query+iwlinks-param-prop": "Which additional properties to get for each interlanguage link:\n;url:Adds the full URL.", + "apihelp-query+iwlinks-param-limit": "How many interwiki links to return.", + "apihelp-query+iwlinks-param-prefix": "Only return interwiki links with this prefix.", + "apihelp-query+iwlinks-param-title": "Interwiki link to search for. Must be used with $1prefix.", + "apihelp-query+iwlinks-param-dir": "The direction in which to list.", + "apihelp-query+iwlinks-example-simple": "Get interwiki links from the [[Main Page]]", + + "apihelp-query+langbacklinks-description": "Find all pages that link to the given language link.\n\nCan be used to find all links with a language code, or all links to a title (with a given language). Using neither parameter is effectively \"all language links\".\n\nNote that this may not consider language links added by extensions.", + "apihelp-query+langbacklinks-param-lang": "Language for the language link.", + "apihelp-query+langbacklinks-param-title": "Language link to search for. Must be used with $1lang.", + "apihelp-query+langbacklinks-param-limit": "How many total pages to return.", + "apihelp-query+langbacklinks-param-prop": "Which properties to get:\n;lllang:Adds the language code of the language link.\n;lltitle:Adds the title of the language link.", + "apihelp-query+langbacklinks-param-dir": "The direction in which to list.", + "apihelp-query+langbacklinks-example-simple": "Get pages linking to [[:fr:Test]]", + "apihelp-query+langbacklinks-example-generator": "Get information about pages linking to [[:fr:Test]]", + + "apihelp-query+langlinks-description": "Returns all interlanguage links from the given pages.", + "apihelp-query+langlinks-param-limit": "How many langlinks to return.", + "apihelp-query+langlinks-param-url": "Whether to get the full URL (cannot be used with $1prop).", + "apihelp-query+langlinks-param-prop": "Which additional properties to get for each interlanguage link:\n;url:Adds the full URL.\n;langname:Adds the localised language name (best effort). Use $1inlanguagecode to control the language.\n;autonym:Adds the native language name.", + "apihelp-query+langlinks-param-lang": "Only return language links with this language code.", + "apihelp-query+langlinks-param-title": "Link to search for. Must be used with $1lang.", + "apihelp-query+langlinks-param-dir": "The direction in which to list.", + "apihelp-query+langlinks-param-inlanguagecode": "Language code for localised language names.", + "apihelp-query+langlinks-example-simple": "Get interlanguage links from the [[Main Page]]", + + "apihelp-query+links-description": "Returns all links from the given pages.", + "apihelp-query+links-param-namespace": "Show links in these namespaces only.", + "apihelp-query+links-param-limit": "How many links to return.", + "apihelp-query+links-param-titles": "Only list links to these titles. Useful for checking whether a certain page links to a certain title.", + "apihelp-query+links-param-dir": "The direction in which to list.", + "apihelp-query+links-example-simple": "Get links from the [[Main Page]]", + "apihelp-query+links-example-generator": "Get information about the link pages in the [[Main Page]]", + "apihelp-query+links-example-namespaces": "Get links from the [[Main Page]] in the User and Template namespaces", + + "apihelp-query+linkshere-description": "Find all pages that link to the given pages.", + "apihelp-query+linkshere-param-prop": "Which properties to get:\n;pageid:Page id of each page.\n;title:Title of each page.\n;redirect:Flag if the page is a redirect.", + "apihelp-query+linkshere-param-namespace": "Only include pages in these namespaces.", + "apihelp-query+linkshere-param-limit": "How many to return.", + "apihelp-query+linkshere-param-show": "Show only items that meet these criteria:\n;redirect:Only show redirects.\n;!redirects:Only show non-redirects.", + "apihelp-query+linkshere-example-simple": "Get a list of pages linking to the [[Main Page]]", + "apihelp-query+linkshere-example-generator": "Get information about pages linking to the [[Main Page]]", + + "apihelp-query+logevents-description": "Get events from logs.", + "apihelp-query+logevents-param-prop": "Which properties to get:\n;ids:Adds the ID of the log event.\n;title:Adds the title of the page for the log event.\n;type:Adds the type of log event.\n;user:Adds the user responsible for the log event.\n;userid:Adds the user ID who was responsible for the log event.\n;timestamp:Adds the timestamp for the event.\n;comment:Adds the comment of the event.\n;parsedcomment:Adds the parsed comment of the event.\n;details:Lists additional details about the event.\n;tags:Lists tags for the event.", + "apihelp-query+logevents-param-type": "Filter log entries to only this type.", + "apihelp-query+logevents-param-action": "Filter log actions to only this action. Overrides $1type. Wildcard actions like \"action/*\" allows to specify any string for the asterisk.", + "apihelp-query+logevents-param-start": "The timestamp to start enumerating from.", + "apihelp-query+logevents-param-end": "The timestamp to end enumerating.", + "apihelp-query+logevents-param-user": "Filter entries to those made by the given user.", + "apihelp-query+logevents-param-title": "Filter entries to those related to a page.", + "apihelp-query+logevents-param-namespace": "Filter entries to those in the given namespace.", + "apihelp-query+logevents-param-prefix": "Filter entries that start with this prefix.", + "apihelp-query+logevents-param-tag": "Only list event entries tagged with this tag.", + "apihelp-query+logevents-param-limit": "How many total event entries to return.", + "apihelp-query+logevents-example-simple": "List recent log events", + + "apihelp-query+pagepropnames-description": "List all page prop names in use on the wiki.", + "apihelp-query+pagepropnames-param-limit": "The maximum number of names to return.", + "apihelp-query+pagepropnames-example-simple": "Get first 10 prop names", + + "apihelp-query+pageprops-description": "Get various properties defined in the page content.", + "apihelp-query+pageprops-param-prop": "Only list these props. Useful for checking whether a certain page uses a certain page prop.", + "apihelp-query+pageprops-example-simple": "Get properties for [[:Category:Foo]]", + + "apihelp-query+pageswithprop-description": "List all pages using a given page prop.", + "apihelp-query+pageswithprop-param-propname": "Page prop for which to enumerate pages.", + "apihelp-query+pageswithprop-param-prop": "Which pieces of information to include:\n;ids:Adds the page ID.\n;title:Adds the title and namespace ID of the page.\n;value:Adds the value of the page prop.", + "apihelp-query+pageswithprop-param-limit": "The maximum number of pages to return.", + "apihelp-query+pageswithprop-param-dir": "In which direction to sort.", + "apihelp-query+pageswithprop-example-simple": "List the first 10 pages using {{DISPLAYTITLE:}}", + "apihelp-query+pageswithprop-example-generator": "Get page info about first 10 pages using __NOTOC__", + + "apihelp-query+prefixsearch-description": "Perform a prefix search for page titles.", + "apihelp-query+prefixsearch-param-search": "Search string.", + "apihelp-query+prefixsearch-param-namespace": "Namespaces to search.", + "apihelp-query+prefixsearch-param-limit": "Maximum number of results to return.", + "apihelp-query+prefixsearch-example-simple": "Search for page titles beginning with \"meaning\"", + + "apihelp-query+protectedtitles-description": "List all titles protected from creation.", + "apihelp-query+protectedtitles-param-namespace": "Only list titles in these namespaces.", + "apihelp-query+protectedtitles-param-level": "Only list titles with these protection levels.", + "apihelp-query+protectedtitles-param-limit": "How many total pages to return.", + "apihelp-query+protectedtitles-param-start": "Start listing at this protection timestamp.", + "apihelp-query+protectedtitles-param-end": "Stop listing at this protection timestamp.", + "apihelp-query+protectedtitles-param-prop": "Which properties to get:\n;timestamp:Adds the timestamp of when protection was added.\n;user:Adds the user that added the protection.\n;userid:Adds the user id that added the protection.\n;comment:Adds the comment for the protection.\n;parsedcomment:Adds the parsed comment for the protection.\n;expiry:Adds the timestamp of when the protection will be lifted.\n;level:Adds the protection level.", + "apihelp-query+protectedtitles-example-simple": "List protected titles", + "apihelp-query+protectedtitles-example-generator": "Find links to protected titles in the main namespace", + + "apihelp-query+querypage-description": "Get a list provided by a QueryPage-based special page.", + "apihelp-query+querypage-param-page": "The name of the special page. Note, this is case sensitive.", + "apihelp-query+querypage-param-limit": "Number of results to return.", + "apihelp-query+querypage-example-ancientpages": "Return results from [[Special:Ancientpages]].", + + "apihelp-query+random-description": "Get a set of random pages.\n\nPages are listed in a fixed sequence, only the starting point is random. This means that if, for example, \"Main Page\" is the first random page on your list, \"List of fictional monkeys\" will *always* be second, \"List of people on stamps of Vanuatu\" third, etc.\n\nIf the number of pages in the namespace is lower than $1limit, you will get fewer pages. You will not get the same page twice.", + "apihelp-query+random-param-namespace": "Return pages in these namespaces only.", + "apihelp-query+random-param-limit": "Limit how many random pages will be returned.", + "apihelp-query+random-param-redirect": "Load a random redirect instead of a random page.", + "apihelp-query+random-example-simple": "Return two random pages from the main namespace", + "apihelp-query+random-example-generator": "Return page info about two random pages from the main namespace", + + "apihelp-query+recentchanges-description": "Enumerate recent changes.", + "apihelp-query+recentchanges-param-start": "The timestamp to start enumerating from.", + "apihelp-query+recentchanges-param-end": "The timestamp to end enumerating.", + "apihelp-query+recentchanges-param-namespace": "Filter changes to only these namespaces.", + "apihelp-query+recentchanges-param-user": "Only list changes by this user.", + "apihelp-query+recentchanges-param-excludeuser": "Don't list changes by this user.", + "apihelp-query+recentchanges-param-tag": "Only list changes tagged with this tag.", + "apihelp-query+recentchanges-param-prop": "Include additional pieces of information:\n;user:Adds the user responsible for the edit and tags if they are an IP.\n;userid:Adds the user id responsible for the edit.\n;comment:Adds the comment for the edit.\n;parsedcomment:Adds the parsed comment for the edit.\n;flags:Adds flags for the edit.\n;timestamp:Adds timestamp of the edit.\n;title:Adds the page title of the edit.\n;ids:Adds the page ID, recent changes ID and the new and old revision ID.\n;sizes:Adds the new and old page length in bytes.\n;redirect:Tags edit if page is a redirect.\n;patrolled:Tags patrollable edits as being patrolled or unpatrolled.\n;loginfo:Adds log information (logid, logtype, etc) to log entries.\n;tags:Lists tags for the entry.\n;sha1:Adds the content checksum for entries associated with a revision.", + "apihelp-query+recentchanges-param-token": "Use [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] instead.", + "apihelp-query+recentchanges-param-show": "Show only items that meet these criteria. For example, to see only minor edits done by logged-in users, set $1show=minor|!anon.", + "apihelp-query+recentchanges-param-limit": "How many total changes to return.", + "apihelp-query+recentchanges-param-type": "Which types of changes to show.", + "apihelp-query+recentchanges-param-toponly": "Only list changes which are the latest revision.", + "apihelp-query+recentchanges-example-simple": "List recent changes", + "apihelp-query+recentchanges-example-generator": "Get page info about recent unpatrolled changes", + + "apihelp-query+redirects-description": "Returns all redirects to the given pages.", + "apihelp-query+redirects-param-prop": "Which properties to get:\n;pageid:Page id of each redirect.\n;title:Title of each redirect.\n;fragment:Fragment of each redirect, if any.", + "apihelp-query+redirects-param-namespace": "Only include pages in these namespaces.", + "apihelp-query+redirects-param-limit": "How many redirects to return.", + "apihelp-query+redirects-param-show": "Show only items that meet these criteria:\n;fragment:Only show redirects with a fragment.\n;!fragment:Only show redirects without a fragment.", + "apihelp-query+redirects-example-simple": "Get a list of redirects to the [[Main Page]]", + "apihelp-query+redirects-example-generator": "Get information about all redirects to the [[Main Page]]", + + "apihelp-query+revisions-description": "Get revision information.\n\nMay be used in several ways:\n# Get data about a set of pages (last revision), by setting titles or pageids.\n# Get revisions for one given page, by using titles or pageids with start, end, or limit.\n# Get data about a set of revisions by setting their IDs with revids.", + "apihelp-query+revisions-paraminfo-singlepageonly": "May only be used with a single page (mode #2).", + "apihelp-query+revisions-param-prop": "Which properties to get for each revision:\n;ids:The ID of the revision.\n;flags:Revision flags (minor).\n;timestamp:The timestamp of the revision.\n;user:User that made the revision.\n;userid:User id of revision creator.\n;size:Length (bytes) of the revision.\n;sha1:SHA-1 (base 16) of the revision.\n;contentmodel:Content model id.\n;comment:Comment by the user for revision.\n;parsedcomment:Parsed comment by the user for the revision.\n;content:Text of the revision.\n;tags:Tags for the revision.", + "apihelp-query+revisions-param-limit": "Limit how many revisions will be returned.", + "apihelp-query+revisions-param-startid": "From which revision id to start enumeration.", + "apihelp-query+revisions-param-endid": "Stop revision enumeration on this revid.", + "apihelp-query+revisions-param-start": "From which revision timestamp to start enumeration.", + "apihelp-query+revisions-param-end": "Enumerate up to this timestamp.", + "apihelp-query+revisions-param-user": "Only include revisions made by user.", + "apihelp-query+revisions-param-excludeuser": "Exclude revisions made by user.", + "apihelp-query+revisions-param-tag": "Only list revisions tagged with this tag.", + "apihelp-query+revisions-param-expandtemplates": "Expand templates in revision content (requires $1prop=content).", + "apihelp-query+revisions-param-generatexml": "Generate XML parse tree for revision content (requires $1prop=content).", + "apihelp-query+revisions-param-parse": "Parse revision content (requires $1prop=content). For performance reasons, if this option is used, $1limit is enforced to 1.", + "apihelp-query+revisions-param-section": "Only retrieve the content of this section number.", + "apihelp-query+revisions-param-token": "Which tokens to obtain for each revision.", + "apihelp-query+revisions-param-diffto": "Revision ID to diff each revision to. Use \"prev\", \"next\" and \"cur\" for the previous, next and current revision respectively.", + "apihelp-query+revisions-param-difftotext": "Text to diff each revision to. Only diffs a limited number of revisions. Overrides $1diffto. If $1section is set, only that section will be diffed against this text.", + "apihelp-query+revisions-param-contentformat": "Serialization format used for $1difftotext and expected for output of content.", + "apihelp-query+revisions-example-content": "Get data with content for the last revision of titles \"API\" and \"Main Page\"", + "apihelp-query+revisions-example-last5": "Get last 5 revisions of the \"Main Page\"", + "apihelp-query+revisions-example-first5": "Get first 5 revisions of the \"Main Page\"", + "apihelp-query+revisions-example-first5-after": "Get first 5 revisions of the \"Main Page\" made after 2006-05-01", + "apihelp-query+revisions-example-first5-not-localhost": "Get first 5 revisions of the \"Main Page\" that were not made made by anonymous user \"127.0.0.1\"", + "apihelp-query+revisions-example-first5-user": "Get first 5 revisions of the \"Main Page\" that were made by the user \"MediaWiki default\"", + + "apihelp-query+search-description": "Perform a full text search.", + "apihelp-query+search-param-search": "Search for all page titles (or content) that have this value.", + "apihelp-query+search-param-namespace": "Search only within these namespaces.", + "apihelp-query+search-param-what": "Which type of search to perform.", + "apihelp-query+search-param-info": "Which metadata to return.", + "apihelp-query+search-param-prop": "Which properties to return:\n;size:Adds the size of the page in bytes.\n;wordcount:Adds the word count of the page.\n;timestamp:Adds the timestamp of when the page was last edited.\n;snippet:Adds a parsed snippet of the page.\n;titlesnippet:Adds a parsed snippet of the page title.\n;redirectsnippet:Adds a parsed snippet of the redirect title.\n;redirecttitle:Adds the title of the matching redirect.\n;sectionsnippet:Adds a parsed snippet of the matching section title.\n;sectiontitle:Adds the title of the matching section.\n;score:Deprecated and ignored.\n;hasrelated:Deprecated and ignored.", + "apihelp-query+search-param-limit": "How many total pages to return.", + "apihelp-query+search-param-interwiki": "Include interwiki results in the search, if available.", + "apihelp-query+search-param-backend": "Which search backend to use, if not the default.", + "apihelp-query+search-example-simple": "Search for \"meaning\"", + "apihelp-query+search-example-text": "Search texts for \"meaning\"", + "apihelp-query+search-example-generator": "Ger page info about the pages returned for a search for \"meaning\"", + + "apihelp-query+siteinfo-description": "Return general information about the site.", + "apihelp-query+siteinfo-param-prop": "Which information to get:\n;general:Overall system information.\n;namespaces:List of registered namespaces and their canonical names.\n;namespacealiases:List of registered namespace aliases.\n;specialpagealiases:List of special page aliases.\n;magicwords:List of magic words and their aliases.\n;statistics:Returns site statistics.\n;interwikimap:Returns interwiki map (optionally filtered, (optionally localised by using $1inlanguagecode)).\n;dbrepllag:Returns database server with the highest replication lag.\n;usergroups:Returns user groups and the associated permissions.\n;extensions:Returns extensions installed on the wiki.\n;fileextensions:Returns list of file extensions allowed to be uploaded.\n;rightsinfo:Returns wiki rights (license) information if available.\n;restrictions:Returns information on available restriction (protection) types.\n;languages:Returns a list of languages MediaWiki supports (optionally localised by using $1inlanguagecode).\n;skins:Returns a list of all enabled skins (optionally localised by using $1inlanguagecode, otherwise in content language).\n;extensiontags:Returns a list of parser extension tags.\n;functionhooks:Returns a list of parser function hooks.\n;showhooks:Returns a list of all subscribed hooks (contents of $wgHooks).\n;variables:Returns a list of variable IDs.\n;protocols:Returns a list of protocols that are allowed in external links.\n;defaultoptions:Returns the default values for user preferences.", + "apihelp-query+siteinfo-param-filteriw": "Return only local or only nonlocal entries of the interwiki map.", + "apihelp-query+siteinfo-param-showalldb": "List all database servers, not just the one lagging the most.", + "apihelp-query+siteinfo-param-numberingroup": "Lists the number of users in user groups.", + "apihelp-query+siteinfo-param-inlanguagecode": "Language code for localised language names (best effort) and skin names.", + "apihelp-query+siteinfo-example-simple": "Fetch site information", + "apihelp-query+siteinfo-example-interwiki": "Fetch a list of local interwiki prefixes", + "apihelp-query+siteinfo-example-replag": "Check the current replication lag", + + "apihelp-query+stashimageinfo-description": "Returns file information for stashed files.", + "apihelp-query+stashimageinfo-param-filekey": "Key that identifies a previous upload that was stashed temporarily.", + "apihelp-query+stashimageinfo-param-sessionkey": "Alias for $1filekey, for backward compatibility.", + "apihelp-query+stashimageinfo-param-prop": "Which image information to get:\n;timestamp:Adds timestamp for the uploaded version.\n;canonicaltitle:Adds the canonical title of the image file.\n;url:Gives URL to the image and the description page.\n;size:Adds the size of the image in bytes and the height, width and page count (if applicable).\n;dimensions:Alias for size.\n;sha1:Adds SHA-1 hash for the image.\n;mime:Adds MIME type of the image.\n;thumbmime:Adds MIME type of the image thumbnail (requires url and param $1urlwidth).\n;metadata:Lists Exif metadata for the version of the image.\n;commonmetadata:Lists file format generic metadata for the version of the image.\n;extmetadata:Lists formatted metadata combined from multiple sources. Results are HTML formatted.\n;bitdepth:Adds the bit depth of the version.", + "apihelp-query+stashimageinfo-example-simple": "Returns information for a stashed file", + "apihelp-query+stashimageinfo-example-params": "Returns thumbnails for two stashed files", + + "apihelp-query+tags-description": "List change tags.", + "apihelp-query+tags-param-limit": "The maximum number of tags to list.", + "apihelp-query+tags-param-prop": "Which properties to get:\n;name:Adds name of tag.\n;displayname:Adds system message for the tag.\n;description:Adds description of the tag.\n;hitcount:Adds the amount of revisions that have this tag.", + "apihelp-query+tags-example-simple": "List available tags", + + "apihelp-query+templates-description": "Returns all pages transcluded on the given pages.", + "apihelp-query+templates-param-namespace": "Show templates in this namespaces only.", + "apihelp-query+templates-param-limit": "How many templates to return.", + "apihelp-query+templates-param-templates": "Only list these templates. Useful for checking whether a certain page uses a certain template.", + "apihelp-query+templates-param-dir": "The direction in which to list.", + "apihelp-query+templates-example-simple": "Get templates from the [[Main Page]]", + "apihelp-query+templates-example-generator": "Get information about the template pages in the [[Main Page]]", + "apihelp-query+templates-example-namespaces": "Get templates from the [[Main Page]] in the User and Template namespaces", + + "apihelp-query+tokens-description": "Gets tokens for data-modifying actions.", + "apihelp-query+tokens-param-type": "Types of token to request.", + "apihelp-query+tokens-example-simple": "Retrieve a csrf token (the default)", + "apihelp-query+tokens-example-types": "Retrieve a watch token and a patrol token", + + "apihelp-query+transcludedin-description": "Find all pages that transclude the given pages.", + "apihelp-query+transcludedin-param-prop": "Which properties to get:\n;pageid:Page id of each page.\n;title:Title of each page.\n;redirect:Flag if the page is a redirect.", + "apihelp-query+transcludedin-param-namespace": "Only include pages in these namespaces.", + "apihelp-query+transcludedin-param-limit": "How many to return.", + "apihelp-query+transcludedin-param-show": "Show only items that meet these criteria:\n;redirect:Only show redirects.\n;!redirects:Only show non-redirects.", + "apihelp-query+transcludedin-example-simple": "Get a list of pages transcluding the [[Main Page]]", + "apihelp-query+transcludedin-example-generator": "Get information about pages transcluding the [[Main Page]]", + + "apihelp-query+usercontribs-description": "Get all edits by a user.", + "apihelp-query+usercontribs-param-limit": "The maximum number of contributions to return.", + "apihelp-query+usercontribs-param-start": "The start timestamp to return from.", + "apihelp-query+usercontribs-param-end": "The end timestamp to return to.", + "apihelp-query+usercontribs-param-user": "The users to retrieve contributions for.", + "apihelp-query+usercontribs-param-userprefix": "Retrieve contributions for all users whose names begin with this value. Overrides $1user.", + "apihelp-query+usercontribs-param-namespace": "Only list contributions in these namespaces.", + "apihelp-query+usercontribs-param-prop": "Include additional pieces of information:\n;ids:Adds the page ID and revision ID.\n;title:Adds the title and namespace ID of the page.\n;timestamp:Adds the timestamp of the edit.\n;comment:Adds the comment of the edit.\n;parsedcomment:Adds the parsed comment of the edit.\n;size:Adds the new size of the edit.\n;sizediff:Adds the size delta of the edit against its parent.\n;flags:Adds flags of the edit.\n;patrolled:Tags patrolled edits.\n;tags:Lists tags for the edit.", + "apihelp-query+usercontribs-param-show": "Show only items that meet thse criteria, e.g. non minor edits only: $2show=!minor.\n\nIf $2show=patrolled or $2show=!patrolled is set, revisions older than [https://www.mediawiki.org/wiki/Manual:$wgRCMaxAge $wgRCMaxAge] ($1 {{PLURAL:$1|second|seconds}}) won't be shown.", + "apihelp-query+usercontribs-param-tag": "Only list revisions tagged with this tag.", + "apihelp-query+usercontribs-param-toponly": "Only list changes which are the latest revision.", + "apihelp-query+usercontribs-example-user": "Show contributions of [[User:Example]]", + "apihelp-query+usercontribs-example-ipprefix": "Show contributions from all IPs with prefix \"192.0.2.\"", + + "apihelp-query+userinfo-description": "Get information about the current user.", + "apihelp-query+userinfo-param-prop": "Which pieces of information to include:\n;blockinfo:Tags if the current user is blocked, by whom, and for what reason.\n;hasmsg:Adds a tag \"message\" if the current user has pending messages.\n;groups:Lists all the groups the current user belongs to.\n;implicitgroups:Lists all the groups the current user is automatically a member of.\n;rights:Lists all the rights the current user has.\n;changeablegroups:Lists the groups the current user can add to and remove from.\n;options:Lists all preferences the current user has set.\n;preferencestoken:DEPRECATED! Get a token to change current user's preferences.\n;editcount:Adds the current user's edit count.\n;ratelimits:Lists all rate limits applying to the current user.\n;realname:Adds the user's real name.\n;email:Adds the user's email address and email authentication date.\n;acceptlang:Echoes the Accept-Language header sent by the client in a structured format.\n;registrationdate:Adds the user's registration date.\n;unreadcount:Adds the count of unread pages on the user's watchlist (maximum $1; returns \"$2\" if more).", + "apihelp-query+userinfo-example-simple": "Get information about the current user", + "apihelp-query+userinfo-example-data": "Get additional information about the current user", + + "apihelp-query+users-description": "Get information about a list of users.", + "apihelp-query+users-param-prop": "Which pieces of information to include:\n;blockinfo:Tags if the user is blocked, by whom, and for what reason.\n;groups:Lists all the groups each user belongs to.\n;implicitgroups:Lists all the groups a user is automatically a member of.\n;rights:Lists all the rights each user has.\n;editcount:Adds the user's edit count.\n;registration:Adds the user's registration timestamp.\n;emailable:Tags if the user can and wants to receive email through [[Special:Emailuser]].\n;gender:Tags the gender of the user. Returns \"male\", \"female\", or \"unknown\".", + "apihelp-query+users-param-users": "A list of users to obtain information for.", + "apihelp-query+users-param-token": "Use [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] instead.", + "apihelp-query+users-example-simple": "Return information for [[User:Example]]", + + "apihelp-query+watchlist-description": "Get recent changes to pages in the logged in user's watchlist.", + "apihelp-query+watchlist-param-allrev": "Include multiple revisions of the same page within given timeframe.", + "apihelp-query+watchlist-param-start": "The timestamp to start enumerating from.", + "apihelp-query+watchlist-param-end": "The timestamp to end enumerating.", + "apihelp-query+watchlist-param-namespace": "Filter changes to only the given namespaces.", + "apihelp-query+watchlist-param-user": "Only list changes by this user.", + "apihelp-query+watchlist-param-excludeuser": "Don't list changes by this user.", + "apihelp-query+watchlist-param-limit": "How many total results to return per request.", + "apihelp-query+watchlist-param-prop": "Which additional items to get:\n;ids:Adds revision ids and page ids.\n;title:Adds title of the page.\n;flags:Adds flags for the edit.\n;user:Adds the user who made the edit.\n;userid:Adds user id of whom made the edit.\n;comment:Adds comment of the edit.\n;parsedcomment:Adds parsed comment of the edit.\n;timestamp:Adds timestamp of the edit.\n;patrol:Tags edits that are patrolled.\n;sizes:Adds the old and new lengths of the page.\n;notificationtimestamp:Adds timestamp of when the user was last notified about the edit.\n;loginfo:Adds log information where appropriate.", + "apihelp-query+watchlist-param-show": "Show only items that meet these criteria. For example, to see only minor edits done by logged-in users, set $1show=minor|!anon.", + "apihelp-query+watchlist-param-type": "Which types of changes to show:\n;edit:Regular page edits.\n;external:External changes.\n;new:Page creations.\n;log:Log entries.", + "apihelp-query+watchlist-param-owner": "Used along with $1token to access a different user's watchlist.", + "apihelp-query+watchlist-param-token": "A security token (available in the user's [[Special:Preferences#mw-prefsection-watchlist|preferences]]) to allow access to another user's watchlist.", + "apihelp-query+watchlist-example-simple": "List the top revision for recently changed pages on the current user's watchlist", + "apihelp-query+watchlist-example-props": "Fetch additional information about the top revision for recently changed pages on the current user's watchlist", + "apihelp-query+watchlist-example-allrev": "Fetch information about all recent changes to pages on the current user's watchlist", + "apihelp-query+watchlist-example-generator": "Fetch page info for recently changed pages on the current user's watchlist", + "apihelp-query+watchlist-example-generator-rev": "Fetch revision info for recent changes to pages on the current user's watchlist", + "apihelp-query+watchlist-example-wlowner": "List the top revision for recently changed pages on [[User:Example]]'s watchlist", + + "apihelp-query+watchlistraw-description": "Get all pages on the logged in user's watchlist.", + "apihelp-query+watchlistraw-param-namespace": "Only list pages in the given namespaces.", + "apihelp-query+watchlistraw-param-limit": "How many total results to return per request.", + "apihelp-query+watchlistraw-param-prop": "Which additional properties to get:\n;changed:Adds timestamp of when the user was last notified about the edit.", + "apihelp-query+watchlistraw-param-show": "Only list items that meet these criteria.", + "apihelp-query+watchlistraw-param-owner": "Used along with $1token to access a different user's watchlist.", + "apihelp-query+watchlistraw-param-token": "A security token (available in the user's [[Special:Preferences#mw-prefsection-watchlist|preferences]]) to allow access to another user's watchlist.", + "apihelp-query+watchlistraw-example-simple": "List pages on the current user's watchlist", + "apihelp-query+watchlistraw-example-generator": "Fetch page info for pages on the current user's watchlist", + + "apihelp-revisiondelete-description": "Delete and undelete revisions.", + "apihelp-revisiondelete-param-type": "Type of revision deletion being performed.", + "apihelp-revisiondelete-param-target": "Page title for the revision deletion, if required for the type.", + "apihelp-revisiondelete-param-ids": "Identifiers for the revisions to be deleted.", + "apihelp-revisiondelete-param-hide": "What to hide for each revision.", + "apihelp-revisiondelete-param-show": "What to unhide for each revision.", + "apihelp-revisiondelete-param-suppress": "Whether to suppress data from administrators as well as others.", + "apihelp-revisiondelete-param-reason": "Reason for the deletion or undeletion.", + "apihelp-revisiondelete-example-revision": "Hide content for revision 12345 on the Main Page", + "apihelp-revisiondelete-example-log": "Hide all data on log entry 67890 with the reason \"BLP violation\"", + + "apihelp-rollback-description": "Undo the last edit to the page.\n\nIf the last user who edited the page made multiple edits in a row, they will all be rolled back.", + "apihelp-rollback-param-title": "Title of the page you want to roll back. Cannot be used together with $1pageid.", + "apihelp-rollback-param-pageid": "Page ID of the page you want to roll back. Cannot be used together with $1title.", + "apihelp-rollback-param-user": "Name of the user whose edits are to be rolled back.", + "apihelp-rollback-param-summary": "Custom edit summary. If empty, default summary will be used.", + "apihelp-rollback-param-markbot": "Mark the reverted edits and the revert as bot edits.", + "apihelp-rollback-param-watchlist": "Unconditionally add or remove the page from your watchlist, use preferences or do not change watch.", + "apihelp-rollback-example-simple": "Roll back the last edits to [[Main Page]] by user Example", + "apihelp-rollback-example-summary": "Roll back the last edits to [[Main Page]] by IP user 192.0.2.5 with summary \"Reverting vandalism\", and mark those edits and the revert as \"bot\"", + + "apihelp-rsd-description": "Export an RSD (Really Simple Discovery) schema.", + "apihelp-rsd-example-simple": "Export the RSD schema", + + "apihelp-setnotificationtimestamp-description": "Update the notification timestamp for watched pages.\n\nThis affects the highlighting of changed pages in the watchlist and history, and the sending of email when the \"Email me when a page on my watchlist is changed\" preference is enabled.", + "apihelp-setnotificationtimestamp-param-entirewatchlist": "Work on all watched pages.", + "apihelp-setnotificationtimestamp-param-timestamp": "Timestamp to which to set the notification timestamp.", + "apihelp-setnotificationtimestamp-param-torevid": "Revision to set the notification timestamp to (one page only).", + "apihelp-setnotificationtimestamp-param-newerthanrevid": "Revision to set the notification timestamp newer than (one page only).", + "apihelp-setnotificationtimestamp-example-all": "Reset the notification status for the entire watchlist", + "apihelp-setnotificationtimestamp-example-page": "Reset the notification status for \"Main page\"", + "apihelp-setnotificationtimestamp-example-pagetimestamp": "Set the notification timestamp for \"Main page\" so all edits since 1 January 2012 are unviewed", + "apihelp-setnotificationtimestamp-example-allpages": "Reset the notification status for pages in the User namespace", + + "apihelp-tokens-description": "Get tokens for data-modifying actions.\n\nThis module is deprecated in favor of [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-tokens-param-type": "Types of token to request.", + "apihelp-tokens-example-edit": "Retrieve an edit token (the default).", + "apihelp-tokens-example-emailmove": "Retrieve an email token and a move token.", + + "apihelp-unblock-description": "Unblock a user.", + "apihelp-unblock-param-id": "ID of the block to unblock (obtained through list=blocks). Cannot be used together with $1user.", + "apihelp-unblock-param-user": "Username, IP address or IP range to unblock. Cannot be used together with $1id.", + "apihelp-unblock-param-reason": "Reason for unblock.", + "apihelp-unblock-example-id": "Unblock block ID #105", + "apihelp-unblock-example-user": "Unblock user Bob with reason \"Sorry Bob\"", + + "apihelp-undelete-description": "Restore revisions of a deleted page.\n\nA list of deleted revisions (including timestamps) can be retrieved through [[Special:ApiHelp/query+deletedrevs|list=deletedrevs]], and a list of deleted file ids can be retrieved through [[Special:ApiHelp/query+filearchive|list=filearchive]].", + "apihelp-undelete-param-title": "Title of the page to restore.", + "apihelp-undelete-param-reason": "Reason for restoring.", + "apihelp-undelete-param-timestamps": "Timestamps of the revisions to restore. If both $1timestamps and $1fileids are empty, all will be restored.", + "apihelp-undelete-param-fileids": "IDs of the file revisions to restore. If both $1timestamps and $1fileids are empty, all will be restored.", + "apihelp-undelete-param-watchlist": "Unconditionally add or remove the page from your watchlist, use preferences or do not change watch.", + "apihelp-undelete-example-page": "Undelete [[Main Page]]", + "apihelp-undelete-example-revisions": "Undelete two revisions of [[Main Page]]", + + "apihelp-upload-description": "Upload a file, or get the status of pending uploads.\n\nSeveral methods are available:\n* Upload file contents directly, using the \"$1file\" parameter.\n* Upload the file in pieces, using the \"$1filesize\", \"$1chunk\" and \"$1offset\" parameters.* Have the MediaWiki server fetch a file from a URL, using the \"$1url\" parameter.\n* Complete an earlier upload that failed due to warnings, using the \"$1filekey\" parameter.\nNote that the HTTP POST must be done as a file upload (i.e. using multipart/form-data) when sending the \"$1file\".", + "apihelp-upload-param-filename": "Target filename.", + "apihelp-upload-param-comment": "Upload comment. Also used as the initial page text for new files if \"$1text\" is not specified.", + "apihelp-upload-param-text": "Initial page text for new files.", + "apihelp-upload-param-watch": "Watch the page.", + "apihelp-upload-param-watchlist": "Unconditionally add or remove the page from your watchlist, use preferences or do not change watch.", + "apihelp-upload-param-ignorewarnings": "Ignore any warnings.", + "apihelp-upload-param-file": "File contents.", + "apihelp-upload-param-url": "URL to fetch the file from.", + "apihelp-upload-param-filekey": "Key that identifies a previous upload that was stashed temporarily.", + "apihelp-upload-param-sessionkey": "Same as $1filekey, maintained for backward compatibility.", + "apihelp-upload-param-stash": "If set, the server will not add the file to the repository and stash it temporarily.", + "apihelp-upload-param-filesize": "Filesize of entire upload.", + "apihelp-upload-param-offset": "Offset of chunk in bytes.", + "apihelp-upload-param-chunk": "Chunk contents.", + "apihelp-upload-param-async": "Make potentially large file operations asynchronous when possible.", + "apihelp-upload-param-asyncdownload": "Make fetching a URL asynchronous.", + "apihelp-upload-param-leavemessage": "If asyncdownload is used, leave a message on the user talk page if finished.", + "apihelp-upload-param-statuskey": "Fetch the upload status for this file key (upload by URL).", + "apihelp-upload-param-checkstatus": "Only fetch the upload status for the given file key.", + "apihelp-upload-example-url": "Upload from a URL", + "apihelp-upload-example-filekey": "Complete an upload that failed due to warnings", + + "apihelp-userrights-description": "Change a user's group membership.", + "apihelp-userrights-param-user": "User name.", + "apihelp-userrights-param-userid": "User id.", + "apihelp-userrights-param-add": "Add the user to these groups.", + "apihelp-userrights-param-remove": "Remove the user from these groups.", + "apihelp-userrights-param-reason": "Reason for the change.", + "apihelp-userrights-example-user": "Add user FooBot to group \"bot\", and remove from groups \"sysop\" and \"bureaucrat\"", + "apihelp-userrights-example-userid": "Add the user with id 123 to group \"bot\", and remove from groups \"sysop\" and \"bureaucrat\"", + + "apihelp-watch-description": "Add or remove pages from the current user's watchlist.", + "apihelp-watch-param-title": "The page to (un)watch. Use $1titles instead.", + "apihelp-watch-param-unwatch": "If set the page will be unwatched rather than watched.", + "apihelp-watch-example-watch": "Watch the page \"Main Page\"", + "apihelp-watch-example-unwatch": "Unwatch the page \"Main Page\"", + "apihelp-watch-example-generator": "Watch the first few pages in the main namespace", + "apihelp-format-example-generic": "Format the query result in the $1 format", "apihelp-dbg-description": "Output data in PHP's var_export() format.", "apihelp-dbgfm-description": "Output data in PHP's var_export() format (pretty-print in HTML).", @@ -42,21 +1017,20 @@ "apihelp-yaml-description": "Output data in YAML format.", "apihelp-yamlfm-description": "Output data in YAML format (pretty-print in HTML).", - "apihelp-help-description": "Display help for the specified modules.", - "apihelp-help-param-modules": "Modules to display help for (values of the action= and format= parameters, or \"main\"). Can specify submodules with a \"+\".", - "apihelp-help-param-submodules": "Include help for submodules of the named module.", - "apihelp-help-param-recursivesubmodules": "Include help for submodules recursively.", - "apihelp-help-param-helpformat": "Format of the help output.", - "apihelp-help-param-wrap": "Wrap the output in a standard API response structure.", - "apihelp-help-param-toc": "Include a table of contents in the HTML output.", - "apihelp-help-example-main": "Help for the main module", - "apihelp-help-example-recursive": "All help in one page", - "apihelp-help-example-help": "Help for the help module itself", - "apihelp-help-example-query": "Help for two query submodules", - "api-format-title": "MediaWiki API result", "api-format-prettyprint-header": "You are looking at the HTML representation of the $1 format. HTML is good for debugging, but is unsuitable for application use.\n\nSpecify the format parameter to change the output format. To see the non-HTML representation of the $1 format, set format=$2.\n\nSee the [https://www.mediawiki.org/wiki/API complete documentation], or [[Special:ApiHelp/main|API help]] for more information.", + "api-orm-param-props": "Fields to query.", + "api-orm-param-limit": "Max amount of rows to return.", + + "api-pageset-param-titles": "A list of titles to work on.", + "api-pageset-param-pageids": "A list of page IDs to work on.", + "api-pageset-param-revids": "A list of revision IDs to work on.", + "api-pageset-param-generator": "Get the list of pages to work on by executing the specified query module.\n\n'''NOTE:''' generator parameter names must be prefixed with a \"g\", see examples.", + "api-pageset-param-redirects-generator": "Automatically resolve redirects in $1titles, $1pageids, and $1revids, and in pages returned by $1generator.", + "api-pageset-param-redirects-nogenerator": "Automatically resolve redirects in $1titles, $1pageids, and $1revids.", + "api-pageset-param-converttitles": "Convert titles to other variants if necessary. Only works if the wiki's content language supports variant conversion. Languages that support variant conversion include $1.", + "api-help-title": "MediaWiki API help", "api-help-lead": "This is an auto-generated MediaWiki API documentation page.\n\nDocumentation and examples: https://www.mediawiki.org/wiki/API", "api-help-main-header": "Main module", @@ -87,6 +1061,11 @@ "api-help-param-default": "Default: $1", "api-help-param-default-empty": "Default: (empty)", "api-help-param-token": "A \"$1\" token retrieved from [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]", + "api-help-param-token-webui": "For compatibility, the token used in the web UI is also accepted.", + "api-help-param-disabled-in-miser-mode": "Disabled due to [https://www.mediawiki.org/wiki/Manual:$wgMiserMode miser mode].", + "api-help-param-limited-in-miser-mode": "'''NOTE:''' Due to [https://www.mediawiki.org/wiki/Manual:$wgMiserMode miser mode], using this may result in fewer than \"$1limit\" results returned before continuing; in extreme cases, zero results may be returned.", + "api-help-param-direction": "In which direction to enumerate:\n;newer:List oldest first. Note: $1start has to be before $1end.\n;older:List newest first (default). Note: $1start has to be later than $1end.", + "api-help-param-continue": "When more results are available, use this to continue.", "api-help-param-no-description": "(no description)", "api-help-examples": "{{PLURAL:$1|Example|Examples}}:", "api-help-permissions": "{{PLURAL:$1|Permission|Permissions}}:", diff --git a/includes/api/i18n/qqq.json b/includes/api/i18n/qqq.json index 0b10779202..6fac19cb08 100644 --- a/includes/api/i18n/qqq.json +++ b/includes/api/i18n/qqq.json @@ -16,6 +16,981 @@ "apihelp-main-param-origin": "{{doc-apihelp-param|main|origin}}", "apihelp-main-param-uselang": "{{doc-apihelp-param|main|uselang}}", + "apihelp-block-description": "{{doc-apihelp-description|block}}", + "apihelp-block-param-user": "{{doc-apihelp-param|block|user}}", + "apihelp-block-param-expiry": "{{doc-apihelp-param|block|expiry}}", + "apihelp-block-param-reason": "{{doc-apihelp-param|block|reason}}", + "apihelp-block-param-anononly": "{{doc-apihelp-param|block|anononly}}", + "apihelp-block-param-nocreate": "{{doc-apihelp-param|block|nocreate}}", + "apihelp-block-param-autoblock": "{{doc-apihelp-param|block|autoblock}}", + "apihelp-block-param-noemail": "{{doc-apihelp-param|block|noemail}}", + "apihelp-block-param-hidename": "{{doc-apihelp-param|block|hidename}}", + "apihelp-block-param-allowusertalk": "{{doc-apihelp-param|block|allowusertalk}}", + "apihelp-block-param-reblock": "{{doc-apihelp-param|block|reblock}}", + "apihelp-block-param-watchuser": "{{doc-apihelp-param|block|watchuser}}", + "apihelp-block-example-ip-simple": "{{doc-apihelp-example|block}}", + "apihelp-block-example-user-complex": "{{doc-apihelp-example|block}}", + + "apihelp-clearhasmsg-description": "{{doc-apihelp-description|clearhasmsg}}", + "apihelp-clearhasmsg-example-1": "{{doc-apihelp-example|clearhasmsg}}", + + "apihelp-compare-description": "{{doc-apihelp-description|compare}}", + "apihelp-compare-param-fromtitle": "{{doc-apihelp-param|compare|fromtitle}}", + "apihelp-compare-param-fromid": "{{doc-apihelp-param|compare|fromid}}", + "apihelp-compare-param-fromrev": "{{doc-apihelp-param|compare|fromrev}}", + "apihelp-compare-param-totitle": "{{doc-apihelp-param|compare|totitle}}", + "apihelp-compare-param-toid": "{{doc-apihelp-param|compare|toid}}", + "apihelp-compare-param-torev": "{{doc-apihelp-param|compare|torev}}", + "apihelp-compare-example-1": "{{doc-apihelp-example|compare}}", + + "apihelp-createaccount-description": "{{doc-apihelp-description|createaccount}}", + "apihelp-createaccount-param-name": "{{doc-apihelp-param|createaccount|name}}", + "apihelp-createaccount-param-password": "{{doc-apihelp-param|createaccount|password}}", + "apihelp-createaccount-param-domain": "{{doc-apihelp-param|createaccount|domain}}", + "apihelp-createaccount-param-token": "{{doc-apihelp-param|createaccount|token}}", + "apihelp-createaccount-param-email": "{{doc-apihelp-param|createaccount|email}}", + "apihelp-createaccount-param-realname": "{{doc-apihelp-param|createaccount|realname}}", + "apihelp-createaccount-param-mailpassword": "{{doc-apihelp-param|createaccount|mailpassword}}", + "apihelp-createaccount-param-reason": "{{doc-apihelp-param|createaccount|reason}}", + "apihelp-createaccount-param-language": "{{doc-apihelp-param|createaccount|language}}", + "apihelp-createaccount-example-pass": "{{doc-apihelp-example|createaccount}}", + "apihelp-createaccount-example-mail": "{{doc-apihelp-example|createaccount}}", + + "apihelp-delete-description": "{{doc-apihelp-description|delete}}", + "apihelp-delete-param-title": "{{doc-apihelp-param|delete|title}}", + "apihelp-delete-param-pageid": "{{doc-apihelp-param|delete|pageid}}", + "apihelp-delete-param-reason": "{{doc-apihelp-param|delete|reason}}", + "apihelp-delete-param-watch": "{{doc-apihelp-param|delete|watch}}", + "apihelp-delete-param-watchlist": "{{doc-apihelp-param|delete|watchlist}}", + "apihelp-delete-param-unwatch": "{{doc-apihelp-param|delete|unwatch}}", + "apihelp-delete-param-oldimage": "{{doc-apihelp-param|delete|oldimage}}", + "apihelp-delete-example-simple": "{{doc-apihelp-example|delete}}", + "apihelp-delete-example-reason": "{{doc-apihelp-example|delete}}", + + "apihelp-disabled-description": "{{doc-apihelp-description|disabled}}", + + "apihelp-edit-description": "{{doc-apihelp-description|edit}}", + "apihelp-edit-param-title": "{{doc-apihelp-param|edit|title}}", + "apihelp-edit-param-pageid": "{{doc-apihelp-param|edit|pageid}}", + "apihelp-edit-param-section": "{{doc-apihelp-param|edit|section}}", + "apihelp-edit-param-sectiontitle": "{{doc-apihelp-param|edit|sectiontitle}}", + "apihelp-edit-param-text": "{{doc-apihelp-param|edit|text}}", + "apihelp-edit-param-summary": "{{doc-apihelp-param|edit|summary}}", + "apihelp-edit-param-minor": "{{doc-apihelp-param|edit|minor}}", + "apihelp-edit-param-notminor": "{{doc-apihelp-param|edit|notminor}}", + "apihelp-edit-param-bot": "{{doc-apihelp-param|edit|bot}}", + "apihelp-edit-param-basetimestamp": "{{doc-apihelp-param|edit|basetimestamp}}", + "apihelp-edit-param-starttimestamp": "{{doc-apihelp-param|edit|starttimestamp}}", + "apihelp-edit-param-recreate": "{{doc-apihelp-param|edit|recreate}}", + "apihelp-edit-param-createonly": "{{doc-apihelp-param|edit|createonly}}", + "apihelp-edit-param-nocreate": "{{doc-apihelp-param|edit|nocreate}}", + "apihelp-edit-param-watch": "{{doc-apihelp-param|edit|watch}}", + "apihelp-edit-param-unwatch": "{{doc-apihelp-param|edit|unwatch}}", + "apihelp-edit-param-watchlist": "{{doc-apihelp-param|edit|watchlist}}", + "apihelp-edit-param-md5": "{{doc-apihelp-param|edit|md5}}", + "apihelp-edit-param-prependtext": "{{doc-apihelp-param|edit|prependtext}}", + "apihelp-edit-param-appendtext": "{{doc-apihelp-param|edit|appendtext}}", + "apihelp-edit-param-undo": "{{doc-apihelp-param|edit|undo}}", + "apihelp-edit-param-undoafter": "{{doc-apihelp-param|edit|undoafter}}", + "apihelp-edit-param-redirect": "{{doc-apihelp-param|edit|redirect}}", + "apihelp-edit-param-contentformat": "{{doc-apihelp-param|edit|contentformat}}", + "apihelp-edit-param-contentmodel": "{{doc-apihelp-param|edit|contentmodel}}", + "apihelp-edit-param-token": "{{doc-apihelp-param|edit|token}}", + "apihelp-edit-example-edit": "{{doc-apihelp-example|edit}}", + "apihelp-edit-example-prepend": "{{doc-apihelp-example|edit}}", + "apihelp-edit-example-undo": "{{doc-apihelp-example|edit}}", + + "apihelp-emailuser-description": "{{doc-apihelp-description|emailuser}}", + "apihelp-emailuser-param-target": "{{doc-apihelp-param|emailuser|target}}", + "apihelp-emailuser-param-subject": "{{doc-apihelp-param|emailuser|subject}}", + "apihelp-emailuser-param-text": "{{doc-apihelp-param|emailuser|text}}", + "apihelp-emailuser-param-ccme": "{{doc-apihelp-param|emailuser|ccme}}", + "apihelp-emailuser-example-email": "{{doc-apihelp-example|emailuser}}", + + "apihelp-expandtemplates-description": "{{doc-apihelp-description|expandtemplates}}", + "apihelp-expandtemplates-param-title": "{{doc-apihelp-param|expandtemplates|title}}", + "apihelp-expandtemplates-param-text": "{{doc-apihelp-param|expandtemplates|text}}", + "apihelp-expandtemplates-param-prop": "{{doc-apihelp-param|expandtemplates|prop}}", + "apihelp-expandtemplates-param-includecomments": "{{doc-apihelp-param|expandtemplates|includecomments}}", + "apihelp-expandtemplates-param-generatexml": "{{doc-apihelp-param|expandtemplates|generatexml}}", + "apihelp-expandtemplates-example-simple": "{{doc-apihelp-example|expandtemplates}}", + + "apihelp-feedcontributions-description": "{{doc-apihelp-description|feedcontributions}}", + "apihelp-feedcontributions-param-feedformat": "{{doc-apihelp-param|feedcontributions|feedformat}}", + "apihelp-feedcontributions-param-user": "{{doc-apihelp-param|feedcontributions|user}}", + "apihelp-feedcontributions-param-namespace": "{{doc-apihelp-param|feedcontributions|namespace}}", + "apihelp-feedcontributions-param-year": "{{doc-apihelp-param|feedcontributions|year}}", + "apihelp-feedcontributions-param-month": "{{doc-apihelp-param|feedcontributions|month}}", + "apihelp-feedcontributions-param-tagfilter": "{{doc-apihelp-param|feedcontributions|tagfilter}}", + "apihelp-feedcontributions-param-deletedonly": "{{doc-apihelp-param|feedcontributions|deletedonly}}", + "apihelp-feedcontributions-param-toponly": "{{doc-apihelp-param|feedcontributions|toponly}}", + "apihelp-feedcontributions-param-newonly": "{{doc-apihelp-param|feedcontributions|newonly}}", + "apihelp-feedcontributions-param-showsizediff": "{{doc-apihelp-param|feedcontributions|showsizediff}}", + "apihelp-feedcontributions-example-simple": "{{doc-apihelp-example|feedcontributions}}", + + "apihelp-feedrecentchanges-description": "{{doc-apihelp-description|feedrecentchanges}}", + "apihelp-feedrecentchanges-param-feedformat": "{{doc-apihelp-param|feedrecentchanges|feedformat}}", + "apihelp-feedrecentchanges-param-namespace": "{{doc-apihelp-param|feedrecentchanges|namespace}}", + "apihelp-feedrecentchanges-param-invert": "{{doc-apihelp-param|feedrecentchanges|invert}}", + "apihelp-feedrecentchanges-param-associated": "{{doc-apihelp-param|feedrecentchanges|associated}}", + "apihelp-feedrecentchanges-param-days": "{{doc-apihelp-param|feedrecentchanges|days}}", + "apihelp-feedrecentchanges-param-limit": "{{doc-apihelp-param|feedrecentchanges|limit}}", + "apihelp-feedrecentchanges-param-from": "{{doc-apihelp-param|feedrecentchanges|from}}", + "apihelp-feedrecentchanges-param-hideminor": "{{doc-apihelp-param|feedrecentchanges|hideminor}}", + "apihelp-feedrecentchanges-param-hidebots": "{{doc-apihelp-param|feedrecentchanges|hidebots}}", + "apihelp-feedrecentchanges-param-hideanons": "{{doc-apihelp-param|feedrecentchanges|hideanons}}", + "apihelp-feedrecentchanges-param-hideliu": "{{doc-apihelp-param|feedrecentchanges|hideliu}}", + "apihelp-feedrecentchanges-param-hidepatrolled": "{{doc-apihelp-param|feedrecentchanges|hidepatrolled}}", + "apihelp-feedrecentchanges-param-hidemyself": "{{doc-apihelp-param|feedrecentchanges|hidemyself}}", + "apihelp-feedrecentchanges-param-tagfilter": "{{doc-apihelp-param|feedrecentchanges|tagfilter}}", + "apihelp-feedrecentchanges-param-target": "{{doc-apihelp-param|feedrecentchanges|target}}", + "apihelp-feedrecentchanges-param-showlinkedto": "{{doc-apihelp-param|feedrecentchanges|showlinkedto}}", + "apihelp-feedrecentchanges-example-simple": "{{doc-apihelp-example|feedrecentchanges}}", + "apihelp-feedrecentchanges-example-30days": "{{doc-apihelp-example|feedrecentchanges}}", + + "apihelp-feedwatchlist-description": "{{doc-apihelp-description|feedwatchlist}}", + "apihelp-feedwatchlist-param-feedformat": "{{doc-apihelp-param|feedwatchlist|feedformat}}", + "apihelp-feedwatchlist-param-hours": "{{doc-apihelp-param|feedwatchlist|hours}}", + "apihelp-feedwatchlist-param-linktosections": "{{doc-apihelp-param|feedwatchlist|linktosections}}", + "apihelp-feedwatchlist-example-default": "{{doc-apihelp-example|feedwatchlist}}", + "apihelp-feedwatchlist-example-all6hrs": "{{doc-apihelp-example|feedwatchlist}}", + + "apihelp-filerevert-description": "{{doc-apihelp-description|filerevert}}", + "apihelp-filerevert-param-filename": "{{doc-apihelp-param|filerevert|filename}}", + "apihelp-filerevert-param-comment": "{{doc-apihelp-param|filerevert|comment}}", + "apihelp-filerevert-param-archivename": "{{doc-apihelp-param|filerevert|archivename}}", + "apihelp-filerevert-example-revert": "{{doc-apihelp-example|filerevert}}", + + "apihelp-help-description": "{{doc-apihelp-description|help}}", + "apihelp-help-param-modules": "{{doc-apihelp-param|help|modules}}", + "apihelp-help-param-submodules": "{{doc-apihelp-param|help|submodules}}", + "apihelp-help-param-recursivesubmodules": "{{doc-apihelp-param|help|recursivesubmodules}}", + "apihelp-help-param-helpformat": "{{doc-apihelp-param|help|helpformat}}", + "apihelp-help-param-wrap": "{{doc-apihelp-param|help|wrap}}", + "apihelp-help-param-toc": "{{doc-apihelp-param|help|toc}}", + "apihelp-help-example-main": "{{doc-apihelp-example|help}}", + "apihelp-help-example-recursive": "{{doc-apihelp-example|help}}", + "apihelp-help-example-help": "{{doc-apihelp-example|help}}", + "apihelp-help-example-query": "{{doc-apihelp-example|help}}", + + "apihelp-imagerotate-description": "{{doc-apihelp-description|imagerotate}}", + "apihelp-imagerotate-param-rotation": "{{doc-apihelp-param|imagerotate|rotation}}", + "apihelp-imagerotate-example-simple": "{{doc-apihelp-example|imagerotate}}", + "apihelp-imagerotate-example-generator": "{{doc-apihelp-example|imagerotate}}", + + "apihelp-import-description": "{{doc-apihelp-description|import}}", + "apihelp-import-param-summary": "{{doc-apihelp-param|import|summary}}", + "apihelp-import-param-xml": "{{doc-apihelp-param|import|xml}}", + "apihelp-import-param-interwikisource": "{{doc-apihelp-param|import|interwikisource}}", + "apihelp-import-param-interwikipage": "{{doc-apihelp-param|import|interwikipage}}", + "apihelp-import-param-fullhistory": "{{doc-apihelp-param|import|fullhistory}}", + "apihelp-import-param-templates": "{{doc-apihelp-param|import|templates}}", + "apihelp-import-param-namespace": "{{doc-apihelp-param|import|namespace}}", + "apihelp-import-param-rootpage": "{{doc-apihelp-param|import|rootpage}}", + "apihelp-import-example-import": "{{doc-apihelp-example|import}}", + + "apihelp-login-description": "{{doc-apihelp-description|login}}", + "apihelp-login-param-name": "{{doc-apihelp-param|login|name}}", + "apihelp-login-param-password": "{{doc-apihelp-param|login|password}}", + "apihelp-login-param-domain": "{{doc-apihelp-param|login|domain}}", + "apihelp-login-param-token": "{{doc-apihelp-param|login|token}}", + "apihelp-login-example-gettoken": "{{doc-apihelp-example|login}}", + "apihelp-login-example-login": "{{doc-apihelp-example|login}}", + + "apihelp-logout-description": "{{doc-apihelp-description|logout}}", + "apihelp-logout-example-logout": "{{doc-apihelp-example|logout}}", + + "apihelp-move-description": "{{doc-apihelp-description|move}}", + "apihelp-move-param-from": "{{doc-apihelp-param|move|from}}", + "apihelp-move-param-fromid": "{{doc-apihelp-param|move|fromid}}", + "apihelp-move-param-to": "{{doc-apihelp-param|move|to}}", + "apihelp-move-param-reason": "{{doc-apihelp-param|move|reason}}", + "apihelp-move-param-movetalk": "{{doc-apihelp-param|move|movetalk}}", + "apihelp-move-param-movesubpages": "{{doc-apihelp-param|move|movesubpages}}", + "apihelp-move-param-noredirect": "{{doc-apihelp-param|move|noredirect}}", + "apihelp-move-param-watch": "{{doc-apihelp-param|move|watch}}", + "apihelp-move-param-unwatch": "{{doc-apihelp-param|move|unwatch}}", + "apihelp-move-param-watchlist": "{{doc-apihelp-param|move|watchlist}}", + "apihelp-move-param-ignorewarnings": "{{doc-apihelp-param|move|ignorewarnings}}", + "apihelp-move-example-move": "{{doc-apihelp-example|move}}", + + "apihelp-opensearch-description": "{{doc-apihelp-description|opensearch}}", + "apihelp-opensearch-param-search": "{{doc-apihelp-param|opensearch|search}}", + "apihelp-opensearch-param-limit": "{{doc-apihelp-param|opensearch|limit}}", + "apihelp-opensearch-param-namespace": "{{doc-apihelp-param|opensearch|namespace}}", + "apihelp-opensearch-param-suggest": "{{doc-apihelp-param|opensearch|suggest}}", + "apihelp-opensearch-param-format": "{{doc-apihelp-param|opensearch|format}}", + "apihelp-opensearch-example-te": "{{doc-apihelp-example|opensearch}}", + + "apihelp-options-description": "{{doc-apihelp-description|options}}", + "apihelp-options-param-reset": "{{doc-apihelp-param|options|reset}}", + "apihelp-options-param-resetkinds": "{{doc-apihelp-param|options|resetkinds}}", + "apihelp-options-param-change": "{{doc-apihelp-param|options|change}}", + "apihelp-options-param-optionname": "{{doc-apihelp-param|options|optionname}}", + "apihelp-options-param-optionvalue": "{{doc-apihelp-param|options|optionvalue}}", + "apihelp-options-example-reset": "{{doc-apihelp-example|options}}", + "apihelp-options-example-change": "{{doc-apihelp-example|options}}", + "apihelp-options-example-complex": "{{doc-apihelp-example|options}}", + + "apihelp-paraminfo-description": "{{doc-apihelp-description|paraminfo}}", + "apihelp-paraminfo-param-modules": "{{doc-apihelp-param|paraminfo|modules}}", + "apihelp-paraminfo-param-helpformat": "{{doc-apihelp-param|paraminfo|helpformat}}", + "apihelp-paraminfo-param-querymodules": "{{doc-apihelp-param|paraminfo|querymodules}}", + "apihelp-paraminfo-param-mainmodule": "{{doc-apihelp-param|paraminfo|mainmodule}}", + "apihelp-paraminfo-param-pagesetmodule": "{{doc-apihelp-param|paraminfo|pagesetmodule}}", + "apihelp-paraminfo-param-formatmodules": "{{doc-apihelp-param|paraminfo|formatmodules}}", + "apihelp-paraminfo-example-1": "{{doc-apihelp-example|paraminfo}}", + + "apihelp-parse-description": "{{doc-apihelp-description|parse}}", + "apihelp-parse-param-title": "{{doc-apihelp-param|parse|title}}", + "apihelp-parse-param-text": "{{doc-apihelp-param|parse|text}}", + "apihelp-parse-param-summary": "{{doc-apihelp-param|parse|summary}}", + "apihelp-parse-param-page": "{{doc-apihelp-param|parse|page}}", + "apihelp-parse-param-pageid": "{{doc-apihelp-param|parse|pageid}}", + "apihelp-parse-param-redirects": "{{doc-apihelp-param|parse|redirects}}", + "apihelp-parse-param-oldid": "{{doc-apihelp-param|parse|oldid}}", + "apihelp-parse-param-prop": "{{doc-apihelp-param|parse|prop}}", + "apihelp-parse-param-pst": "{{doc-apihelp-param|parse|pst}}", + "apihelp-parse-param-onlypst": "{{doc-apihelp-param|parse|onlypst}}", + "apihelp-parse-param-effectivelanglinks": "{{doc-apihelp-param|parse|effectivelanglinks}}", + "apihelp-parse-param-section": "{{doc-apihelp-param|parse|section}}", + "apihelp-parse-param-disablepp": "{{doc-apihelp-param|parse|disablepp}}", + "apihelp-parse-param-disableeditsection": "{{doc-apihelp-param|parse|disableeditsection}}", + "apihelp-parse-param-generatexml": "{{doc-apihelp-param|parse|generatexml|params=* $1 - Value of the constant CONTENT_MODEL_WIKITEXT|paramstart=2}}", + "apihelp-parse-param-preview": "{{doc-apihelp-param|parse|preview}}", + "apihelp-parse-param-sectionpreview": "{{doc-apihelp-param|parse|sectionpreview}}", + "apihelp-parse-param-disabletoc": "{{doc-apihelp-param|parse|disabletoc}}", + "apihelp-parse-param-contentformat": "{{doc-apihelp-param|parse|contentformat}}", + "apihelp-parse-param-contentmodel": "{{doc-apihelp-param|parse|contentmodel}}", + "apihelp-parse-example-page": "{{doc-apihelp-example|parse}}", + "apihelp-parse-example-text": "{{doc-apihelp-example|parse}}", + "apihelp-parse-example-texttitle": "{{doc-apihelp-example|parse}}", + "apihelp-parse-example-summary": "{{doc-apihelp-example|parse}}", + + "apihelp-patrol-description": "{{doc-apihelp-description|patrol}}", + "apihelp-patrol-param-rcid": "{{doc-apihelp-param|patrol|rcid}}", + "apihelp-patrol-param-revid": "{{doc-apihelp-param|patrol|revid}}", + "apihelp-patrol-example-rcid": "{{doc-apihelp-example|patrol}}", + "apihelp-patrol-example-revid": "{{doc-apihelp-example|patrol}}", + + "apihelp-protect-description": "{{doc-apihelp-description|protect}}", + "apihelp-protect-param-title": "{{doc-apihelp-param|protect|title}}", + "apihelp-protect-param-pageid": "{{doc-apihelp-param|protect|pageid}}", + "apihelp-protect-param-protections": "{{doc-apihelp-param|protect|protections}}", + "apihelp-protect-param-expiry": "{{doc-apihelp-param|protect|expiry}}", + "apihelp-protect-param-reason": "{{doc-apihelp-param|protect|reason}}", + "apihelp-protect-param-cascade": "{{doc-apihelp-param|protect|cascade}}", + "apihelp-protect-param-watch": "{{doc-apihelp-param|protect|watch}}", + "apihelp-protect-param-watchlist": "{{doc-apihelp-param|protect|watchlist}}", + "apihelp-protect-example-protect": "{{doc-apihelp-example|protect}}", + "apihelp-protect-example-unprotect": "{{doc-apihelp-example|protect}}", + "apihelp-protect-example-unprotect2": "{{doc-apihelp-example|protect}}", + + "apihelp-purge-description": "{{doc-apihelp-description|purge}}", + "apihelp-purge-param-forcelinkupdate": "{{doc-apihelp-param|purge|forcelinkupdate}}", + "apihelp-purge-param-forcerecursivelinkupdate": "{{doc-apihelp-param|purge|forcerecursivelinkupdate}}", + "apihelp-purge-example-simple": "{{doc-apihelp-example|purge}}", + "apihelp-purge-example-generator": "{{doc-apihelp-example|purge}}", + + "apihelp-query-description": "{{doc-apihelp-description|query}}", + "apihelp-query-param-prop": "{{doc-apihelp-param|query|prop}}", + "apihelp-query-param-list": "{{doc-apihelp-param|query|list}}", + "apihelp-query-param-meta": "{{doc-apihelp-param|query|meta}}", + "apihelp-query-param-indexpageids": "{{doc-apihelp-param|query|indexpageids}}", + "apihelp-query-param-export": "{{doc-apihelp-param|query|export}}", + "apihelp-query-param-exportnowrap": "{{doc-apihelp-param|query|exportnowrap}}", + "apihelp-query-param-iwurl": "{{doc-apihelp-param|query|iwurl}}", + "apihelp-query-param-continue": "{{doc-apihelp-param|query|continue}}", + "apihelp-query-param-rawcontinue": "{{doc-apihelp-param|query|rawcontinue}}", + "apihelp-query-example-revisions": "{{doc-apihelp-example|query}}", + "apihelp-query-example-allpages": "{{doc-apihelp-example|query}}", + + "apihelp-query+allcategories-description": "{{doc-apihelp-description|query+allcategories}}", + "apihelp-query+allcategories-param-from": "{{doc-apihelp-param|query+allcategories|from}}", + "apihelp-query+allcategories-param-to": "{{doc-apihelp-param|query+allcategories|to}}", + "apihelp-query+allcategories-param-prefix": "{{doc-apihelp-param|query+allcategories|prefix}}", + "apihelp-query+allcategories-param-dir": "{{doc-apihelp-param|query+allcategories|dir}}", + "apihelp-query+allcategories-param-min": "{{doc-apihelp-param|query+allcategories|min}}", + "apihelp-query+allcategories-param-max": "{{doc-apihelp-param|query+allcategories|max}}", + "apihelp-query+allcategories-param-limit": "{{doc-apihelp-param|query+allcategories|limit}}", + "apihelp-query+allcategories-param-prop": "{{doc-apihelp-param|query+allcategories|prop}}", + "apihelp-query+allcategories-example-size": "{{doc-apihelp-example|query+allcategories}}", + "apihelp-query+allcategories-example-generator": "{{doc-apihelp-example|query+allcategories}}", + + "apihelp-query+allfileusages-description": "{{doc-apihelp-description|query+allfileusages}}", + "apihelp-query+allfileusages-param-from": "{{doc-apihelp-param|query+allfileusages|from}}", + "apihelp-query+allfileusages-param-to": "{{doc-apihelp-param|query+allfileusages|to}}", + "apihelp-query+allfileusages-param-prefix": "{{doc-apihelp-param|query+allfileusages|prefix}}", + "apihelp-query+allfileusages-param-unique": "{{doc-apihelp-param|query+allfileusages|unique}}", + "apihelp-query+allfileusages-param-prop": "{{doc-apihelp-param|query+allfileusages|prop}}", + "apihelp-query+allfileusages-param-limit": "{{doc-apihelp-param|query+allfileusages|limit}}", + "apihelp-query+allfileusages-param-dir": "{{doc-apihelp-param|query+allfileusages|dir}}", + "apihelp-query+allfileusages-example-B": "{{doc-apihelp-example|query+allfileusages}}", + "apihelp-query+allfileusages-example-unique": "{{doc-apihelp-example|query+allfileusages}}", + "apihelp-query+allfileusages-example-unique-generator": "{{doc-apihelp-example|query+allfileusages}}", + "apihelp-query+allfileusages-example-generator": "{{doc-apihelp-example|query+allfileusages}}", + + "apihelp-query+allimages-description": "{{doc-apihelp-description|query+allimages}}", + "apihelp-query+allimages-param-sort": "{{doc-apihelp-param|query+allimages|sort}}", + "apihelp-query+allimages-param-dir": "{{doc-apihelp-param|query+allimages|dir}}", + "apihelp-query+allimages-param-from": "{{doc-apihelp-param|query+allimages|from}}", + "apihelp-query+allimages-param-to": "{{doc-apihelp-param|query+allimages|to}}", + "apihelp-query+allimages-param-start": "{{doc-apihelp-param|query+allimages|start}}", + "apihelp-query+allimages-param-end": "{{doc-apihelp-param|query+allimages|end}}", + "apihelp-query+allimages-param-prop": "{{doc-apihelp-param|query+allimages|prop}}", + "apihelp-query+allimages-param-prefix": "{{doc-apihelp-param|query+allimages|prefix}}", + "apihelp-query+allimages-param-minsize": "{{doc-apihelp-param|query+allimages|minsize}}", + "apihelp-query+allimages-param-maxsize": "{{doc-apihelp-param|query+allimages|maxsize}}", + "apihelp-query+allimages-param-sha1": "{{doc-apihelp-param|query+allimages|sha1}}", + "apihelp-query+allimages-param-sha1base36": "{{doc-apihelp-param|query+allimages|sha1base36}}", + "apihelp-query+allimages-param-user": "{{doc-apihelp-param|query+allimages|user}}", + "apihelp-query+allimages-param-filterbots": "{{doc-apihelp-param|query+allimages|filterbots}}", + "apihelp-query+allimages-param-mime": "{{doc-apihelp-param|query+allimages|mime}}", + "apihelp-query+allimages-param-limit": "{{doc-apihelp-param|query+allimages|limit}}", + "apihelp-query+allimages-example-B": "{{doc-apihelp-example|query+allimages}}", + "apihelp-query+allimages-example-recent": "{{doc-apihelp-example|query+allimages}}", + "apihelp-query+allimages-example-generator": "{{doc-apihelp-example|query+allimages}}", + + "apihelp-query+alllinks-description": "{{doc-apihelp-description|query+alllinks}}", + "apihelp-query+alllinks-param-from": "{{doc-apihelp-param|query+alllinks|from}}", + "apihelp-query+alllinks-param-to": "{{doc-apihelp-param|query+alllinks|to}}", + "apihelp-query+alllinks-param-prefix": "{{doc-apihelp-param|query+alllinks|prefix}}", + "apihelp-query+alllinks-param-unique": "{{doc-apihelp-param|query+alllinks|unique}}", + "apihelp-query+alllinks-param-prop": "{{doc-apihelp-param|query+alllinks|prop}}", + "apihelp-query+alllinks-param-namespace": "{{doc-apihelp-param|query+alllinks|namespace}}", + "apihelp-query+alllinks-param-limit": "{{doc-apihelp-param|query+alllinks|limit}}", + "apihelp-query+alllinks-param-dir": "{{doc-apihelp-param|query+alllinks|dir}}", + "apihelp-query+alllinks-example-B": "{{doc-apihelp-example|query+alllinks}}", + "apihelp-query+alllinks-example-unique": "{{doc-apihelp-example|query+alllinks}}", + "apihelp-query+alllinks-example-unique-generator": "{{doc-apihelp-example|query+alllinks}}", + "apihelp-query+alllinks-example-generator": "{{doc-apihelp-example|query+alllinks}}", + + "apihelp-query+allmessages-description": "{{doc-apihelp-description|query+allmessages}}", + "apihelp-query+allmessages-param-messages": "{{doc-apihelp-param|query+allmessages|messages}}", + "apihelp-query+allmessages-param-prop": "{{doc-apihelp-param|query+allmessages|prop}}", + "apihelp-query+allmessages-param-enableparser": "{{doc-apihelp-param|query+allmessages|enableparser}}", + "apihelp-query+allmessages-param-nocontent": "{{doc-apihelp-param|query+allmessages|nocontent}}", + "apihelp-query+allmessages-param-includelocal": "{{doc-apihelp-param|query+allmessages|includelocal}}", + "apihelp-query+allmessages-param-args": "{{doc-apihelp-param|query+allmessages|args}}", + "apihelp-query+allmessages-param-filter": "{{doc-apihelp-param|query+allmessages|filter}}", + "apihelp-query+allmessages-param-customised": "{{doc-apihelp-param|query+allmessages|customised}}", + "apihelp-query+allmessages-param-lang": "{{doc-apihelp-param|query+allmessages|lang}}", + "apihelp-query+allmessages-param-from": "{{doc-apihelp-param|query+allmessages|from}}", + "apihelp-query+allmessages-param-to": "{{doc-apihelp-param|query+allmessages|to}}", + "apihelp-query+allmessages-param-title": "{{doc-apihelp-param|query+allmessages|title}}", + "apihelp-query+allmessages-param-prefix": "{{doc-apihelp-param|query+allmessages|prefix}}", + "apihelp-query+allmessages-example-ipb": "{{doc-apihelp-example|query+allmessages}}", + "apihelp-query+allmessages-example-de": "{{doc-apihelp-example|query+allmessages}}", + + "apihelp-query+allpages-description": "{{doc-apihelp-description|query+allpages}}", + "apihelp-query+allpages-param-from": "{{doc-apihelp-param|query+allpages|from}}", + "apihelp-query+allpages-param-to": "{{doc-apihelp-param|query+allpages|to}}", + "apihelp-query+allpages-param-prefix": "{{doc-apihelp-param|query+allpages|prefix}}", + "apihelp-query+allpages-param-namespace": "{{doc-apihelp-param|query+allpages|namespace}}", + "apihelp-query+allpages-param-filterredir": "{{doc-apihelp-param|query+allpages|filterredir}}", + "apihelp-query+allpages-param-minsize": "{{doc-apihelp-param|query+allpages|minsize}}", + "apihelp-query+allpages-param-maxsize": "{{doc-apihelp-param|query+allpages|maxsize}}", + "apihelp-query+allpages-param-prtype": "{{doc-apihelp-param|query+allpages|prtype}}", + "apihelp-query+allpages-param-prlevel": "{{doc-apihelp-param|query+allpages|prlevel}}", + "apihelp-query+allpages-param-prfiltercascade": "{{doc-apihelp-param|query+allpages|prfiltercascade}}", + "apihelp-query+allpages-param-limit": "{{doc-apihelp-param|query+allpages|limit}}", + "apihelp-query+allpages-param-dir": "{{doc-apihelp-param|query+allpages|dir}}", + "apihelp-query+allpages-param-filterlanglinks": "{{doc-apihelp-param|query+allpages|filterlanglinks}}", + "apihelp-query+allpages-param-prexpiry": "{{doc-apihelp-param|query+allpages|prexpiry}}", + "apihelp-query+allpages-example-B": "{{doc-apihelp-example|query+allpages}}", + "apihelp-query+allpages-example-generator": "{{doc-apihelp-example|query+allpages}}", + "apihelp-query+allpages-example-generator-revisions": "{{doc-apihelp-example|query+allpages}}", + + "apihelp-query+allredirects-description": "{{doc-apihelp-description|query+allredirects}}", + "apihelp-query+allredirects-param-from": "{{doc-apihelp-param|query+allredirects|from}}", + "apihelp-query+allredirects-param-to": "{{doc-apihelp-param|query+allredirects|to}}", + "apihelp-query+allredirects-param-prefix": "{{doc-apihelp-param|query+allredirects|prefix}}", + "apihelp-query+allredirects-param-unique": "{{doc-apihelp-param|query+allredirects|unique}}", + "apihelp-query+allredirects-param-prop": "{{doc-apihelp-param|query+allredirects|prop}}", + "apihelp-query+allredirects-param-namespace": "{{doc-apihelp-param|query+allredirects|namespace}}", + "apihelp-query+allredirects-param-limit": "{{doc-apihelp-param|query+allredirects|limit}}", + "apihelp-query+allredirects-param-dir": "{{doc-apihelp-param|query+allredirects|dir}}", + "apihelp-query+allredirects-example-B": "{{doc-apihelp-example|query+allredirects}}", + "apihelp-query+allredirects-example-unique": "{{doc-apihelp-example|query+allredirects}}", + "apihelp-query+allredirects-example-unique-generator": "{{doc-apihelp-example|query+allredirects}}", + "apihelp-query+allredirects-example-generator": "{{doc-apihelp-example|query+allredirects}}", + + "apihelp-query+alltransclusions-description": "{{doc-apihelp-description|query+alltransclusions}}", + "apihelp-query+alltransclusions-param-from": "{{doc-apihelp-param|query+alltransclusions|from}}", + "apihelp-query+alltransclusions-param-to": "{{doc-apihelp-param|query+alltransclusions|to}}", + "apihelp-query+alltransclusions-param-prefix": "{{doc-apihelp-param|query+alltransclusions|prefix}}", + "apihelp-query+alltransclusions-param-unique": "{{doc-apihelp-param|query+alltransclusions|unique}}", + "apihelp-query+alltransclusions-param-prop": "{{doc-apihelp-param|query+alltransclusions|prop}}", + "apihelp-query+alltransclusions-param-namespace": "{{doc-apihelp-param|query+alltransclusions|namespace}}", + "apihelp-query+alltransclusions-param-limit": "{{doc-apihelp-param|query+alltransclusions|limit}}", + "apihelp-query+alltransclusions-param-dir": "{{doc-apihelp-param|query+alltransclusions|dir}}", + "apihelp-query+alltransclusions-example-B": "{{doc-apihelp-example|query+alltransclusions}}", + "apihelp-query+alltransclusions-example-unique": "{{doc-apihelp-example|query+alltransclusions}}", + "apihelp-query+alltransclusions-example-unique-generator": "{{doc-apihelp-example|query+alltransclusions}}", + "apihelp-query+alltransclusions-example-generator": "{{doc-apihelp-example|query+alltransclusions}}", + + "apihelp-query+allusers-description": "{{doc-apihelp-description|query+allusers}}", + "apihelp-query+allusers-param-from": "{{doc-apihelp-param|query+allusers|from}}", + "apihelp-query+allusers-param-to": "{{doc-apihelp-param|query+allusers|to}}", + "apihelp-query+allusers-param-prefix": "{{doc-apihelp-param|query+allusers|prefix}}", + "apihelp-query+allusers-param-dir": "{{doc-apihelp-param|query+allusers|dir}}", + "apihelp-query+allusers-param-group": "{{doc-apihelp-param|query+allusers|group}}", + "apihelp-query+allusers-param-excludegroup": "{{doc-apihelp-param|query+allusers|excludegroup}}", + "apihelp-query+allusers-param-rights": "{{doc-apihelp-param|query+allusers|rights}}", + "apihelp-query+allusers-param-prop": "{{doc-apihelp-param|query+allusers|prop}}", + "apihelp-query+allusers-param-limit": "{{doc-apihelp-param|query+allusers|limit}}", + "apihelp-query+allusers-param-witheditsonly": "{{doc-apihelp-param|query+allusers|witheditsonly}}", + "apihelp-query+allusers-param-activeusers": "{{doc-apihelp-param|query+allusers|activeusers|params=* $1 - Value of [[mw:Manual:$wgActiveUserDays]]|paramstart=2}}", + "apihelp-query+allusers-example-Y": "{{doc-apihelp-example|query+allusers}}", + + "apihelp-query+backlinks-description": "{{doc-apihelp-description|query+backlinks}}", + "apihelp-query+backlinks-param-title": "{{doc-apihelp-param|query+backlinks|title}}", + "apihelp-query+backlinks-param-pageid": "{{doc-apihelp-param|query+backlinks|pageid}}", + "apihelp-query+backlinks-param-namespace": "{{doc-apihelp-param|query+backlinks|namespace}}", + "apihelp-query+backlinks-param-dir": "{{doc-apihelp-param|query+backlinks|dir}}", + "apihelp-query+backlinks-param-filterredir": "{{doc-apihelp-param|query+backlinks|filterredir}}", + "apihelp-query+backlinks-param-limit": "{{doc-apihelp-param|query+backlinks|limit}}", + "apihelp-query+backlinks-param-redirect": "{{doc-apihelp-param|query+backlinks|redirect}}", + "apihelp-query+backlinks-example-simple": "{{doc-apihelp-example|query+backlinks}}", + "apihelp-query+backlinks-example-generator": "{{doc-apihelp-example|query+backlinks}}", + + "apihelp-query+blocks-description": "{{doc-apihelp-description|query+blocks}}", + "apihelp-query+blocks-param-start": "{{doc-apihelp-param|query+blocks|start}}", + "apihelp-query+blocks-param-end": "{{doc-apihelp-param|query+blocks|end}}", + "apihelp-query+blocks-param-ids": "{{doc-apihelp-param|query+blocks|ids}}", + "apihelp-query+blocks-param-users": "{{doc-apihelp-param|query+blocks|users}}", + "apihelp-query+blocks-param-ip": "{{doc-apihelp-param|query+blocks|ip|params=* $1 - Minimum CIDR prefix for IPv4\n* $2 - Minimum CIDR prefix for IPv6|paramstart=3}}", + "apihelp-query+blocks-param-limit": "{{doc-apihelp-param|query+blocks|limit}}", + "apihelp-query+blocks-param-prop": "{{doc-apihelp-param|query+blocks|prop}}", + "apihelp-query+blocks-param-show": "{{doc-apihelp-param|query+blocks|show}}", + "apihelp-query+blocks-example-simple": "{{doc-apihelp-example|query+blocks}}", + "apihelp-query+blocks-example-users": "{{doc-apihelp-example|query+blocks}}", + + "apihelp-query+categories-description": "{{doc-apihelp-description|query+categories}}", + "apihelp-query+categories-param-prop": "{{doc-apihelp-param|query+categories|prop}}", + "apihelp-query+categories-param-show": "{{doc-apihelp-param|query+categories|show}}", + "apihelp-query+categories-param-limit": "{{doc-apihelp-param|query+categories|limit}}", + "apihelp-query+categories-param-categories": "{{doc-apihelp-param|query+categories|categories}}", + "apihelp-query+categories-param-dir": "{{doc-apihelp-param|query+categories|dir}}", + "apihelp-query+categories-example-simple": "{{doc-apihelp-example|query+categories}}", + "apihelp-query+categories-example-generator": "{{doc-apihelp-example|query+categories}}", + + "apihelp-query+categoryinfo-description": "{{doc-apihelp-description|query+categoryinfo}}", + "apihelp-query+categoryinfo-example-simple": "{{doc-apihelp-example|query+categoryinfo}}", + + "apihelp-query+categorymembers-description": "{{doc-apihelp-description|query+categorymembers}}", + "apihelp-query+categorymembers-param-title": "{{doc-apihelp-param|query+categorymembers|title}}", + "apihelp-query+categorymembers-param-pageid": "{{doc-apihelp-param|query+categorymembers|pageid}}", + "apihelp-query+categorymembers-param-prop": "{{doc-apihelp-param|query+categorymembers|prop}}", + "apihelp-query+categorymembers-param-namespace": "{{doc-apihelp-param|query+categorymembers|namespace}}", + "apihelp-query+categorymembers-param-type": "{{doc-apihelp-param|query+categorymembers|type}}", + "apihelp-query+categorymembers-param-limit": "{{doc-apihelp-param|query+categorymembers|limit}}", + "apihelp-query+categorymembers-param-sort": "{{doc-apihelp-param|query+categorymembers|sort}}", + "apihelp-query+categorymembers-param-dir": "{{doc-apihelp-param|query+categorymembers|dir}}", + "apihelp-query+categorymembers-param-start": "{{doc-apihelp-param|query+categorymembers|start}}", + "apihelp-query+categorymembers-param-end": "{{doc-apihelp-param|query+categorymembers|end}}", + "apihelp-query+categorymembers-param-starthexsortkey": "{{doc-apihelp-param|query+categorymembers|starthexsortkey}}", + "apihelp-query+categorymembers-param-endhexsortkey": "{{doc-apihelp-param|query+categorymembers|endhexsortkey}}", + "apihelp-query+categorymembers-param-startsortkeyprefix": "{{doc-apihelp-param|query+categorymembers|startsortkeyprefix}}", + "apihelp-query+categorymembers-param-endsortkeyprefix": "{{doc-apihelp-param|query+categorymembers|endsortkeyprefix}}", + "apihelp-query+categorymembers-param-startsortkey": "{{doc-apihelp-param|query+categorymembers|startsortkey}}", + "apihelp-query+categorymembers-param-endsortkey": "{{doc-apihelp-param|query+categorymembers|endsortkey}}", + "apihelp-query+categorymembers-example-simple": "{{doc-apihelp-example|query+categorymembers}}", + "apihelp-query+categorymembers-example-generator": "{{doc-apihelp-example|query+categorymembers}}", + + "apihelp-query+contributors-description": "{{doc-apihelp-description|query+contributors}}", + "apihelp-query+contributors-param-group": "{{doc-apihelp-param|query+contributors|group}}", + "apihelp-query+contributors-param-excludegroup": "{{doc-apihelp-param|query+contributors|excludegroup}}", + "apihelp-query+contributors-param-rights": "{{doc-apihelp-param|query+contributors|rights}}", + "apihelp-query+contributors-param-excluderights": "{{doc-apihelp-param|query+contributors|excluderights}}", + "apihelp-query+contributors-param-limit": "{{doc-apihelp-param|query+contributors|limit}}", + "apihelp-query+contributors-example-simple": "{{doc-apihelp-example|query+contributors}}", + + "apihelp-query+deletedrevs-description": "{{doc-apihelp-description|query+deletedrevs}}", + "apihelp-query+deletedrevs-paraminfo-modes": "{{doc-apihelp-paraminfo|query+deletedrevs|modes}}", + "apihelp-query+deletedrevs-param-start": "{{doc-apihelp-param|query+deletedrevs|start}}", + "apihelp-query+deletedrevs-param-end": "{{doc-apihelp-param|query+deletedrevs|end}}", + "apihelp-query+deletedrevs-param-from": "{{doc-apihelp-param|query+deletedrevs|from}}", + "apihelp-query+deletedrevs-param-to": "{{doc-apihelp-param|query+deletedrevs|to}}", + "apihelp-query+deletedrevs-param-prefix": "{{doc-apihelp-param|query+deletedrevs|prefix}}", + "apihelp-query+deletedrevs-param-unique": "{{doc-apihelp-param|query+deletedrevs|unique}}", + "apihelp-query+deletedrevs-param-tag": "{{doc-apihelp-param|query+deletedrevs|tag}}", + "apihelp-query+deletedrevs-param-user": "{{doc-apihelp-param|query+deletedrevs|user}}", + "apihelp-query+deletedrevs-param-excludeuser": "{{doc-apihelp-param|query+deletedrevs|excludeuser}}", + "apihelp-query+deletedrevs-param-namespace": "{{doc-apihelp-param|query+deletedrevs|namespace}}", + "apihelp-query+deletedrevs-param-limit": "{{doc-apihelp-param|query+deletedrevs|limit}}", + "apihelp-query+deletedrevs-param-prop": "{{doc-apihelp-param|query+deletedrevs|prop}}", + "apihelp-query+deletedrevs-example-mode1": "{{doc-apihelp-example|query+deletedrevs}}", + "apihelp-query+deletedrevs-example-mode2": "{{doc-apihelp-example|query+deletedrevs}}", + "apihelp-query+deletedrevs-example-mode3-main": "{{doc-apihelp-example|query+deletedrevs}}", + "apihelp-query+deletedrevs-example-mode3-talk": "{{doc-apihelp-example|query+deletedrevs}}", + + "apihelp-query+disabled-description": "{{doc-apihelp-description|query+disabled}}", + + "apihelp-query+duplicatefiles-description": "{{doc-apihelp-description|query+duplicatefiles}}", + "apihelp-query+duplicatefiles-param-limit": "{{doc-apihelp-param|query+duplicatefiles|limit}}", + "apihelp-query+duplicatefiles-param-dir": "{{doc-apihelp-param|query+duplicatefiles|dir}}", + "apihelp-query+duplicatefiles-param-localonly": "{{doc-apihelp-param|query+duplicatefiles|localonly}}", + "apihelp-query+duplicatefiles-example-simple": "{{doc-apihelp-example|query+duplicatefiles}}", + "apihelp-query+duplicatefiles-example-generated": "{{doc-apihelp-example|query+duplicatefiles}}", + + "apihelp-query+embeddedin-description": "{{doc-apihelp-description|query+embeddedin}}", + "apihelp-query+embeddedin-param-title": "{{doc-apihelp-param|query+embeddedin|title}}", + "apihelp-query+embeddedin-param-pageid": "{{doc-apihelp-param|query+embeddedin|pageid}}", + "apihelp-query+embeddedin-param-namespace": "{{doc-apihelp-param|query+embeddedin|namespace}}", + "apihelp-query+embeddedin-param-dir": "{{doc-apihelp-param|query+embeddedin|dir}}", + "apihelp-query+embeddedin-param-filterredir": "{{doc-apihelp-param|query+embeddedin|filterredir}}", + "apihelp-query+embeddedin-param-limit": "{{doc-apihelp-param|query+embeddedin|limit}}", + "apihelp-query+embeddedin-example-simple": "{{doc-apihelp-example|query+embeddedin}}", + "apihelp-query+embeddedin-example-generator": "{{doc-apihelp-example|query+embeddedin}}", + + "apihelp-query+extlinks-description": "{{doc-apihelp-description|query+extlinks}}", + "apihelp-query+extlinks-param-limit": "{{doc-apihelp-param|query+extlinks|limit}}", + "apihelp-query+extlinks-param-protocol": "{{doc-apihelp-param|query+extlinks|protocol}}", + "apihelp-query+extlinks-param-query": "{{doc-apihelp-param|query+extlinks|query}}", + "apihelp-query+extlinks-param-expandurl": "{{doc-apihelp-param|query+extlinks|expandurl}}", + "apihelp-query+extlinks-example-simple": "{{doc-apihelp-example|query+extlinks}}", + + "apihelp-query+exturlusage-description": "{{doc-apihelp-description|query+exturlusage}}", + "apihelp-query+exturlusage-param-prop": "{{doc-apihelp-param|query+exturlusage|prop}}", + "apihelp-query+exturlusage-param-protocol": "{{doc-apihelp-param|query+exturlusage|protocol}}", + "apihelp-query+exturlusage-param-query": "{{doc-apihelp-param|query+exturlusage|query}}", + "apihelp-query+exturlusage-param-namespace": "{{doc-apihelp-param|query+exturlusage|namespace}}", + "apihelp-query+exturlusage-param-limit": "{{doc-apihelp-param|query+exturlusage|limit}}", + "apihelp-query+exturlusage-param-expandurl": "{{doc-apihelp-param|query+exturlusage|expandurl}}", + "apihelp-query+exturlusage-example-simple": "{{doc-apihelp-example|query+exturlusage}}", + + "apihelp-query+filearchive-description": "{{doc-apihelp-description|query+filearchive}}", + "apihelp-query+filearchive-param-from": "{{doc-apihelp-param|query+filearchive|from}}", + "apihelp-query+filearchive-param-to": "{{doc-apihelp-param|query+filearchive|to}}", + "apihelp-query+filearchive-param-prefix": "{{doc-apihelp-param|query+filearchive|prefix}}", + "apihelp-query+filearchive-param-limit": "{{doc-apihelp-param|query+filearchive|limit}}", + "apihelp-query+filearchive-param-dir": "{{doc-apihelp-param|query+filearchive|dir}}", + "apihelp-query+filearchive-param-sha1": "{{doc-apihelp-param|query+filearchive|sha1}}", + "apihelp-query+filearchive-param-sha1base36": "{{doc-apihelp-param|query+filearchive|sha1base36}}", + "apihelp-query+filearchive-param-prop": "{{doc-apihelp-param|query+filearchive|prop}}", + "apihelp-query+filearchive-example-simple": "{{doc-apihelp-example|query+filearchive}}", + + "apihelp-query+filerepoinfo-description": "{{doc-apihelp-description|query+filerepoinfo}}", + "apihelp-query+filerepoinfo-param-prop": "{{doc-apihelp-param|query+filerepoinfo|prop}}", + "apihelp-query+filerepoinfo-example-simple": "{{doc-apihelp-example|query+filerepoinfo}}", + + "apihelp-query+fileusage-description": "{{doc-apihelp-description|query+fileusage}}", + "apihelp-query+fileusage-param-prop": "{{doc-apihelp-param|query+fileusage|prop}}", + "apihelp-query+fileusage-param-namespace": "{{doc-apihelp-param|query+fileusage|namespace}}", + "apihelp-query+fileusage-param-limit": "{{doc-apihelp-param|query+fileusage|limit}}", + "apihelp-query+fileusage-param-show": "{{doc-apihelp-param|query+fileusage|show}}", + "apihelp-query+fileusage-example-simple": "{{doc-apihelp-example|query+fileusage}}", + "apihelp-query+fileusage-example-generator": "{{doc-apihelp-example|query+fileusage}}", + + "apihelp-query+imageinfo-description": "{{doc-apihelp-description|query+imageinfo}}", + "apihelp-query+imageinfo-param-prop": "{{doc-apihelp-param|query+imageinfo|prop}}", + "apihelp-query+imageinfo-param-limit": "{{doc-apihelp-param|query+imageinfo|limit}}", + "apihelp-query+imageinfo-param-start": "{{doc-apihelp-param|query+imageinfo|start}}", + "apihelp-query+imageinfo-param-end": "{{doc-apihelp-param|query+imageinfo|end}}", + "apihelp-query+imageinfo-param-urlwidth": "{{doc-apihelp-param|query+imageinfo|urlwidth|params=* $1 - Maximum number of thumbnails per query|paramstart=2}}", + "apihelp-query+imageinfo-param-urlheight": "{{doc-apihelp-param|query+imageinfo|urlheight}}", + "apihelp-query+imageinfo-param-metadataversion": "{{doc-apihelp-param|query+imageinfo|metadataversion}}", + "apihelp-query+imageinfo-param-extmetadatalanguage": "{{doc-apihelp-param|query+imageinfo|extmetadatalanguage}}", + "apihelp-query+imageinfo-param-extmetadatamultilang": "{{doc-apihelp-param|query+imageinfo|extmetadatamultilang}}", + "apihelp-query+imageinfo-param-extmetadatafilter": "{{doc-apihelp-param|query+imageinfo|extmetadatafilter}}", + "apihelp-query+imageinfo-param-urlparam": "{{doc-apihelp-param|query+imageinfo|urlparam}}", + "apihelp-query+imageinfo-param-localonly": "{{doc-apihelp-param|query+imageinfo|localonly}}", + "apihelp-query+imageinfo-example-simple": "{{doc-apihelp-example|query+imageinfo}}", + "apihelp-query+imageinfo-example-dated": "{{doc-apihelp-example|query+imageinfo}}", + + "apihelp-query+images-description": "{{doc-apihelp-description|query+images}}", + "apihelp-query+images-param-limit": "{{doc-apihelp-param|query+images|limit}}", + "apihelp-query+images-param-images": "{{doc-apihelp-param|query+images|images}}", + "apihelp-query+images-param-dir": "{{doc-apihelp-param|query+images|dir}}", + "apihelp-query+images-example-simple": "{{doc-apihelp-example|query+images}}", + "apihelp-query+images-example-generator": "{{doc-apihelp-example|query+images}}", + + "apihelp-query+imageusage-description": "{{doc-apihelp-description|query+imageusage}}", + "apihelp-query+imageusage-param-title": "{{doc-apihelp-param|query+imageusage|title}}", + "apihelp-query+imageusage-param-pageid": "{{doc-apihelp-param|query+imageusage|pageid}}", + "apihelp-query+imageusage-param-namespace": "{{doc-apihelp-param|query+imageusage|namespace}}", + "apihelp-query+imageusage-param-dir": "{{doc-apihelp-param|query+imageusage|dir}}", + "apihelp-query+imageusage-param-filterredir": "{{doc-apihelp-param|query+imageusage|filterredir}}", + "apihelp-query+imageusage-param-limit": "{{doc-apihelp-param|query+imageusage|limit}}", + "apihelp-query+imageusage-param-redirect": "{{doc-apihelp-param|query+imageusage|redirect}}", + "apihelp-query+imageusage-example-simple": "{{doc-apihelp-example|query+imageusage}}", + "apihelp-query+imageusage-example-generator": "{{doc-apihelp-example|query+imageusage}}", + + "apihelp-query+info-description": "{{doc-apihelp-description|query+info}}", + "apihelp-query+info-param-prop": "{{doc-apihelp-param|query+info|prop}}", + "apihelp-query+info-param-token": "{{doc-apihelp-param|query+info|token}}", + "apihelp-query+info-example-simple": "{{doc-apihelp-example|query+info}}", + "apihelp-query+info-example-protection": "{{doc-apihelp-example|query+info}}", + + "apihelp-query+iwbacklinks-description": "{{doc-apihelp-description|query+iwbacklinks}}", + "apihelp-query+iwbacklinks-param-prefix": "{{doc-apihelp-param|query+iwbacklinks|prefix}}", + "apihelp-query+iwbacklinks-param-title": "{{doc-apihelp-param|query+iwbacklinks|title}}", + "apihelp-query+iwbacklinks-param-limit": "{{doc-apihelp-param|query+iwbacklinks|limit}}", + "apihelp-query+iwbacklinks-param-prop": "{{doc-apihelp-param|query+iwbacklinks|prop}}", + "apihelp-query+iwbacklinks-param-dir": "{{doc-apihelp-param|query+iwbacklinks|dir}}", + "apihelp-query+iwbacklinks-example-simple": "{{doc-apihelp-example|query+iwbacklinks}}", + "apihelp-query+iwbacklinks-example-generator": "{{doc-apihelp-example|query+iwbacklinks}}", + + "apihelp-query+iwlinks-description": "{{doc-apihelp-description|query+iwlinks}}", + "apihelp-query+iwlinks-param-url": "{{doc-apihelp-param|query+iwlinks|url}}", + "apihelp-query+iwlinks-param-prop": "{{doc-apihelp-param|query+iwlinks|prop}}", + "apihelp-query+iwlinks-param-limit": "{{doc-apihelp-param|query+iwlinks|limit}}", + "apihelp-query+iwlinks-param-prefix": "{{doc-apihelp-param|query+iwlinks|prefix}}", + "apihelp-query+iwlinks-param-title": "{{doc-apihelp-param|query+iwlinks|title}}", + "apihelp-query+iwlinks-param-dir": "{{doc-apihelp-param|query+iwlinks|dir}}", + "apihelp-query+iwlinks-example-simple": "{{doc-apihelp-example|query+iwlinks}}", + + "apihelp-query+langbacklinks-description": "{{doc-apihelp-description|query+langbacklinks}}", + "apihelp-query+langbacklinks-param-lang": "{{doc-apihelp-param|query+langbacklinks|lang}}", + "apihelp-query+langbacklinks-param-title": "{{doc-apihelp-param|query+langbacklinks|title}}", + "apihelp-query+langbacklinks-param-limit": "{{doc-apihelp-param|query+langbacklinks|limit}}", + "apihelp-query+langbacklinks-param-prop": "{{doc-apihelp-param|query+langbacklinks|prop}}", + "apihelp-query+langbacklinks-param-dir": "{{doc-apihelp-param|query+langbacklinks|dir}}", + "apihelp-query+langbacklinks-example-simple": "{{doc-apihelp-example|query+langbacklinks}}", + "apihelp-query+langbacklinks-example-generator": "{{doc-apihelp-example|query+langbacklinks}}", + + "apihelp-query+langlinks-description": "{{doc-apihelp-description|query+langlinks}}", + "apihelp-query+langlinks-param-limit": "{{doc-apihelp-param|query+langlinks|limit}}", + "apihelp-query+langlinks-param-url": "{{doc-apihelp-param|query+langlinks|url}}", + "apihelp-query+langlinks-param-prop": "{{doc-apihelp-param|query+langlinks|prop}}", + "apihelp-query+langlinks-param-lang": "{{doc-apihelp-param|query+langlinks|lang}}", + "apihelp-query+langlinks-param-title": "{{doc-apihelp-param|query+langlinks|title}}", + "apihelp-query+langlinks-param-dir": "{{doc-apihelp-param|query+langlinks|dir}}", + "apihelp-query+langlinks-param-inlanguagecode": "{{doc-apihelp-param|query+langlinks|inlanguagecode}}", + "apihelp-query+langlinks-example-simple": "{{doc-apihelp-example|query+langlinks}}", + + "apihelp-query+links-description": "{{doc-apihelp-description|query+links}}", + "apihelp-query+links-param-namespace": "{{doc-apihelp-param|query+links|namespace}}", + "apihelp-query+links-param-limit": "{{doc-apihelp-param|query+links|limit}}", + "apihelp-query+links-param-titles": "{{doc-apihelp-param|query+links|titles}}", + "apihelp-query+links-param-dir": "{{doc-apihelp-param|query+links|dir}}", + "apihelp-query+links-example-simple": "{{doc-apihelp-example|query+links}}", + "apihelp-query+links-example-generator": "{{doc-apihelp-example|query+links}}", + "apihelp-query+links-example-namespaces": "{{doc-apihelp-example|query+links}}", + + "apihelp-query+linkshere-description": "{{doc-apihelp-description|query+linkshere}}", + "apihelp-query+linkshere-param-prop": "{{doc-apihelp-param|query+linkshere|prop}}", + "apihelp-query+linkshere-param-namespace": "{{doc-apihelp-param|query+linkshere|namespace}}", + "apihelp-query+linkshere-param-limit": "{{doc-apihelp-param|query+linkshere|limit}}", + "apihelp-query+linkshere-param-show": "{{doc-apihelp-param|query+linkshere|show}}", + "apihelp-query+linkshere-example-simple": "{{doc-apihelp-example|query+linkshere}}", + "apihelp-query+linkshere-example-generator": "{{doc-apihelp-example|query+linkshere}}", + + "apihelp-query+logevents-description": "{{doc-apihelp-description|query+logevents}}", + "apihelp-query+logevents-param-prop": "{{doc-apihelp-param|query+logevents|prop}}", + "apihelp-query+logevents-param-type": "{{doc-apihelp-param|query+logevents|type}}", + "apihelp-query+logevents-param-action": "{{doc-apihelp-param|query+logevents|action}}", + "apihelp-query+logevents-param-start": "{{doc-apihelp-param|query+logevents|start}}", + "apihelp-query+logevents-param-end": "{{doc-apihelp-param|query+logevents|end}}", + "apihelp-query+logevents-param-user": "{{doc-apihelp-param|query+logevents|user}}", + "apihelp-query+logevents-param-title": "{{doc-apihelp-param|query+logevents|title}}", + "apihelp-query+logevents-param-namespace": "{{doc-apihelp-param|query+logevents|namespace}}", + "apihelp-query+logevents-param-prefix": "{{doc-apihelp-param|query+logevents|prefix}}", + "apihelp-query+logevents-param-tag": "{{doc-apihelp-param|query+logevents|tag}}", + "apihelp-query+logevents-param-limit": "{{doc-apihelp-param|query+logevents|limit}}", + "apihelp-query+logevents-example-simple": "{{doc-apihelp-example|query+logevents}}", + + "apihelp-query+pagepropnames-description": "{{doc-apihelp-description|query+pagepropnames}}", + "apihelp-query+pagepropnames-param-limit": "{{doc-apihelp-param|query+pagepropnames|limit}}", + "apihelp-query+pagepropnames-example-simple": "{{doc-apihelp-example|query+pagepropnames}}", + + "apihelp-query+pageprops-description": "{{doc-apihelp-description|query+pageprops}}", + "apihelp-query+pageprops-param-prop": "{{doc-apihelp-param|query+pageprops|prop}}", + "apihelp-query+pageprops-example-simple": "{{doc-apihelp-example|query+pageprops}}", + + "apihelp-query+pageswithprop-description": "{{doc-apihelp-description|query+pageswithprop}}", + "apihelp-query+pageswithprop-param-propname": "{{doc-apihelp-param|query+pageswithprop|propname}}", + "apihelp-query+pageswithprop-param-prop": "{{doc-apihelp-param|query+pageswithprop|prop}}", + "apihelp-query+pageswithprop-param-limit": "{{doc-apihelp-param|query+pageswithprop|limit}}", + "apihelp-query+pageswithprop-param-dir": "{{doc-apihelp-param|query+pageswithprop|dir}}", + "apihelp-query+pageswithprop-example-simple": "{{doc-apihelp-example|query+pageswithprop}}", + "apihelp-query+pageswithprop-example-generator": "{{doc-apihelp-example|query+pageswithprop}}", + + "apihelp-query+prefixsearch-description": "{{doc-apihelp-description|query+prefixsearch}}", + "apihelp-query+prefixsearch-param-search": "{{doc-apihelp-param|query+prefixsearch|search}}", + "apihelp-query+prefixsearch-param-namespace": "{{doc-apihelp-param|query+prefixsearch|namespace}}", + "apihelp-query+prefixsearch-param-limit": "{{doc-apihelp-param|query+prefixsearch|limit}}", + "apihelp-query+prefixsearch-example-simple": "{{doc-apihelp-example|query+prefixsearch}}", + + "apihelp-query+protectedtitles-description": "{{doc-apihelp-description|query+protectedtitles}}", + "apihelp-query+protectedtitles-param-namespace": "{{doc-apihelp-param|query+protectedtitles|namespace}}", + "apihelp-query+protectedtitles-param-level": "{{doc-apihelp-param|query+protectedtitles|level}}", + "apihelp-query+protectedtitles-param-limit": "{{doc-apihelp-param|query+protectedtitles|limit}}", + "apihelp-query+protectedtitles-param-start": "{{doc-apihelp-param|query+protectedtitles|start}}", + "apihelp-query+protectedtitles-param-end": "{{doc-apihelp-param|query+protectedtitles|end}}", + "apihelp-query+protectedtitles-param-prop": "{{doc-apihelp-param|query+protectedtitles|prop}}", + "apihelp-query+protectedtitles-example-simple": "{{doc-apihelp-example|query+protectedtitles}}", + "apihelp-query+protectedtitles-example-generator": "{{doc-apihelp-example|query+protectedtitles}}", + + "apihelp-query+querypage-description": "{{doc-apihelp-description|query+querypage}}", + "apihelp-query+querypage-param-page": "{{doc-apihelp-param|query+querypage|page}}", + "apihelp-query+querypage-param-limit": "{{doc-apihelp-param|query+querypage|limit}}", + "apihelp-query+querypage-example-ancientpages": "{{doc-apihelp-example|query+querypage}}", + + "apihelp-query+random-description": "{{doc-apihelp-description|query+random}}", + "apihelp-query+random-param-namespace": "{{doc-apihelp-param|query+random|namespace}}", + "apihelp-query+random-param-limit": "{{doc-apihelp-param|query+random|limit}}", + "apihelp-query+random-param-redirect": "{{doc-apihelp-param|query+random|redirect}}", + "apihelp-query+random-example-simple": "{{doc-apihelp-example|query+random}}", + "apihelp-query+random-example-generator": "{{doc-apihelp-example|query+random}}", + + "apihelp-query+recentchanges-description": "{{doc-apihelp-description|query+recentchanges}}", + "apihelp-query+recentchanges-param-start": "{{doc-apihelp-param|query+recentchanges|start}}", + "apihelp-query+recentchanges-param-end": "{{doc-apihelp-param|query+recentchanges|end}}", + "apihelp-query+recentchanges-param-namespace": "{{doc-apihelp-param|query+recentchanges|namespace}}", + "apihelp-query+recentchanges-param-user": "{{doc-apihelp-param|query+recentchanges|user}}", + "apihelp-query+recentchanges-param-excludeuser": "{{doc-apihelp-param|query+recentchanges|excludeuser}}", + "apihelp-query+recentchanges-param-tag": "{{doc-apihelp-param|query+recentchanges|tag}}", + "apihelp-query+recentchanges-param-prop": "{{doc-apihelp-param|query+recentchanges|prop}}", + "apihelp-query+recentchanges-param-token": "{{doc-apihelp-param|query+recentchanges|token}}", + "apihelp-query+recentchanges-param-show": "{{doc-apihelp-param|query+recentchanges|show}}", + "apihelp-query+recentchanges-param-limit": "{{doc-apihelp-param|query+recentchanges|limit}}", + "apihelp-query+recentchanges-param-type": "{{doc-apihelp-param|query+recentchanges|type}}", + "apihelp-query+recentchanges-param-toponly": "{{doc-apihelp-param|query+recentchanges|toponly}}", + "apihelp-query+recentchanges-example-simple": "{{doc-apihelp-example|query+recentchanges}}", + "apihelp-query+recentchanges-example-generator": "{{doc-apihelp-example|query+recentchanges}}", + + "apihelp-query+redirects-description": "{{doc-apihelp-description|query+redirects}}", + "apihelp-query+redirects-param-prop": "{{doc-apihelp-param|query+redirects|prop}}", + "apihelp-query+redirects-param-namespace": "{{doc-apihelp-param|query+redirects|namespace}}", + "apihelp-query+redirects-param-limit": "{{doc-apihelp-param|query+redirects|limit}}", + "apihelp-query+redirects-param-show": "{{doc-apihelp-param|query+redirects|show}}", + "apihelp-query+redirects-example-simple": "{{doc-apihelp-example|query+redirects}}", + "apihelp-query+redirects-example-generator": "{{doc-apihelp-example|query+redirects}}", + + "apihelp-query+revisions-description": "{{doc-apihelp-description|query+revisions}}", + "apihelp-query+revisions-paraminfo-singlepageonly": "{{doc-apihelp-paraminfo|query+revisions|singlepageonly}}", + "apihelp-query+revisions-param-prop": "{{doc-apihelp-param|query+revisions|prop}}", + "apihelp-query+revisions-param-limit": "{{doc-apihelp-param|query+revisions|limit}}", + "apihelp-query+revisions-param-startid": "{{doc-apihelp-param|query+revisions|startid}}", + "apihelp-query+revisions-param-endid": "{{doc-apihelp-param|query+revisions|endid}}", + "apihelp-query+revisions-param-start": "{{doc-apihelp-param|query+revisions|start}}", + "apihelp-query+revisions-param-end": "{{doc-apihelp-param|query+revisions|end}}", + "apihelp-query+revisions-param-user": "{{doc-apihelp-param|query+revisions|user}}", + "apihelp-query+revisions-param-excludeuser": "{{doc-apihelp-param|query+revisions|excludeuser}}", + "apihelp-query+revisions-param-tag": "{{doc-apihelp-param|query+revisions|tag}}", + "apihelp-query+revisions-param-expandtemplates": "{{doc-apihelp-param|query+revisions|expandtemplates}}", + "apihelp-query+revisions-param-generatexml": "{{doc-apihelp-param|query+revisions|generatexml}}", + "apihelp-query+revisions-param-parse": "{{doc-apihelp-param|query+revisions|parse}}", + "apihelp-query+revisions-param-section": "{{doc-apihelp-param|query+revisions|section}}", + "apihelp-query+revisions-param-token": "{{doc-apihelp-param|query+revisions|token}}", + "apihelp-query+revisions-param-diffto": "{{doc-apihelp-param|query+revisions|diffto}}", + "apihelp-query+revisions-param-difftotext": "{{doc-apihelp-param|query+revisions|difftotext}}", + "apihelp-query+revisions-param-contentformat": "{{doc-apihelp-param|query+revisions|contentformat}}", + "apihelp-query+revisions-example-content": "{{doc-apihelp-example|query+revisions}}", + "apihelp-query+revisions-example-last5": "{{doc-apihelp-example|query+revisions}}", + "apihelp-query+revisions-example-first5": "{{doc-apihelp-example|query+revisions}}", + "apihelp-query+revisions-example-first5-after": "{{doc-apihelp-example|query+revisions}}", + "apihelp-query+revisions-example-first5-not-localhost": "{{doc-apihelp-example|query+revisions}}", + "apihelp-query+revisions-example-first5-user": "{{doc-apihelp-example|query+revisions}}", + + "apihelp-query+search-description": "{{doc-apihelp-description|query+search}}", + "apihelp-query+search-param-search": "{{doc-apihelp-param|query+search|search}}", + "apihelp-query+search-param-namespace": "{{doc-apihelp-param|query+search|namespace}}", + "apihelp-query+search-param-what": "{{doc-apihelp-param|query+search|what}}", + "apihelp-query+search-param-info": "{{doc-apihelp-param|query+search|info}}", + "apihelp-query+search-param-prop": "{{doc-apihelp-param|query+search|prop}}", + "apihelp-query+search-param-limit": "{{doc-apihelp-param|query+search|limit}}", + "apihelp-query+search-param-interwiki": "{{doc-apihelp-param|query+search|interwiki}}", + "apihelp-query+search-param-backend": "{{doc-apihelp-param|query+search|backend}}", + "apihelp-query+search-example-simple": "{{doc-apihelp-example|query+search}}", + "apihelp-query+search-example-text": "{{doc-apihelp-example|query+search}}", + "apihelp-query+search-example-generator": "{{doc-apihelp-example|query+search}}", + + "apihelp-query+siteinfo-description": "{{doc-apihelp-description|query+siteinfo}}", + "apihelp-query+siteinfo-param-prop": "{{doc-apihelp-param|query+siteinfo|prop}}", + "apihelp-query+siteinfo-param-filteriw": "{{doc-apihelp-param|query+siteinfo|filteriw}}", + "apihelp-query+siteinfo-param-showalldb": "{{doc-apihelp-param|query+siteinfo|showalldb}}", + "apihelp-query+siteinfo-param-numberingroup": "{{doc-apihelp-param|query+siteinfo|numberingroup}}", + "apihelp-query+siteinfo-param-inlanguagecode": "{{doc-apihelp-param|query+siteinfo|inlanguagecode}}", + "apihelp-query+siteinfo-example-simple": "{{doc-apihelp-example|query+siteinfo}}", + "apihelp-query+siteinfo-example-interwiki": "{{doc-apihelp-example|query+siteinfo}}", + "apihelp-query+siteinfo-example-replag": "{{doc-apihelp-example|query+siteinfo}}", + + "apihelp-query+stashimageinfo-description": "{{doc-apihelp-description|query+stashimageinfo}}", + "apihelp-query+stashimageinfo-param-filekey": "{{doc-apihelp-param|query+stashimageinfo|filekey}}", + "apihelp-query+stashimageinfo-param-sessionkey": "{{doc-apihelp-param|query+stashimageinfo|sessionkey}}", + "apihelp-query+stashimageinfo-param-prop": "{{doc-apihelp-param|query+stashimageinfo|prop}}", + "apihelp-query+stashimageinfo-example-simple": "{{doc-apihelp-example|query+stashimageinfo}}", + "apihelp-query+stashimageinfo-example-params": "{{doc-apihelp-example|query+stashimageinfo}}", + + "apihelp-query+tags-description": "{{doc-apihelp-description|query+tags}}", + "apihelp-query+tags-param-limit": "{{doc-apihelp-param|query+tags|limit}}", + "apihelp-query+tags-param-prop": "{{doc-apihelp-param|query+tags|prop}}", + "apihelp-query+tags-example-simple": "{{doc-apihelp-example|query+tags}}", + + "apihelp-query+templates-description": "{{doc-apihelp-description|query+templates}}", + "apihelp-query+templates-param-namespace": "{{doc-apihelp-param|query+templates|namespace}}", + "apihelp-query+templates-param-limit": "{{doc-apihelp-param|query+templates|limit}}", + "apihelp-query+templates-param-templates": "{{doc-apihelp-param|query+templates|templates}}", + "apihelp-query+templates-param-dir": "{{doc-apihelp-param|query+templates|dir}}", + "apihelp-query+templates-example-simple": "{{doc-apihelp-example|query+templates}}", + "apihelp-query+templates-example-generator": "{{doc-apihelp-example|query+templates}}", + "apihelp-query+templates-example-namespaces": "{{doc-apihelp-example|query+templates}}", + + "apihelp-query+tokens-description": "{{doc-apihelp-description|query+tokens}}", + "apihelp-query+tokens-param-type": "{{doc-apihelp-param|query+tokens|type}}", + "apihelp-query+tokens-example-simple": "{{doc-apihelp-example|query+tokens}}", + "apihelp-query+tokens-example-types": "{{doc-apihelp-example|query+tokens}}", + + "apihelp-query+transcludedin-description": "{{doc-apihelp-description|query+transcludedin}}", + "apihelp-query+transcludedin-param-prop": "{{doc-apihelp-param|query+transcludedin|prop}}", + "apihelp-query+transcludedin-param-namespace": "{{doc-apihelp-param|query+transcludedin|namespace}}", + "apihelp-query+transcludedin-param-limit": "{{doc-apihelp-param|query+transcludedin|limit}}", + "apihelp-query+transcludedin-param-show": "{{doc-apihelp-param|query+transcludedin|show}}", + "apihelp-query+transcludedin-example-simple": "{{doc-apihelp-example|query+transcludedin}}", + "apihelp-query+transcludedin-example-generator": "{{doc-apihelp-example|query+transcludedin}}", + + "apihelp-query+usercontribs-description": "{{doc-apihelp-description|query+usercontribs}}", + "apihelp-query+usercontribs-param-limit": "{{doc-apihelp-param|query+usercontribs|limit}}", + "apihelp-query+usercontribs-param-start": "{{doc-apihelp-param|query+usercontribs|start}}", + "apihelp-query+usercontribs-param-end": "{{doc-apihelp-param|query+usercontribs|end}}", + "apihelp-query+usercontribs-param-user": "{{doc-apihelp-param|query+usercontribs|user}}", + "apihelp-query+usercontribs-param-userprefix": "{{doc-apihelp-param|query+usercontribs|userprefix}}", + "apihelp-query+usercontribs-param-namespace": "{{doc-apihelp-param|query+usercontribs|namespace}}", + "apihelp-query+usercontribs-param-prop": "{{doc-apihelp-param|query+usercontribs|prop}}", + "apihelp-query+usercontribs-param-show": "{{doc-apihelp-param|query+usercontribs|show|params=* $1 - Value of [[mw:Manual:$RCMaxAge|$RCMaxAge]]|paramstart=2}}", + "apihelp-query+usercontribs-param-tag": "{{doc-apihelp-param|query+usercontribs|tag}}", + "apihelp-query+usercontribs-param-toponly": "{{doc-apihelp-param|query+usercontribs|toponly}}", + "apihelp-query+usercontribs-example-user": "{{doc-apihelp-example|query+usercontribs}}", + "apihelp-query+usercontribs-example-ipprefix": "{{doc-apihelp-example|query+usercontribs}}", + + "apihelp-query+userinfo-description": "{{doc-apihelp-description|query+userinfo}}", + "apihelp-query+userinfo-param-prop": "{{doc-apihelp-param|query+userinfo|prop|params=* $1 - Maximum value for the \"unreadcount\" property.\n$2 - Return value when there are more unread pages.|paramstart=3}}", + "apihelp-query+userinfo-example-simple": "{{doc-apihelp-example|query+userinfo}}", + "apihelp-query+userinfo-example-data": "{{doc-apihelp-example|query+userinfo}}", + + "apihelp-query+users-description": "{{doc-apihelp-description|query+users}}", + "apihelp-query+users-param-prop": "{{doc-apihelp-param|query+users|prop}}", + "apihelp-query+users-param-users": "{{doc-apihelp-param|query+users|users}}", + "apihelp-query+users-param-token": "{{doc-apihelp-param|query+users|token}}", + "apihelp-query+users-example-simple": "{{doc-apihelp-example|query+users}}", + + "apihelp-query+watchlist-description": "{{doc-apihelp-description|query+watchlist}}", + "apihelp-query+watchlist-param-allrev": "{{doc-apihelp-param|query+watchlist|allrev}}", + "apihelp-query+watchlist-param-start": "{{doc-apihelp-param|query+watchlist|start}}", + "apihelp-query+watchlist-param-end": "{{doc-apihelp-param|query+watchlist|end}}", + "apihelp-query+watchlist-param-namespace": "{{doc-apihelp-param|query+watchlist|namespace}}", + "apihelp-query+watchlist-param-user": "{{doc-apihelp-param|query+watchlist|user}}", + "apihelp-query+watchlist-param-excludeuser": "{{doc-apihelp-param|query+watchlist|excludeuser}}", + "apihelp-query+watchlist-param-limit": "{{doc-apihelp-param|query+watchlist|limit}}", + "apihelp-query+watchlist-param-prop": "{{doc-apihelp-param|query+watchlist|prop}}", + "apihelp-query+watchlist-param-show": "{{doc-apihelp-param|query+watchlist|show}}", + "apihelp-query+watchlist-param-type": "{{doc-apihelp-param|query+watchlist|type}}", + "apihelp-query+watchlist-param-owner": "{{doc-apihelp-param|query+watchlist|owner}}", + "apihelp-query+watchlist-param-token": "{{doc-apihelp-param|query+watchlist|token}}", + "apihelp-query+watchlist-example-simple": "{{doc-apihelp-example|query+watchlist}}", + "apihelp-query+watchlist-example-props": "{{doc-apihelp-example|query+watchlist}}", + "apihelp-query+watchlist-example-allrev": "{{doc-apihelp-example|query+watchlist}}", + "apihelp-query+watchlist-example-generator": "{{doc-apihelp-example|query+watchlist}}", + "apihelp-query+watchlist-example-generator-rev": "{{doc-apihelp-example|query+watchlist}}", + "apihelp-query+watchlist-example-wlowner": "{{doc-apihelp-example|query+watchlist}}", + + "apihelp-query+watchlistraw-description": "{{doc-apihelp-description|query+watchlistraw}}", + "apihelp-query+watchlistraw-param-namespace": "{{doc-apihelp-param|query+watchlistraw|namespace}}", + "apihelp-query+watchlistraw-param-limit": "{{doc-apihelp-param|query+watchlistraw|limit}}", + "apihelp-query+watchlistraw-param-prop": "{{doc-apihelp-param|query+watchlistraw|prop}}", + "apihelp-query+watchlistraw-param-show": "{{doc-apihelp-param|query+watchlistraw|show}}", + "apihelp-query+watchlistraw-param-owner": "{{doc-apihelp-param|query+watchlistraw|owner}}", + "apihelp-query+watchlistraw-param-token": "{{doc-apihelp-param|query+watchlistraw|token}}", + "apihelp-query+watchlistraw-example-simple": "{{doc-apihelp-example|query+watchlistraw}}", + "apihelp-query+watchlistraw-example-generator": "{{doc-apihelp-example|query+watchlistraw}}", + + "apihelp-revisiondelete-description": "{{doc-apihelp-description|revisiondelete}}", + "apihelp-revisiondelete-param-type": "{{doc-apihelp-param|revisiondelete|type}}", + "apihelp-revisiondelete-param-target": "{{doc-apihelp-param|revisiondelete|target}}", + "apihelp-revisiondelete-param-ids": "{{doc-apihelp-param|revisiondelete|ids}}", + "apihelp-revisiondelete-param-hide": "{{doc-apihelp-param|revisiondelete|hide}}", + "apihelp-revisiondelete-param-show": "{{doc-apihelp-param|revisiondelete|show}}", + "apihelp-revisiondelete-param-suppress": "{{doc-apihelp-param|revisiondelete|suppress}}", + "apihelp-revisiondelete-param-reason": "{{doc-apihelp-param|revisiondelete|reason}}", + "apihelp-revisiondelete-example-revision": "{{doc-apihelp-example|revisiondelete}}", + "apihelp-revisiondelete-example-log": "{{doc-apihelp-example|revisiondelete}}", + + "apihelp-rollback-description": "{{doc-apihelp-description|rollback}}", + "apihelp-rollback-param-title": "{{doc-apihelp-param|rollback|title}}", + "apihelp-rollback-param-pageid": "{{doc-apihelp-param|rollback|pageid}}", + "apihelp-rollback-param-user": "{{doc-apihelp-param|rollback|user}}", + "apihelp-rollback-param-summary": "{{doc-apihelp-param|rollback|summary}}", + "apihelp-rollback-param-markbot": "{{doc-apihelp-param|rollback|markbot}}", + "apihelp-rollback-param-watchlist": "{{doc-apihelp-param|rollback|watchlist}}", + "apihelp-rollback-example-simple": "{{doc-apihelp-example|rollback}}", + "apihelp-rollback-example-summary": "{{doc-apihelp-example|rollback}}", + + "apihelp-rsd-description": "{{doc-apihelp-description|rsd}}", + "apihelp-rsd-example-simple": "{{doc-apihelp-example|rsd}}", + + "apihelp-setnotificationtimestamp-description": "{{doc-apihelp-description|setnotificationtimestamp}}", + "apihelp-setnotificationtimestamp-param-entirewatchlist": "{{doc-apihelp-param|setnotificationtimestamp|entirewatchlist}}", + "apihelp-setnotificationtimestamp-param-timestamp": "{{doc-apihelp-param|setnotificationtimestamp|timestamp}}", + "apihelp-setnotificationtimestamp-param-torevid": "{{doc-apihelp-param|setnotificationtimestamp|torevid}}", + "apihelp-setnotificationtimestamp-param-newerthanrevid": "{{doc-apihelp-param|setnotificationtimestamp|newerthanrevid}}", + "apihelp-setnotificationtimestamp-example-all": "{{doc-apihelp-example|setnotificationtimestamp}}", + "apihelp-setnotificationtimestamp-example-page": "{{doc-apihelp-example|setnotificationtimestamp}}", + "apihelp-setnotificationtimestamp-example-pagetimestamp": "{{doc-apihelp-example|setnotificationtimestamp}}", + "apihelp-setnotificationtimestamp-example-allpages": "{{doc-apihelp-example|setnotificationtimestamp}}", + + "apihelp-tokens-description": "{{doc-apihelp-description|tokens}}", + "apihelp-tokens-param-type": "{{doc-apihelp-param|tokens|type}}", + "apihelp-tokens-example-edit": "{{doc-apihelp-example|tokens}}", + "apihelp-tokens-example-emailmove": "{{doc-apihelp-example|tokens}}", + + "apihelp-unblock-description": "{{doc-apihelp-description|unblock}}", + "apihelp-unblock-param-id": "{{doc-apihelp-param|unblock|id}}", + "apihelp-unblock-param-user": "{{doc-apihelp-param|unblock|user}}", + "apihelp-unblock-param-reason": "{{doc-apihelp-param|unblock|reason}}", + "apihelp-unblock-example-id": "{{doc-apihelp-example|unblock}}", + "apihelp-unblock-example-user": "{{doc-apihelp-example|unblock}}", + + "apihelp-undelete-description": "{{doc-apihelp-description|undelete}}", + "apihelp-undelete-param-title": "{{doc-apihelp-param|undelete|title}}", + "apihelp-undelete-param-reason": "{{doc-apihelp-param|undelete|reason}}", + "apihelp-undelete-param-timestamps": "{{doc-apihelp-param|undelete|timestamps}}", + "apihelp-undelete-param-fileids": "{{doc-apihelp-param|undelete|fileids}}", + "apihelp-undelete-param-watchlist": "{{doc-apihelp-param|undelete|watchlist}}", + "apihelp-undelete-example-page": "{{doc-apihelp-example|undelete}}", + "apihelp-undelete-example-revisions": "{{doc-apihelp-example|undelete}}", + + "apihelp-upload-description": "{{doc-apihelp-description|upload}}", + "apihelp-upload-param-filename": "{{doc-apihelp-param|upload|filename}}", + "apihelp-upload-param-comment": "{{doc-apihelp-param|upload|comment}}", + "apihelp-upload-param-text": "{{doc-apihelp-param|upload|text}}", + "apihelp-upload-param-watch": "{{doc-apihelp-param|upload|watch}}", + "apihelp-upload-param-watchlist": "{{doc-apihelp-param|upload|watchlist}}", + "apihelp-upload-param-ignorewarnings": "{{doc-apihelp-param|upload|ignorewarnings}}", + "apihelp-upload-param-file": "{{doc-apihelp-param|upload|file}}", + "apihelp-upload-param-url": "{{doc-apihelp-param|upload|url}}", + "apihelp-upload-param-filekey": "{{doc-apihelp-param|upload|filekey}}", + "apihelp-upload-param-sessionkey": "{{doc-apihelp-param|upload|sessionkey}}", + "apihelp-upload-param-stash": "{{doc-apihelp-param|upload|stash}}", + "apihelp-upload-param-filesize": "{{doc-apihelp-param|upload|filesize}}", + "apihelp-upload-param-offset": "{{doc-apihelp-param|upload|offset}}", + "apihelp-upload-param-chunk": "{{doc-apihelp-param|upload|chunk}}", + "apihelp-upload-param-async": "{{doc-apihelp-param|upload|async}}", + "apihelp-upload-param-asyncdownload": "{{doc-apihelp-param|upload|asyncdownload}}", + "apihelp-upload-param-leavemessage": "{{doc-apihelp-param|upload|leavemessage}}", + "apihelp-upload-param-statuskey": "{{doc-apihelp-param|upload|statuskey}}", + "apihelp-upload-param-checkstatus": "{{doc-apihelp-param|upload|checkstatus}}", + "apihelp-upload-example-url": "{{doc-apihelp-example|upload}}", + "apihelp-upload-example-filekey": "{{doc-apihelp-example|upload}}", + + "apihelp-userrights-description": "{{doc-apihelp-description|userrights}}", + "apihelp-userrights-param-user": "{{doc-apihelp-param|userrights|user}}", + "apihelp-userrights-param-userid": "{{doc-apihelp-param|userrights|userid}}", + "apihelp-userrights-param-add": "{{doc-apihelp-param|userrights|add}}", + "apihelp-userrights-param-remove": "{{doc-apihelp-param|userrights|remove}}", + "apihelp-userrights-param-reason": "{{doc-apihelp-param|userrights|reason}}", + "apihelp-userrights-example-user": "{{doc-apihelp-example|userrights}}", + "apihelp-userrights-example-userid": "{{doc-apihelp-example|userrights}}", + + "apihelp-watch-description": "{{doc-apihelp-description|watch}}", + "apihelp-watch-param-title": "{{doc-apihelp-param|watch|title}}", + "apihelp-watch-param-unwatch": "{{doc-apihelp-param|watch|unwatch}}", + "apihelp-watch-example-watch": "{{doc-apihelp-example|watch}}", + "apihelp-watch-example-unwatch": "{{doc-apihelp-example|watch}}", + "apihelp-watch-example-generator": "{{doc-apihelp-example|watch}}", + "apihelp-format-example-generic": "{{doc-apihelp-example|format|params=* $1 - Format name|paramstart=2|noseealso=1}}", "apihelp-dbg-description": "{{doc-apihelp-description|dbg|seealso=* {{msg-mw|apihelp-dbgfm-description}}}}", "apihelp-dbgfm-description": "{{doc-apihelp-description|dbgfm|seealso=* {{msg-mw|apihelp-dbg-description}}}}", @@ -40,21 +1015,20 @@ "apihelp-yaml-description": "{{doc-apihelp-description|yaml|seealso=* {{msg-mw|apihelp-yamlfm-description}}}}", "apihelp-yamlfm-description": "{{doc-apihelp-description|yamlfm|seealso=* {{msg-mw|apihelp-yaml-description}}}}", - "apihelp-help-description": "{{doc-apihelp-description|help}}", - "apihelp-help-param-modules": "{{doc-apihelp-param|help|modules}}", - "apihelp-help-param-submodules": "{{doc-apihelp-param|help|submodules}}", - "apihelp-help-param-recursivesubmodules": "{{doc-apihelp-param|help|recursivesubmodules}}", - "apihelp-help-param-helpformat": "{{doc-apihelp-param|help|helpformat}}", - "apihelp-help-param-wrap": "{{doc-apihelp-param|help|wrap}}", - "apihelp-help-param-toc": "{{doc-apihelp-param|help|toc}}", - "apihelp-help-example-main": "{{doc-apihelp-example|help}}", - "apihelp-help-example-recursive": "{{doc-apihelp-example|help}}", - "apihelp-help-example-help": "{{doc-apihelp-example|help}}", - "apihelp-help-example-query": "{{doc-apihelp-example|help}}", - "api-format-title": "Page title when API output is pretty-printed in HTML.", "api-format-prettyprint-header": "{{technical}} Displayed as a header when API output is pretty-printed in HTML.\n\nParameters:\n* $1 - Format name\n* $2 - Non-pretty-printing module name", + "api-orm-param-props": "{{doc-apihelp-param|orm|props|description=the \"props\" parameter in subclasses of ApiQueryORM}}", + "api-orm-param-limit": "{{doc-apihelp-param|orm|limit|description=the \"limit\" parameter in subclasses of ApiQueryORM}}", + + "api-pageset-param-titles": "{{doc-apihelp-param|pageset|titles|description=the \"titles\" parameter in pageset-using modules}}", + "api-pageset-param-pageids": "{{doc-apihelp-param|pageset|pageids|description=the \"pageids\" parameter in pageset-using modules}}", + "api-pageset-param-revids": "{{doc-apihelp-param|pageset|revids|description=the \"revids\" parameter in pageset-using modules}}", + "api-pageset-param-generator": "{{doc-apihelp-param|pageset|generator|description=the \"generator\" parameter in pageset-using modules}}", + "api-pageset-param-redirects-generator": "{{doc-apihelp-param|pageset|redirects-generator|description=the \"redirects\" parameter in pageset-using modules when the \"generator\" parameter is also available}}", + "api-pageset-param-redirects-nogenerator": "{{doc-apihelp-param|pageset|redirects-generator|description=the \"redirects\" parameter in pageset-using modules when the \"generator\" parameter is not available}}", + "api-pageset-param-converttitles": "{{doc-apihelp-param|pageset|converttitles|description=the \"converttitles\" parameter in pageset-using modules|params=* $1 - List of languages with variants|paramstart=2}}", + "api-help-title": "Page title for the auto-generated help output", "api-help-lead": "Text displayed at the top of the API help page", "api-help-main-header": "Text for the header of the main module", @@ -85,6 +1059,11 @@ "api-help-param-default": "Used to display the default value for an API parameter\n\nParameters:\n* $1 - Default value\n\nSee also:\n* {{msg-mw|api-help-param-default-empty}}", "api-help-param-default-empty": "Used to display the default value for an API parameter when that default is an empty value\n\nSee also:\n* {{msg-mw|api-help-param-default}}", "api-help-param-token": "{{doc-apihelp-param|description=any 'token' parameter|paramstart=3|params=\n* $1 - Token type|noseealso=1}}", + "api-help-param-token-webui": "{{doc-apihelp-param|description=additional text for any \"token\" parameter, explaining that web UI tokens are also accepted|noseealso=1}}", + "api-help-param-disabled-in-miser-mode": "{{doc-apihelp-param|description=any parameter that is disabled when [[mw:Manual:$wgMiserMode|$wgMiserMode]] is set.|noseealso=1}}", + "api-help-param-limited-in-miser-mode": "{{doc-apihelp-param|description=additional text for any parameter that may cause the module to return few results when [[mw:Manual:$wgMiserMode|$wgMiserMode]] is set.|noseealso=1}}", + "api-help-param-direction": "{{doc-apihelp-param|description=any standard \"dir\" parameter|noseealso=1}}", + "api-help-param-continue": "{{doc-apihelp-param|description=any standard \"continue\" parameter, or other parameter with the same semantics|noseealso=1}}", "api-help-param-no-description": "Displayed on API parameters that lack any description", "api-help-examples": "Label for the API help examples section\n\nParameters:\n* $1 - Number of examples to be displayed", "api-help-permissions": "Label for the \"permissions\" section in the main module's help output.\n\nParameters:\n* $1 - Number of permissions displayed", diff --git a/includes/config/GlobalVarConfig.php b/includes/config/GlobalVarConfig.php index 39d6e8e1db..589f7d3548 100644 --- a/includes/config/GlobalVarConfig.php +++ b/includes/config/GlobalVarConfig.php @@ -62,15 +62,6 @@ class GlobalVarConfig implements Config { return $this->hasWithPrefix( $this->prefix, $name ); } - /** - * @see MutableConfig::set - * @deprecated since 1.24 - */ - public function set( $name, $value ) { - wfDeprecated( __METHOD__, '1.24' ); - $this->setWithPrefix( $this->prefix, $name, $value ); - } - /** * Get a variable with a given prefix, if not the defaults. * @@ -93,16 +84,4 @@ class GlobalVarConfig implements Config { $var = $prefix . $name; return array_key_exists( $var, $GLOBALS ); } - - /** - * Get a variable with a given prefix, if not the defaults. - * - * @param string $prefix Prefix to use on the variable - * @param string $name Variable name without prefix - * @param mixed $value Value to set - * @deprecated since 1.24 - */ - protected function setWithPrefix( $prefix, $name, $value ) { - $GLOBALS[$prefix . $name] = $value; - } } diff --git a/includes/debug/logger/Logger.php b/includes/debug/logger/Logger.php new file mode 100644 index 0000000000..f5dd1cf7c2 --- /dev/null +++ b/includes/debug/logger/Logger.php @@ -0,0 +1,212 @@ + + * @copyright © 2014 Bryan Davis and Wikimedia Foundation. + */ +class MWLogger implements \Psr\Log\LoggerInterface { + + /** + * Service provider. + * @var MWLoggerSpi $spi + */ + protected static $spi; + + + /** + * Wrapped PSR-3 logger instance. + * + * @var \Psr\Log\LoggerInterface $delegate + */ + protected $delegate; + + + /** + * @param \Psr\Log\LoggerInterface $logger + */ + public function __construct( \Psr\Log\LoggerInterface $logger ) { + $this->delegate = $logger; + } + + + /** + * Logs with an arbitrary level. + * + * @param string|int $level + * @param string $message + * @param array $context + */ + public function log( $level, $message, array $context = array() ) { + $this->delegate->log( $level, $message, $context ); + } + + + /** + * System is unusable. + * + * @param string $message + * @param array $context + */ + public function emergency( $message, array $context = array() ) { + $this->log( \Psr\Log\LogLevel::EMERGENCY, $message, $context ); + } + + + /** + * Action must be taken immediately. + * + * Example: Entire website down, database unavailable, etc. This should + * trigger the SMS alerts and wake you up. + * + * @param string $message + * @param array $context + */ + public function alert( $message, array $context = array() ) { + $this->log( \Psr\Log\LogLevel::ALERT, $message, $context ); + } + + + /** + * Critical conditions. + * + * Example: Application component unavailable, unexpected exception. + * + * @param string $message + * @param array $context + */ + public function critical( $message, array $context = array( ) ) { + $this->log( \Psr\Log\LogLevel::CRITICAL, $message, $context ); + } + + + /** + * Runtime errors that do not require immediate action but should typically + * be logged and monitored. + * + * @param string $message + * @param array $context + */ + public function error( $message, array $context = array( ) ) { + $this->log( \Psr\Log\LogLevel::ERROR, $message, $context ); + } + + + /** + * Exceptional occurrences that are not errors. + * + * Example: Use of deprecated APIs, poor use of an API, undesirable things + * that are not necessarily wrong. + * + * @param string $message + * @param array $context + */ + public function warning( $message, array $context = array() ) { + $this->log( \Psr\Log\LogLevel::WARNING, $message, $context ); + } + + + /** + * Normal but significant events. + * + * @param string $message + * @param array $context + */ + public function notice( $message, array $context = array() ) { + $this->log( \Psr\Log\LogLevel::NOTICE, $message, $context ); + } + + + /** + * Interesting events. + * + * Example: User logs in, SQL logs. + * + * @param string $message + * @param array $context + */ + public function info( $message, array $context = array() ) { + $this->log( \Psr\Log\LogLevel::INFO, $message, $context ); + } + + + /** + * Detailed debug information. + * + * @param string $message + * @param array $context + */ + public function debug( $message, array $context = array() ) { + $this->log( \Psr\Log\LogLevel::DEBUG, $message, $context ); + } + + + /** + * Register a service provider to create new MWLogger instances. + * + * @param MWLoggerSpi $provider Provider to register + */ + public static function registerProvider( MWLoggerSpi $provider ) { + self::$spi = $provider; + } + + + /** + * Get a named logger instance from the currently configured logger factory. + * + * @param string $channel Logger channel (name) + * @return MWLogger + */ + public static function getInstance( $channel ) { + if ( self::$spi === null ) { + global $wgMWLoggerDefaultSpi; + if ( is_callable( $wgMWLoggerDefaultSpi ) ) { + $provider = $wgMWLoggerDefaultSpi(); + } else { + $provider = new $wgMWLoggerDefaultSpi(); + } + self::registerProvider( $provider ); + } + + return self::$spi->getLogger( $channel ); + } + +} diff --git a/includes/debug/logger/NullSpi.php b/includes/debug/logger/NullSpi.php new file mode 100644 index 0000000000..6c38c329ee --- /dev/null +++ b/includes/debug/logger/NullSpi.php @@ -0,0 +1,54 @@ + + * @copyright © 2014 Bryan Davis and Wikimedia Foundation. + */ +class MWLoggerNullSpi implements MWLoggerSpi { + + /** + * @var \Psr\Log\NullLogger $singleton + */ + protected $singleton; + + + public function __construct() { + $this->singleton = new \Psr\Log\NullLogger(); + } + + + /** + * Get a logger instance. + * + * @param string $channel Logging channel + * @return MWLogger Logger instance + */ + public function getLogger( $channel ) { + return $this->singleton; + } + +} diff --git a/includes/debug/logger/Spi.php b/includes/debug/logger/Spi.php new file mode 100644 index 0000000000..7139856453 --- /dev/null +++ b/includes/debug/logger/Spi.php @@ -0,0 +1,45 @@ + + * @copyright © 2014 Bryan Davis and Wikimedia Foundation. + */ +interface MWLoggerSpi { + + /** + * Get a logger instance. + * + * @param string $channel Logging channel + * @return MWLogger Logger instance + */ + public function getLogger( $channel ); + +} diff --git a/includes/debug/logger/monolog/Handler.php b/includes/debug/logger/monolog/Handler.php new file mode 100644 index 0000000000..1472459f02 --- /dev/null +++ b/includes/debug/logger/monolog/Handler.php @@ -0,0 +1,212 @@ + + * @copyright © 2013 Bryan Davis and Wikimedia Foundation. + */ +class MWLoggerMonologHandler extends \Monolog\Handler\AbstractProcessingHandler { + + /** + * Log sink descriptor + * @var string $uri + */ + protected $uri; + + /** + * Log sink + * @var resource $sink + */ + protected $sink; + + /** + * @var string $error + */ + protected $error; + + /** + * @var string $host + */ + protected $host; + + /** + * @var int $port + */ + protected $port; + + /** + * @var string $prefix + */ + protected $prefix; + + + /** + * @param string $stream Stream URI + * @param int $level Minimum logging level that will trigger handler + * @param bool $bubble Can handled meesages bubble up the handler stack? + */ + public function __construct( + $stream, $level = \Monolog\Logger::DEBUG, $bubble = true + ) { + parent::__construct( $level, $bubble ); + $this->uri = $stream; + } + + + /** + * Open the log sink described by our stream URI. + */ + protected function openSink() { + if ( !$this->uri ) { + throw new LogicException( + 'Missing stream uri, the stream can not be opened.' ); + } + $this->error = null; + set_error_handler( array( $this, 'errorTrap' ) ); + + if ( substr( $this->uri, 0, 4 ) == 'udp:' ) { + $parsed = parse_url( $this->uri ); + if ( !isset( $parsed['host'] ) ) { + throw new UnexpectedValueException( sprintf( + 'Udp transport "%s" must specify a host', $this->uri + ) ); + } + if ( !isset( $parsed['port'] ) ) { + throw new UnexpectedValueException( sprintf( + 'Udp transport "%s" must specify a port', $this->uri + ) ); + } + + $this->host = $parsed['host']; + $this->port = $parsed['port']; + $this->prefix = ''; + + if ( isset( $parsed['path'] ) ) { + $this->prefix = ltrim( $parsed['path'], '/' ); + } + + if ( filter_var( $this->host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 ) ) { + $domain = AF_INET6; + + } else { + $domain = AF_INET; + } + + $this->sink = socket_create( $domain, SOCK_DGRAM, SOL_UDP ); + + } else { + $this->sink = fopen( $this->uri, 'a' ); + } + restore_error_handler(); + + if ( !is_resource( $this->sink ) ) { + $this->sink = null; + throw new UnexpectedValueException( sprintf( + 'The stream or file "%s" could not be opened: %s', + $this->uri, $this->error + ) ); + } + } + + + /** + * Custom error handler. + * @param int $code Error number + * @param string $msg Error message + */ + protected function errorTrap( $code, $msg ) { + $this->error = $msg; + } + + + /** + * Should we use UDP to send messages to the sink? + * @return bool + */ + protected function useUdp() { + return $this->host !== null; + } + + + protected function write( array $record ) { + if ( $this->sink === null ) { + $this->openSink(); + } + + $text = (string) $record['formatted']; + if ( $this->useUdp() ) { + + // Clean it up for the multiplexer + if ( $this->prefix !== '' ) { + $text = preg_replace( '/^/m', "{$this->prefix} ", $text ); + + // Limit to 64KB + if ( strlen( $text ) > 65506 ) { + $text = substr( $text, 0, 65506 ); + } + + if ( substr( $text, -1 ) != "\n" ) { + $text .= "\n"; + } + + } elseif ( strlen( $text ) > 65507 ) { + $text = substr( $text, 0, 65507 ); + } + + socket_sendto( + $this->sink, $text, strlen( $text ), 0, $this->host, $this->port ); + + } else { + fwrite( $this->sink, $text ); + } + } + + + public function close() { + if ( is_resource( $this->sink ) ) { + if ( $this->useUdp() ) { + socket_close( $this->sink ); + + } else { + fclose( $this->sink ); + } + } + $this->sink = null; + } + +} diff --git a/includes/debug/logger/monolog/Processor.php b/includes/debug/logger/monolog/Processor.php new file mode 100644 index 0000000000..a9f72c8f66 --- /dev/null +++ b/includes/debug/logger/monolog/Processor.php @@ -0,0 +1,47 @@ + + * @copyright © 2013 Bryan Davis and Wikimedia Foundation. + */ +class MWLoggerMonologProcessor { + + /** + * @param array $record + * @return array + */ + public function __invoke( array $record ) { + $record['extra'] = array_merge( + $record['extra'], + array( + 'host' => wfHostname(), + 'wiki' => wfWikiID(), + ) + ); + return $record; + } + +} diff --git a/includes/debug/logger/monolog/Spi.php b/includes/debug/logger/monolog/Spi.php new file mode 100644 index 0000000000..fc39b25bba --- /dev/null +++ b/includes/debug/logger/monolog/Spi.php @@ -0,0 +1,279 @@ + array( + * '@default' => array( + * 'processors' => array( 'wiki', 'psr', 'pid', 'uid', 'web' ), + * 'handlers' => array( 'stream' ), + * ), + * 'runJobs' => array( + * 'processors' => array( 'wiki', 'psr', 'pid' ), + * 'handlers' => array( 'stream' ), + * ) + * ), + * 'processors' => array( + * 'wiki' => array( + * 'class' => 'MWLoggerMonologProcessor', + * ), + * 'psr' => array( + * 'class' => '\\Monolog\\Processor\\PsrLogMessageProcessor', + * ), + * 'pid' => array( + * 'class' => '\\Monolog\\Processor\\ProcessIdProcessor', + * ), + * 'uid' => array( + * 'class' => '\\Monolog\\Processor\\UidProcessor', + * ), + * 'web' => array( + * 'class' => '\\Monolog\\Processor\\WebProcessor', + * ), + * ), + * 'handlers' => array( + * 'stream' => array( + * 'class' => '\\Monolog\\Handler\\StreamHandler', + * 'args' => array( 'path/to/your.log' ), + * 'formatter' => 'line', + * ), + * 'redis' => array( + * 'class' => '\\Monolog\\Handler\\RedisHandler', + * 'args' => array( function() { + * $redis = new Redis(); + * $redis->connect( '127.0.0.1', 6379 ); + * return $redis; + * }, + * 'logstash' + * ), + * 'formatter' => 'logstash', + * ), + * 'udp2log' => array( + * 'class' => 'MWLoggerMonologHandler', + * 'args' => array( + * 'udp://127.0.0.1:8420/mediawiki + * ), + * 'formatter' => 'line', + * ), + * ), + * 'formatters' => array( + * 'line' => array( + * 'class' => '\\Monolog\\Formatter\\LineFormatter', + * ), + * 'logstash' => array( + * 'class' => '\\Monolog\\Formatter\\LogstashFormatter', + * 'args' => array( 'mediawiki', php_uname( 'n' ), null, '', 1 ), + * ), + * ), + * ); + * @endcode + * + * @see https://github.com/Seldaek/monolog + * @since 1.25 + * @author Bryan Davis + * @copyright © 2014 Bryan Davis and Wikimedia Foundation. + */ +class MWLoggerMonologSpi implements MWLoggerSpi { + + /** + * @var array $singletons + */ + protected $singletons; + + /** + * Configuration for creating new loggers. + * @var array $config + */ + protected $config; + + + /** + * @param array $config Configuration data. Defaults to global + * $wgMWLoggerMonologSpiConfig + */ + public function __construct( $config = null ) { + if ( $config === null ) { + global $wgMWLoggerMonologSpiConfig; + $config = $wgMWLoggerMonologSpiConfig; + } + $this->config = $config; + $this->reset(); + } + + + /** + * Reset internal caches. + * + * This is public for use in unit tests. Under normal operation there should + * be no need to flush the caches. + */ + public function reset() { + $this->singletons = array( + 'loggers' => array(), + 'handlers' => array(), + 'formatters' => array(), + 'processors' => array(), + ); + } + + + /** + * Get a logger instance. + * + * Creates and caches a logger instance based on configuration found in the + * $wgMWLoggerMonologSpiConfig global. Subsequent request for the same channel + * name will return the cached instance. + * + * @param string $channel Logging channel + * @return MWLogger Logger instance + */ + public function getLogger( $channel ) { + if ( !isset( $this->singletons['loggers'][$channel] ) ) { + // Fallback to using the '@default' configuration if an explict + // configuration for the requested channel isn't found. + $spec = isset( $this->config['loggers'][$channel] ) ? + $this->config['loggers'][$channel] : + $this->config['loggers']['@default']; + + $monolog = $this->createLogger( $channel, $spec ); + $this->singletons['loggers'][$channel] = new MWLogger( $monolog ); + } + + return $this->singletons['loggers'][$channel]; + } + + + /** + * Create a logger. + * @param string $channel Logger channel + * @param array $spec Configuration + * @return \Monolog\Logger + */ + protected function createLogger( $channel, $spec ) { + $obj = new \Monolog\Logger( $channel ); + + if ( isset( $spec['processors'] ) ) { + foreach ( $spec['processors'] as $processor ) { + $obj->pushProcessor( $this->getProcessor( $processor ) ); + } + } + + if ( isset( $spec['handlers'] ) ) { + foreach ( $spec['handlers'] as $handler ) { + $obj->pushHandler( $this->getHandler( $handler ) ); + } + } + return $obj; + } + + + /** + * Create or return cached processor. + * @param string $name Processor name + * @return callable + */ + protected function getProcessor( $name ) { + if ( !isset( $this->singletons['processors'][$name] ) ) { + $spec = $this->config['processors'][$name]; + $this->singletons['processors'][$name] = $this->instantiate( $spec ); + } + return $this->singletons['processors'][$name]; + } + + + /** + * Create or return cached handler. + * @param string $name Processor name + * @return \Monolog\Handler\HandlerInterface + */ + protected function getHandler( $name ) { + if ( !isset( $this->singletons['handlers'][$name] ) ) { + $spec = $this->config['handlers'][$name]; + $handler = $this->instantiate( $spec ); + $handler->setFormatter( $this->getFormatter( $spec['formatter'] ) ); + $this->singletons['handlers'][$name] = $handler; + } + return $this->singletons['handlers'][$name]; + } + + + /** + * Create or return cached formatter. + * @param string $name Formatter name + * @return \Monolog\Formatter\FormatterInterface + */ + protected function getFormatter( $name ) { + if ( !isset( $this->singletons['formatters'][$name] ) ) { + $spec = $this->config['formatters'][$name]; + $this->singletons['formatters'][$name] = $this->instantiate( $spec ); + } + return $this->singletons['formatters'][$name]; + } + + + /** + * Instantiate the requested object. + * + * The specification array must contain a 'class' key with string value that + * specifies the class name to instantiate. It can optionally contain an + * 'args' key that provides constructor arguments. + * + * @param array $spec Object specification + * @return object + */ + protected function instantiate( $spec ) { + $clazz = $spec['class']; + $args = isset( $spec['args'] ) ? $spec['args'] : array(); + // If an argument is a callable, call it. + // This allows passing things such as a database connection to a logger. + $args = array_map( function ( $value ) { + if ( is_callable( $value ) ) { + return $value(); + } else { + return $value; + } + }, $args ); + + if ( empty( $args ) ) { + $obj = new $clazz(); + + } else { + $ref = new ReflectionClass( $clazz ); + $obj = $ref->newInstanceArgs( $args ); + } + + return $obj; + } + +} diff --git a/includes/deferred/SiteStatsUpdate.php b/includes/deferred/SiteStatsUpdate.php index 7bfafee845..97a17c3911 100644 --- a/includes/deferred/SiteStatsUpdate.php +++ b/includes/deferred/SiteStatsUpdate.php @@ -22,9 +22,6 @@ * Class for handling updates to the site_stats table */ class SiteStatsUpdate implements DeferrableUpdate { - /** @var int */ - protected $views = 0; - /** @var int */ protected $edits = 0; @@ -42,7 +39,6 @@ class SiteStatsUpdate implements DeferrableUpdate { // @todo deprecate this constructor function __construct( $views, $edits, $good, $pages = 0, $users = 0 ) { - $this->views = $views; $this->edits = $edits; $this->articles = $good; $this->pages = $pages; @@ -100,7 +96,6 @@ class SiteStatsUpdate implements DeferrableUpdate { } $pd = $this->getPendingDeltas(); // Piggy-back the async deltas onto those of this stats update.... - $this->views += ( $pd['ss_total_views']['+'] - $pd['ss_total_views']['-'] ); $this->edits += ( $pd['ss_total_edits']['+'] - $pd['ss_total_edits']['-'] ); $this->articles += ( $pd['ss_good_articles']['+'] - $pd['ss_good_articles']['-'] ); $this->pages += ( $pd['ss_total_pages']['+'] - $pd['ss_total_pages']['-'] ); @@ -110,7 +105,6 @@ class SiteStatsUpdate implements DeferrableUpdate { // Build up an SQL query of deltas and apply them... $updates = ''; - $this->appendUpdate( $updates, 'ss_total_views', $this->views ); $this->appendUpdate( $updates, 'ss_total_edits', $this->edits ); $this->appendUpdate( $updates, 'ss_good_articles', $this->articles ); $this->appendUpdate( $updates, 'ss_total_pages', $this->pages ); @@ -160,7 +154,6 @@ class SiteStatsUpdate implements DeferrableUpdate { } protected function doUpdatePendingDeltas() { - $this->adjustPending( 'ss_total_views', $this->views ); $this->adjustPending( 'ss_total_edits', $this->edits ); $this->adjustPending( 'ss_good_articles', $this->articles ); $this->adjustPending( 'ss_total_pages', $this->pages ); @@ -226,7 +219,7 @@ class SiteStatsUpdate implements DeferrableUpdate { global $wgMemc; $pending = array(); - foreach ( array( 'ss_total_views', 'ss_total_edits', + foreach ( array( 'ss_total_edits', 'ss_good_articles', 'ss_total_pages', 'ss_users', 'ss_images' ) as $type ) { // Get pending increments and pending decrements diff --git a/includes/deferred/ViewCountUpdate.php b/includes/deferred/ViewCountUpdate.php deleted file mode 100644 index 8282295bb1..0000000000 --- a/includes/deferred/ViewCountUpdate.php +++ /dev/null @@ -1,119 +0,0 @@ -id = intval( $id ); - } - - /** - * Run the update - */ - public function doUpdate() { - global $wgHitcounterUpdateFreq; - - $dbw = wfGetDB( DB_MASTER ); - - if ( $wgHitcounterUpdateFreq <= 1 || $dbw->getType() == 'sqlite' ) { - $id = $this->id; - $method = __METHOD__; - $dbw->onTransactionIdle( function () use ( $dbw, $id, $method ) { - try { - $dbw->update( 'page', - array( 'page_counter = page_counter + 1' ), - array( 'page_id' => $id ), - $method - ); - } catch ( DBError $e ) { - MWExceptionHandler::logException( $e ); - } - } ); - return; - } - - # Not important enough to warrant an error page in case of failure - try { - // Since `hitcounter` is non-transactional, the contention is minimal - $dbw->insert( 'hitcounter', array( 'hc_id' => $this->id ), __METHOD__ ); - $checkfreq = intval( $wgHitcounterUpdateFreq / 25 + 1 ); - if ( rand() % $checkfreq == 0 && $dbw->lastErrno() == 0 ) { - $this->collect(); - } - } catch ( DBError $e ) { - MWExceptionHandler::logException( $e ); - } - } - - protected function collect() { - global $wgHitcounterUpdateFreq; - - $dbw = wfGetDB( DB_MASTER ); - - $rown = $dbw->selectField( 'hitcounter', 'COUNT(*)', array(), __METHOD__ ); - if ( $rown < $wgHitcounterUpdateFreq ) { - return; - } - - wfProfileIn( __METHOD__ . '-collect' ); - $old_user_abort = ignore_user_abort( true ); - - $dbType = $dbw->getType(); - $tabletype = $dbType == 'mysql' ? "ENGINE=HEAP " : ''; - $hitcounterTable = $dbw->tableName( 'hitcounter' ); - $acchitsTable = $dbw->tableName( 'acchits' ); - $pageTable = $dbw->tableName( 'page' ); - - $dbw->lockTables( array(), array( 'hitcounter' ), __METHOD__, false ); - $dbw->query( "CREATE TEMPORARY TABLE $acchitsTable $tabletype AS " . - "SELECT hc_id,COUNT(*) AS hc_n FROM $hitcounterTable " . - 'GROUP BY hc_id', __METHOD__ ); - $dbw->delete( 'hitcounter', '*', __METHOD__ ); - $dbw->unlockTables( __METHOD__ ); - - if ( $dbType == 'mysql' ) { - $dbw->query( "UPDATE $pageTable,$acchitsTable SET page_counter=page_counter + hc_n " . - 'WHERE page_id = hc_id', __METHOD__ ); - } else { - $dbw->query( "UPDATE $pageTable SET page_counter=page_counter + hc_n " . - "FROM $acchitsTable WHERE page_id = hc_id", __METHOD__ ); - } - $dbw->query( "DROP TABLE $acchitsTable", __METHOD__ ); - - ignore_user_abort( $old_user_abort ); - wfProfileOut( __METHOD__ . '-collect' ); - } -} diff --git a/includes/filerepo/file/LocalFile.php b/includes/filerepo/file/LocalFile.php index 6ca19fe1bf..08c9afb18e 100644 --- a/includes/filerepo/file/LocalFile.php +++ b/includes/filerepo/file/LocalFile.php @@ -1850,7 +1850,7 @@ class LocalFile extends File { * Start a transaction and lock the image for update * Increments a reference counter if the lock is already held * @throws MWException Throws an error if the lock was not acquired - * @return bool Success + * @return bool Whether the file lock owns/spawned the DB transaction */ function lock() { $dbw = $this->repo->getMasterDB(); @@ -1877,7 +1877,7 @@ class LocalFile extends File { $this->markVolatile(); // file may change soon - return true; + return $this->lockedOwnTrx; } /** @@ -2419,13 +2419,19 @@ class LocalFileRestoreBatch { return $this->file->repo->newGood(); } - $this->file->lock(); + $lockOwnsTrx = $this->file->lock(); $dbw = $this->file->repo->getMasterDB(); $status = $this->file->repo->newGood(); $exists = (bool)$dbw->selectField( 'image', '1', - array( 'img_name' => $this->file->getName() ), __METHOD__, array( 'FOR UPDATE' ) ); + array( 'img_name' => $this->file->getName() ), + __METHOD__, + // The lock() should already prevents changes, but this still may need + // to bypass any transaction snapshot. However, if lock() started the + // trx (which it probably did) then snapshot is post-lock and up-to-date. + $lockOwnsTrx ? array() : array( 'LOCK IN SHARE MODE' ) + ); // Fetch all or selected archived revisions for the file, // sorted from the most recent to the oldest. diff --git a/includes/installer/WebInstallerPage.php b/includes/installer/WebInstallerPage.php index 2e31e41301..b2b0a69124 100644 --- a/includes/installer/WebInstallerPage.php +++ b/includes/installer/WebInstallerPage.php @@ -796,6 +796,9 @@ class WebInstallerName extends WebInstallerPage { ) ) . $this->parent->getTextBox( array( 'var' => '_AdminEmail', + 'attribs' => array( + 'dir' => 'ltr', + ), 'label' => 'config-admin-email', 'help' => $this->parent->getHelpBox( 'config-admin-email-help' ) ) ) . diff --git a/includes/installer/i18n/hu.json b/includes/installer/i18n/hu.json index a150fbcd66..a35ea31b72 100644 --- a/includes/installer/i18n/hu.json +++ b/includes/installer/i18n/hu.json @@ -6,7 +6,8 @@ "아라", "Dj", "Misibacsi", - "Tacsipacsi" + "Tacsipacsi", + "Dorgan" ] }, "config-desc": "A MediaWiki telepítője", @@ -51,14 +52,12 @@ "config-env-good": "A környezet ellenőrzése befejeződött.\nA MediaWiki telepíthető.", "config-env-bad": "A környezet ellenőrzése befejeződött.\nA MediaWiki nem telepíthető.", "config-env-php": "A PHP verziója: $1", - "config-env-php-toolow": "PHP $1 van telepítve,\nazonban a MediaWikinek PHP $2, vagy újabb szükséges.", "config-unicode-using-utf8": "A rendszer Unicode normalizálására Brion Vibber utf8_normalize.so könyvtárát használja.", "config-unicode-using-intl": "A rendszer Unicode normalizálására az [http://pecl.php.net/intl intl PECL kiterjesztést] használja.", "config-unicode-pure-php-warning": "'''Figyelmeztetés''': Az Unicode normalizáláshoz szükséges [http://pecl.php.net/intl intl PECL kiterjesztés] nem érhető el, helyette a lassú, PHP alapú implementáció lesz használva.\nHa nagy látogatottságú oldalt üzemeltetsz, itt találhatsz további információkat [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations a témáról].", "config-unicode-update-warning": "'''Figyelmeztetés''': Az Unicode normalizáláshoz szükséges burkolókönyvtár [http://site.icu-project.org/ ICU projekt] függvénykönyvtárának régebbi változatát használja.\nHa ügyelni kívánsz a Unicode használatára, fontold meg a [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations frissítését].", "config-no-db": "Nem sikerült egyetlen használható adatbázis-illesztőprogramot sem találni. Telepítened kell egyet a PHP-hez.\nA következő adatbázistípusok támogatottak: $1.\n\nHa a PHP-t magad fordítottad, konfiguráld újra úgy, hogy engedélyezve legyen egy adatbáziskliens, pl. a ./configure --with-mysql parancs használatával.\nHa a PHP-t Debian vagy Ubuntu csomaggal telepítetted, akkor szükséged lesz a php5-mysql modulra is.", "config-no-fts3": "'''Figyelmeztetés''': Az SQLite [//sqlite.org/fts3.html FTS3 modul] nélkül lett fordítva, a keresési funkciók nem fognak működni ezen a rendszeren.", - "config-register-globals": "'''Figyelmeztetés: A PHP [http://php.net/register_globals register_globals] beállítása engedélyezve van.'''\n'''Tiltsd le, ha van rá lehetőséged.'''\nA MediaWiki működőképes a beállítás használata mellett, de a szerver biztonsági kockázatnak lesz kitéve.", "config-magic-quotes-runtime": "'''Kritikus hiba: a [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] aktív!'''\nEz a beállítás kiszámíthatatlan károkat okoz a bevitt adatokban.\nA MediaWiki csak akkor telepíthető, ha ki van kapcsolva.", "config-magic-quotes-sybase": "'''Kritikus hiba: a [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase] aktív!'''\nEz a beállítás kiszámíthatatlan károkat okoz a bevitt adatokban.\nA MediaWiki csak akkor telepíthető, ha ki van kapcsolva.", "config-mbstring": "'''Kritikus hiba: az [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime mbstring.func_overload] aktív!'''\nEz a beállítás hibákat okoz és kiszámíthatatlanul károsíthatja bevitt adatokat.\nA MediaWiki csak akkor telepíthető, ha ki van kapcsolva.", @@ -261,6 +260,8 @@ "config-memcache-badport": "A Memcached a(z) $1 és $2 közötti portokat szokta használni.", "config-extensions": "Kiterjesztések", "config-extensions-help": "A fent felsorolt kiterjesztések találhatóak meg az ./extensions könyvtárban.\n\nLehetséges, hogy további beállításra lesz szükség hozzájuk, de már most engedélyezheted őket.", + "config-skins": "Felületek", + "config-skins-use-as-default": "Felület használata alapértelmezettként", "config-install-alreadydone": "'''Figyelmeztetés:''' Úgy tűnik, hogy a MediaWiki telepítve van, és te ismét megpróbálod telepíteni.\nFolytasd a következő oldalon.", "config-install-begin": "A „{{int:config-continue}}” gomb megnyomása elindítja a MediaWiki telepítését.\nHa szeretnél módosítani a beállításokon, kattints a \"{{int:config-back}}\" gombra.", "config-install-step-done": "kész", diff --git a/includes/installer/i18n/it.json b/includes/installer/i18n/it.json index a61fff29d3..8ef3188e4b 100644 --- a/includes/installer/i18n/it.json +++ b/includes/installer/i18n/it.json @@ -10,7 +10,8 @@ "Lucas2", "Ontsed", "Seb35", - "Nemo bis" + "Nemo bis", + "Ricordisamoa" ] }, "config-desc": "Il programma di installazione per MediaWiki", @@ -220,7 +221,7 @@ "config-admin-error-password": "Errore interno durante l'impostazione di una password per amministratore \"$1\":
$2
", "config-admin-error-bademail": "È stato inserito un indirizzo email non valido.", "config-subscribe": "Sottoscrivi la [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce mailing list degli annunci di rilasci].", - "config-subscribe-help": "Si tratta di una mailing list a basso traffico dedicata agli annunci di nuove versioni, compresi importanti segnalazioni riguardanti la sicurezza.\nÈ consigliato iscriversi e aggiornare la proprio installazione di MediaWiki quando una nuova versione viene resa pubblica.", + "config-subscribe-help": "Si tratta di una mailing list a basso traffico dedicata agli annunci di nuove versioni, compresi importanti segnalazioni riguardanti la sicurezza.\nÈ consigliato iscriversi e aggiornare la propria installazione di MediaWiki quando una nuova versione viene resa pubblica.", "config-subscribe-noemail": "Hai provato ad iscriverti alla mailing list dedicata agli annunci delle nuove versioni senza fornire un indirizzo email.\nInserire un indirizzo email se si desidera effettuare l'iscrizione alla mailing list.", "config-almost-done": "Hai quasi finito!\nAdesso puoi saltare la rimanente parte della configurazione e semplicemente installare la wiki.", "config-optional-continue": "Fammi altre domande.", diff --git a/includes/installer/i18n/mk.json b/includes/installer/i18n/mk.json index 357658502a..52d049b7db 100644 --- a/includes/installer/i18n/mk.json +++ b/includes/installer/i18n/mk.json @@ -92,7 +92,7 @@ "config-db-host": "Домаќин на базата:", "config-db-host-help": "Ако вашата база е на друг опслужувач, тогаш тука внесете го името на домаќинот или IP-адресата.\n\nАко користите заедничко (споделено) вдомување, тогаш вашиот вдомител треба да го наведе точното име на домаќинот во неговата документација.\n\nАко воспоставувате на опслужувач на Windows и користите MySQL, можноста „localhost“ може да не функционира за опслужувачкото име. Во тој случај, обидете се со внесување на „127.0.0.1“ како локална IP-адреса.\n\nАко користите PostgreSQL, оставете го полево празно за да се поврзете преку Unix-приклучок.", "config-db-host-oracle": "TNS на базата:", - "config-db-host-oracle-help": "Внесете важечко [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm локално име за поврзување]. На оваа воспоставка мора да ѝ биде видлива податотеката tnsnames.ora.
Ако користите клиентски библиотеки 10g или понови, тогаш можете да го користите и методот на иметнување на [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].", + "config-db-host-oracle-help": "Внесете важечко [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm месно име за поврзување]. На оваа воспоставка мора да ѝ биде видлива податотеката tnsnames.ora.
Ако користите клиентски библиотеки 10g или понови, тогаш можете да го користите и методот на иметнување на [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].", "config-db-wiki-settings": "Идентификувај го викиво", "config-db-name": "Име на базата:", "config-db-name-help": "Одберете име што ќе го претставува вашето вики.\nИмето не смее да содржи празни места.\n\nАко користите заедничко (споделено) вдомување, тогаш вашиот вдомител ќе ви даде конкретно име на база за користење, или пак ќе ви даде да создавате бази преку контролната табла.", diff --git a/includes/installer/i18n/nb.json b/includes/installer/i18n/nb.json index c1bc294d86..55771c8fd6 100644 --- a/includes/installer/i18n/nb.json +++ b/includes/installer/i18n/nb.json @@ -278,6 +278,8 @@ "config-memcache-badport": "Memcached-port-numrene må være mellom $1 og $2.", "config-extensions": "Utvidelser", "config-extensions-help": "Utvidelsene listet over ble oppdaget i din ./extensions-folder.\n\nDisse kan trenge ekstra konfigurering, men du kan aktivisere dem nå.", + "config-skins": "Drakt", + "config-skins-use-as-default": "Bruk denne drakta som standard", "config-install-alreadydone": "'''Advarsel:''' Det ser ut til at allerede har installert MediaWiki og prøver å installere denne må nytt.\nVær vennlig å fortsette til neste side.", "config-install-begin": "Ved å trykke \"{{int:config-continue}}\", starter du installeringen av MediaWiki.\nHvis du først ønsker å endre på noe, trykk\"{{int:config-back}}\".", "config-install-step-done": "ferdig", diff --git a/includes/jobqueue/Job.php b/includes/jobqueue/Job.php index d89c5d2960..d01a279e57 100644 --- a/includes/jobqueue/Job.php +++ b/includes/jobqueue/Job.php @@ -47,20 +47,12 @@ abstract class Job implements IJobSpecification { /** @var string Text for error that occurred last */ protected $error; - /*------------------------------------------------------------------------- - * Abstract functions - *------------------------------------------------------------------------*/ - /** * Run the job * @return bool Success */ abstract public function run(); - /*------------------------------------------------------------------------- - * Static functions - *------------------------------------------------------------------------*/ - /** * Create the appropriate object to handle a specific job * @@ -80,6 +72,20 @@ abstract class Job implements IJobSpecification { throw new MWException( "Invalid job command `{$command}`" ); } + /** + * @param string $command + * @param Title $title + * @param array|bool $params Can not be === true + */ + public function __construct( $command, $title, $params = false ) { + $this->command = $command; + $this->title = $title; + $this->params = $params; + + // expensive jobs may set this to true + $this->removeDuplicates = false; + } + /** * Batch-insert a group of jobs into the queue. * This will be wrapped in a transaction with a forced commit. @@ -92,68 +98,11 @@ abstract class Job implements IJobSpecification { * @deprecated since 1.21 */ public static function batchInsert( $jobs ) { + wfDeprecated( __METHOD__, '1.21' ); JobQueueGroup::singleton()->push( $jobs ); return true; } - /** - * Insert a group of jobs into the queue. - * - * Same as batchInsert() but does not commit and can thus - * be rolled-back as part of a larger transaction. However, - * large batches of jobs can cause slave lag. - * - * @param Job[] $jobs Array of Job objects - * @return bool - * @deprecated since 1.21 - */ - public static function safeBatchInsert( $jobs ) { - JobQueueGroup::singleton()->push( $jobs, JobQueue::QOS_ATOMIC ); - return true; - } - - /** - * Pop a job of a certain type. This tries less hard than pop() to - * actually find a job; it may be adversely affected by concurrent job - * runners. - * - * @param string $type - * @return Job|bool Returns false if there are no jobs - * @deprecated since 1.21 - */ - public static function pop_type( $type ) { - return JobQueueGroup::singleton()->get( $type )->pop(); - } - - /** - * Pop a job off the front of the queue. - * This is subject to $wgJobTypesExcludedFromDefaultQueue. - * - * @return Job|bool False if there are no jobs - * @deprecated since 1.21 - */ - public static function pop() { - return JobQueueGroup::singleton()->pop(); - } - - /*------------------------------------------------------------------------- - * Non-static functions - *------------------------------------------------------------------------*/ - - /** - * @param string $command - * @param Title $title - * @param array|bool $params Can not be === true - */ - public function __construct( $command, $title, $params = false ) { - $this->command = $command; - $this->title = $title; - $this->params = $params; - - // expensive jobs may set this to true - $this->removeDuplicates = false; - } - /** * @return string */ @@ -315,7 +264,7 @@ abstract class Job implements IJobSpecification { break; } } - if ( $filteredValue ) { + if ( $filteredValue && count( $filteredValue ) < 10 ) { $value = FormatJson::encode( $filteredValue ); } else { $value = "array(" . count( $value ) . ")"; @@ -329,15 +278,15 @@ abstract class Job implements IJobSpecification { } if ( is_object( $this->title ) ) { - $s = "{$this->command} " . $this->title->getPrefixedDBkey(); + $s = "{$this->command} {$this->title->getPrefixedDBkey()}"; if ( $paramString !== '' ) { - $s .= ' ' . $paramString; + $s .= " $paramString"; } - - return $s; } else { - return "{$this->command} $paramString"; + $s = "{$this->command} $paramString"; } + + return $s; } protected function setLastError( $error ) { diff --git a/includes/jobqueue/JobQueueRedis.php b/includes/jobqueue/JobQueueRedis.php index 3519eac8eb..abfdc8c74e 100644 --- a/includes/jobqueue/JobQueueRedis.php +++ b/includes/jobqueue/JobQueueRedis.php @@ -91,6 +91,7 @@ class JobQueueRedis extends JobQueue { $this->compression = isset( $params['compression'] ) ? $params['compression'] : 'none'; $this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] ); $this->daemonized = !empty( $params['daemonized'] ); + $this->checkDelay = true; // always enabled } protected function supportedOrders() { @@ -134,9 +135,6 @@ class JobQueueRedis extends JobQueue { * @throws JobQueueError */ protected function doGetAcquiredCount() { - if ( $this->claimTTL <= 0 ) { - return 0; // no acknowledgements - } $conn = $this->getConnection(); try { $conn->multi( Redis::PIPELINE ); @@ -155,9 +153,6 @@ class JobQueueRedis extends JobQueue { * @throws JobQueueError */ protected function doGetDelayedCount() { - if ( !$this->checkDelay ) { - return 0; // no delayed jobs - } $conn = $this->getConnection(); try { return $conn->zSize( $this->getQueueKey( 'z-delayed' ) ); @@ -172,9 +167,6 @@ class JobQueueRedis extends JobQueue { * @throws JobQueueError */ protected function doGetAbandonedCount() { - if ( $this->claimTTL <= 0 ) { - return 0; // no acknowledgements - } $conn = $this->getConnection(); try { return $conn->zSize( $this->getQueueKey( 'z-abandoned' ) ); @@ -301,22 +293,18 @@ LUA; // Push ready delayed jobs into the queue every 10 jobs to spread the load. // This is also done as a periodic task, but we don't want too much done at once. - if ( $this->checkDelay && mt_rand( 0, 9 ) == 0 ) { + if ( !$this->daemonized && mt_rand( 0, 9 ) == 0 ) { $this->recyclePruneAndUndelayJobs(); } $conn = $this->getConnection(); try { do { - if ( $this->claimTTL > 0 ) { - // Keep the claimed job list down for high-traffic queues - if ( mt_rand( 0, 99 ) == 0 ) { - $this->recyclePruneAndUndelayJobs(); - } - $blob = $this->popAndAcquireBlob( $conn ); - } else { - $blob = $this->popAndDeleteBlob( $conn ); + // Keep the claimed job list down for high-traffic queues + if ( !$this->daemonized && mt_rand( 0, 99 ) == 0 ) { + $this->recyclePruneAndUndelayJobs(); } + $blob = $this->popAndAcquireBlob( $conn ); if ( !is_string( $blob ) ) { break; // no jobs; nothing to do } @@ -338,39 +326,6 @@ LUA; return $job; } - /** - * @param RedisConnRef $conn - * @return array Serialized string or false - * @throws RedisException - */ - protected function popAndDeleteBlob( RedisConnRef $conn ) { - static $script = -<<luaEval( $script, - array( - $this->getQueueKey( 'l-unclaimed' ), # KEYS[1] - $this->getQueueKey( 'h-sha1ById' ), # KEYS[2] - $this->getQueueKey( 'h-idBySha1' ), # KEYS[3] - $this->getQueueKey( 'h-data' ), # KEYS[4] - ), - 4 # number of first argument(s) that are keys - ); - } - /** * @param RedisConnRef $conn * @return array Serialized string or false @@ -416,36 +371,35 @@ LUA; if ( !isset( $job->metadata['uuid'] ) ) { throw new MWException( "Job of type '{$job->getType()}' has no UUID." ); } - if ( $this->claimTTL > 0 ) { - $conn = $this->getConnection(); - try { - static $script = + + $conn = $this->getConnection(); + try { + static $script = <<luaEval( $script, - array( - $this->getQueueKey( 'z-claimed' ), # KEYS[1] - $this->getQueueKey( 'h-attempts' ), # KEYS[2] - $this->getQueueKey( 'h-data' ), # KEYS[3] - $job->metadata['uuid'] # ARGV[1] - ), - 3 # number of first argument(s) that are keys - ); - - if ( !$res ) { - wfDebugLog( 'JobQueueRedis', "Could not acknowledge {$this->type} job." ); - - return false; - } - } catch ( RedisException $e ) { - $this->throwRedisException( $conn, $e ); + $res = $conn->luaEval( $script, + array( + $this->getQueueKey( 'z-claimed' ), # KEYS[1] + $this->getQueueKey( 'h-attempts' ), # KEYS[2] + $this->getQueueKey( 'h-data' ), # KEYS[3] + $job->metadata['uuid'] # ARGV[1] + ), + 3 # number of first argument(s) that are keys + ); + + if ( !$res ) { + wfDebugLog( 'JobQueueRedis', "Could not acknowledge {$this->type} job." ); + + return false; } + } catch ( RedisException $e ) { + $this->throwRedisException( $conn, $e ); } return true; @@ -658,7 +612,6 @@ LUA; if attempts < ARGV[3] then -- Claim expired and retries left: re-enqueue the job redis.call('lPush',kUnclaimed,id) - redis.call('hIncrBy',kAttempts,id,1) released = released + 1 else -- Claim expired and no retries left: mark the job as dead @@ -723,12 +676,9 @@ LUA; if ( $this->daemonized ) { return array(); // managed in the runner loop } - $periods = array( 3600 ); // standard cleanup (useful on config change) + $periods = array( 300 ); // 5 min; delayed/stale jobs if ( $this->claimTTL > 0 ) { - $periods[] = ceil( $this->claimTTL / 2 ); // avoid bad timing - } - if ( $this->checkDelay ) { - $periods[] = 300; // 5 minutes + $periods[] = ceil( $this->claimTTL / 2 ); // halved to avoid bad timing } $period = min( $periods ); $period = max( $period, 30 ); // sanity diff --git a/includes/page/WikiPage.php b/includes/page/WikiPage.php index 9ade16e5af..81c93a1f32 100644 --- a/includes/page/WikiPage.php +++ b/includes/page/WikiPage.php @@ -88,11 +88,6 @@ class WikiPage implements Page, IDBAccessObject { */ protected $mLinksUpdated = '19700101000000'; - /** - * @var int|null - */ - protected $mCounter = null; - /** * Constructor and clear the article * @param Title $title Reference to a Title object. @@ -247,7 +242,6 @@ class WikiPage implements Page, IDBAccessObject { */ protected function clearCacheFields() { $this->mId = null; - $this->mCounter = null; $this->mRedirectTarget = null; // Title object if set $this->mLastRevision = null; // Latest revision $this->mTouched = '19700101000000'; @@ -419,7 +413,6 @@ class WikiPage implements Page, IDBAccessObject { $this->mTitle->loadRestrictions( $data->page_restrictions ); $this->mId = intval( $data->page_id ); - $this->mCounter = intval( $data->page_counter ); $this->mTouched = wfTimestamp( TS_MW, $data->page_touched ); $this->mLinksUpdated = wfTimestampOrNull( TS_MW, $data->page_links_updated ); $this->mIsRedirect = intval( $data->page_is_redirect ); @@ -476,17 +469,6 @@ class WikiPage implements Page, IDBAccessObject { return $this->exists() || $this->mTitle->isAlwaysKnown(); } - /** - * @return int The view count for the page - */ - public function getCount() { - if ( !$this->mDataLoaded ) { - $this->loadPageData(); - } - - return $this->mCounter; - } - /** * Tests if the article content represents a redirect * @@ -1183,17 +1165,10 @@ class WikiPage implements Page, IDBAccessObject { * @param int $oldid The revision id being viewed. If not given or 0, latest revision is assumed. */ public function doViewUpdates( User $user, $oldid = 0 ) { - global $wgDisableCounters; if ( wfReadOnly() ) { return; } - // Don't update page view counters on views from bot users (bug 14044) - if ( !$wgDisableCounters && !$user->isAllowed( 'bot' ) && $this->exists() ) { - DeferredUpdates::addUpdate( new ViewCountUpdate( $this->getId() ) ); - DeferredUpdates::addUpdate( new SiteStatsUpdate( 1, 0, 0 ) ); - } - // Update newtalk / watchlist notification status $user->clearNotification( $this->mTitle, $oldid ); } @@ -1262,7 +1237,6 @@ class WikiPage implements Page, IDBAccessObject { 'page_id' => $page_id, 'page_namespace' => $this->mTitle->getNamespace(), 'page_title' => $this->mTitle->getDBkey(), - 'page_counter' => 0, 'page_restrictions' => '', 'page_is_redirect' => 0, // Will set this shortly... 'page_is_new' => 1, diff --git a/includes/parser/CoreParserFunctions.php b/includes/parser/CoreParserFunctions.php index 355a3c1216..d9f176153a 100644 --- a/includes/parser/CoreParserFunctions.php +++ b/includes/parser/CoreParserFunctions.php @@ -44,7 +44,7 @@ class CoreParserFunctions { 'canonicalurle', 'formatnum', 'grammar', 'gender', 'plural', 'numberofpages', 'numberofusers', 'numberofactiveusers', 'numberofarticles', 'numberoffiles', 'numberofadmins', - 'numberingroup', 'numberofedits', 'numberofviews', 'language', + 'numberingroup', 'numberofedits', 'language', 'padleft', 'padright', 'anchorencode', 'defaultsort', 'filepath', 'pagesincategory', 'pagesize', 'protectionlevel', 'namespacee', 'namespacenumber', 'talkspace', 'talkspacee', @@ -379,8 +379,7 @@ class CoreParserFunctions { $text = $parser->doQuotes( $text ); // remove stripped text (e.g. the UNIQ-QINU stuff) that was generated by tag extensions/whatever - $text = preg_replace( '/' . preg_quote( $parser->uniqPrefix(), '/' ) . '.*?' - . preg_quote( Parser::MARKER_SUFFIX, '/' ) . '/', '', $text ); + $text = $parser->killMarkers( $text ); // list of disallowed tags for DISPLAYTITLE // these will be escaped even though they are allowed in normal wiki text @@ -489,10 +488,6 @@ class CoreParserFunctions { public static function numberofedits( $parser, $raw = null ) { return self::formatRaw( SiteStats::edits(), $raw ); } - public static function numberofviews( $parser, $raw = null ) { - global $wgDisableCounters; - return !$wgDisableCounters ? self::formatRaw( SiteStats::views(), $raw ) : ''; - } public static function pagesinnamespace( $parser, $namespace = 0, $raw = null ) { return self::formatRaw( SiteStats::pagesInNs( intval( $namespace ) ), $raw ); } diff --git a/includes/parser/CoreTagHooks.php b/includes/parser/CoreTagHooks.php index 85920cc11f..3ffa16c41d 100644 --- a/includes/parser/CoreTagHooks.php +++ b/includes/parser/CoreTagHooks.php @@ -35,6 +35,7 @@ class CoreTagHooks { $parser->setHook( 'pre', array( __CLASS__, 'pre' ) ); $parser->setHook( 'nowiki', array( __CLASS__, 'nowiki' ) ); $parser->setHook( 'gallery', array( __CLASS__, 'gallery' ) ); + $parser->setHook( 'indicator', array( __CLASS__, 'indicator' ) ); if ( $wgRawHtml ) { $parser->setHook( 'html', array( __CLASS__, 'html' ) ); } @@ -119,4 +120,30 @@ class CoreTagHooks { public static function gallery( $content, $attributes, $parser ) { return $parser->renderImageGallery( $content, $attributes ); } + + /** + * XML-style tag for page status indicators: icons (or short text snippets) usually displayed in + * the top-right corner of the page, outside of the main content. + * + * @param string $content + * @param array $attributes + * @param Parser $parser + * @param PPFrame $frame + * @return string + * @since 1.25 + */ + public static function indicator( $content, array $attributes, Parser $parser, PPFrame $frame ) { + if ( !isset( $attributes['name'] ) || trim( $attributes['name'] ) === '' ) { + return '' . + wfMessage( 'invalid-indicator-name' )->inContentLanguage()->text() . + ''; + } + + $parser->getOutput()->setIndicator( + trim( $attributes['name'] ), + $parser->recursiveTagParse( $content, $frame ) + ); + + return ''; + } } diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php index ddd1f9a3b9..e6478a4ed9 100644 --- a/includes/parser/Parser.php +++ b/includes/parser/Parser.php @@ -3155,10 +3155,6 @@ class Parser { case 'numberofedits': $value = $pageLang->formatNum( SiteStats::edits() ); break; - case 'numberofviews': - global $wgDisableCounters; - $value = !$wgDisableCounters ? $pageLang->formatNum( SiteStats::views() ) : ''; - break; case 'currenttimestamp': $value = wfTimestamp( TS_MW, $ts ); break; diff --git a/includes/parser/ParserOutput.php b/includes/parser/ParserOutput.php index 43e8d0b8ea..428e7b2b25 100644 --- a/includes/parser/ParserOutput.php +++ b/includes/parser/ParserOutput.php @@ -25,6 +25,7 @@ class ParserOutput extends CacheTime { public $mText, # The output text $mLanguageLinks, # List of the full text of language links, in the order they appear $mCategories, # Map of category names to sort keys + $mIndicators = array(), # Page status indicators, usually displayed in top-right corner $mTitleText, # title text of the chosen language variant $mLinks = array(), # 2-D map of NS/DBK to ID for the links in the document. ID=zero for broken. $mTemplates = array(), # 2-D map of NS/DBK to ID for the template references. ID=zero for broken. @@ -130,6 +131,13 @@ class ParserOutput extends CacheTime { return $this->mCategories; } + /** + * @since 1.25 + */ + public function getIndicators() { + return $this->mIndicators; + } + public function getTitleText() { return $this->mTitleText; } @@ -267,6 +275,13 @@ class ParserOutput extends CacheTime { $this->mCategories[$c] = $sort; } + /** + * @since 1.25 + */ + public function setIndicator( $id, $content ) { + $this->mIndicators[$id] = $content; + } + public function addLanguageLink( $t ) { $this->mLanguageLinks[] = $t; } diff --git a/includes/password/PasswordFactory.php b/includes/password/PasswordFactory.php index 48d6866926..86a3fefd58 100644 --- a/includes/password/PasswordFactory.php +++ b/includes/password/PasswordFactory.php @@ -68,6 +68,15 @@ final class PasswordFactory { $this->default = $type; } + /** + * Get the default password type + * + * @return string + */ + public function getDefaultType() { + return $this->default; + } + /** * Initialize the internal static variables using the global variables * diff --git a/includes/skins/BaseTemplate.php b/includes/skins/BaseTemplate.php index 6dc33ac483..7217000cf0 100644 --- a/includes/skins/BaseTemplate.php +++ b/includes/skins/BaseTemplate.php @@ -600,6 +600,37 @@ abstract class BaseTemplate extends QuickTemplate { return $footericons; } + /** + * Get the suggested HTML for page status indicators: icons (or short text snippets) usually + * displayed in the top-right corner of the page, outside of the main content. + * + * Your skin may implement this differently, for example by handling some indicator names + * specially with a different UI. However, it is recommended to use a `
` as a wrapper element for each indicator, for better compatibility + * with extensions and user scripts. + * + * The raw data is available in `$this->data['indicators']` as an associative array (keys: + * identifiers, values: contents) internally ordered by keys. + * + * @return string HTML + * @since 1.25 + */ + public function getIndicators() { + $out = "
\n"; + foreach ( $this->data['indicators'] as $id => $content ) { + $out .= Html::rawElement( + 'div', + array( + 'id' => Sanitizer::escapeId( "mw-indicator-$id" ), + 'class' => 'mw-indicator', + ), + $content + ) . "\n"; + } + $out .= "
\n"; + return $out; + } + /** * Output the basic end-page trail including bottomscripts, reporttime, and * debug stuff. This should be called right before outputting the closing diff --git a/includes/skins/SkinApi.php b/includes/skins/SkinApi.php index 064c076b91..2fef2209c8 100644 --- a/includes/skins/SkinApi.php +++ b/includes/skins/SkinApi.php @@ -38,4 +38,34 @@ class SkinApi extends SkinTemplate { parent::setupSkinUserCss( $out ); $out->addModuleStyles( 'mediawiki.skinning.interface' ); } + + // Skip work and hooks for stuff we don't use + + function buildSidebar() { + return array(); + } + + function getNewtalks() { + return ''; + } + + function getSiteNotice() { + return ''; + } + + public function getLanguages() { + return array(); + } + + protected function buildPersonalUrls() { + return array(); + } + + protected function buildContentNavigationUrls() { + return array(); + } + + protected function buildNavUrls() { + return array(); + } } diff --git a/includes/skins/SkinApiTemplate.php b/includes/skins/SkinApiTemplate.php index be77c617ee..d5c57eb22c 100644 --- a/includes/skins/SkinApiTemplate.php +++ b/includes/skins/SkinApiTemplate.php @@ -49,4 +49,18 @@ class SkinApiTemplate extends BaseTemplate { set( 'logo', $this->logoText() ); $tpl->set( 'copyright', false ); + // No longer used $tpl->set( 'viewcount', false ); $tpl->set( 'lastmod', false ); $tpl->set( 'credits', false ); $tpl->set( 'numberofwatchingusers', false ); if ( $out->isArticle() && $title->exists() ) { if ( $this->isRevisionCurrent() ) { - if ( !$wgDisableCounters ) { - $viewcount = $this->getWikiPage()->getCount(); - if ( $viewcount ) { - $tpl->set( 'viewcount', $this->msg( 'viewcount' )->numParams( $viewcount )->parse() ); - } - } - if ( $wgMaxCredits != 0 ) { $tpl->set( 'credits', Action::factory( 'credits', $this->getWikiPage(), $this->getContext() )->getCredits( $wgMaxCredits, $wgShowCreditsIfMax ) ); @@ -407,7 +401,6 @@ class SkinTemplate extends Skin { $tpl->set( 'footerlinks', array( 'info' => array( 'lastmod', - 'viewcount', 'numberofwatchingusers', 'credits', 'copyright', @@ -438,6 +431,8 @@ class SkinTemplate extends Skin { } } + $tpl->set( 'indicators', $out->getIndicators() ); + $tpl->set( 'sitenotice', $this->getSiteNotice() ); $tpl->set( 'bottomscripts', $this->bottomScripts() ); $tpl->set( 'printfooter', $this->printSource() ); diff --git a/includes/specialpage/QueryPage.php b/includes/specialpage/QueryPage.php index b229e06e61..167135ba34 100644 --- a/includes/specialpage/QueryPage.php +++ b/includes/specialpage/QueryPage.php @@ -60,7 +60,6 @@ abstract class QueryPage extends SpecialPage { * @return array */ public static function getPages() { - global $wgDisableCounters; static $qp = null; if ( $qp === null ) { @@ -102,10 +101,6 @@ abstract class QueryPage extends SpecialPage { array( 'WithoutInterwikiPage', 'Withoutinterwiki' ), ); wfRunHooks( 'wgQueryPages', array( &$qp ) ); - - if ( !$wgDisableCounters ) { - $qp[] = array( 'PopularPagesPage', 'Popularpages' ); - } } return $qp; diff --git a/includes/specialpage/SpecialPageFactory.php b/includes/specialpage/SpecialPageFactory.php index febd1194a8..b110bdabef 100644 --- a/includes/specialpage/SpecialPageFactory.php +++ b/includes/specialpage/SpecialPageFactory.php @@ -215,7 +215,7 @@ class SpecialPageFactory { */ private static function getPageList() { global $wgSpecialPages; - global $wgDisableCounters, $wgDisableInternalSearch, $wgEmailAuthentication; + global $wgDisableInternalSearch, $wgEmailAuthentication; global $wgEnableEmail, $wgEnableJavaScriptTest; global $wgPageLanguageUseDB; @@ -224,10 +224,6 @@ class SpecialPageFactory { self::$list = self::$coreList; - if ( !$wgDisableCounters ) { - self::$list['Popularpages'] = 'PopularPagesPage'; - } - if ( !$wgDisableInternalSearch ) { self::$list['Search'] = 'SpecialSearch'; } diff --git a/includes/specials/SpecialListfiles.php b/includes/specials/SpecialListfiles.php index c08d11bbdc..c68341cfdf 100644 --- a/includes/specials/SpecialListfiles.php +++ b/includes/specials/SpecialListfiles.php @@ -545,6 +545,7 @@ class ImageListPager extends TablePager { unset( $query['title'] ); unset( $query['limit'] ); unset( $query['ilsearch'] ); + unset( $query['ilshowall'] ); unset( $query['user'] ); $form = new HTMLForm( $fields, $this->getContext() ); diff --git a/includes/specials/SpecialPopularpages.php b/includes/specials/SpecialPopularpages.php deleted file mode 100644 index 2a80f65179..0000000000 --- a/includes/specials/SpecialPopularpages.php +++ /dev/null @@ -1,89 +0,0 @@ - array( 'page' ), - 'fields' => array( - 'namespace' => 'page_namespace', - 'title' => 'page_title', - 'value' => 'page_counter' ), - 'conds' => array( - 'page_is_redirect' => 0, - 'page_namespace' => MWNamespace::getContentNamespaces() - ) - ); - } - - /** - * @param Skin $skin - * @param object $result Result row - * @return string - */ - function formatResult( $skin, $result ) { - global $wgContLang; - - $title = Title::makeTitleSafe( $result->namespace, $result->title ); - if ( !$title ) { - return Html::element( - 'span', - array( 'class' => 'mw-invalidtitle' ), - Linker::getInvalidTitleDescription( - $this->getContext(), - $result->namespace, - $result->title ) - ); - } - - $link = Linker::linkKnown( - $title, - htmlspecialchars( $wgContLang->convert( $title->getPrefixedText() ) ) - ); - $nv = $this->msg( 'nviews' )->numParams( $result->value )->escaped(); - - return $this->getLanguage()->specialList( $link, $nv ); - } - - protected function getGroupName() { - return 'wiki'; - } -} diff --git a/includes/specials/SpecialStatistics.php b/includes/specials/SpecialStatistics.php index f0e360e896..1bbc2f38c2 100644 --- a/includes/specials/SpecialStatistics.php +++ b/includes/specials/SpecialStatistics.php @@ -28,7 +28,7 @@ * @ingroup SpecialPage */ class SpecialStatistics extends SpecialPage { - private $views, $edits, $good, $images, $total, $users, + private $edits, $good, $images, $total, $users, $activeUsers = 0; public function __construct() { @@ -38,13 +38,11 @@ class SpecialStatistics extends SpecialPage { public function execute( $par ) { global $wgMemc; - $disableCounters = $this->getConfig()->get( 'DisableCounters' ); $miserMode = $this->getConfig()->get( 'MiserMode' ); $this->setHeaders(); $this->getOutput()->addModuleStyles( 'mediawiki.special' ); - $this->views = SiteStats::views(); $this->edits = SiteStats::edits(); $this->good = SiteStats::articles(); $this->images = SiteStats::images(); @@ -53,12 +51,6 @@ class SpecialStatistics extends SpecialPage { $this->activeUsers = SiteStats::activeUsers(); $this->hook = ''; - # Staticic - views - $viewsStats = ''; - if ( !$disableCounters ) { - $viewsStats = $this->getViewsStats(); - } - # Set active user count if ( !$miserMode ) { $key = wfMemcKey( 'sitestats', 'activeusers-updated' ); @@ -83,12 +75,6 @@ class SpecialStatistics extends SpecialPage { # Statistic - usergroups $text .= $this->getGroupStats(); - $text .= $viewsStats; - - # Statistic - popular pages - if ( !$disableCounters && !$miserMode ) { - $text .= $this->getMostViewedPages(); - } # Statistic - other $extraStats = array(); @@ -237,63 +223,6 @@ class SpecialStatistics extends SpecialPage { return $text; } - private function getViewsStats() { - return Xml::openElement( 'tr' ) . - Xml::tags( 'th', array( 'colspan' => '2' ), $this->msg( 'statistics-header-views' )->parse() ) . - Xml::closeElement( 'tr' ) . - $this->formatRow( $this->msg( 'statistics-views-total' )->parse(), - $this->getLanguage()->formatNum( $this->views ), - array( 'class' => 'mw-statistics-views-total' ), 'statistics-views-total-desc' ) . - $this->formatRow( $this->msg( 'statistics-views-peredit' )->parse(), - $this->getLanguage()->formatNum( sprintf( '%.2f', $this->edits ? - $this->views / $this->edits : 0 ) ), - array( 'class' => 'mw-statistics-views-peredit' ) ); - } - - private function getMostViewedPages() { - $text = ''; - $dbr = wfGetDB( DB_SLAVE ); - $res = $dbr->select( - 'page', - array( - 'page_namespace', - 'page_title', - 'page_counter', - ), - array( - 'page_is_redirect' => 0, - 'page_counter > 0', - ), - __METHOD__, - array( - 'ORDER BY' => 'page_counter DESC', - 'LIMIT' => 10, - ) - ); - - if ( $res->numRows() > 0 ) { - $text .= Xml::openElement( 'tr' ); - $text .= Xml::tags( - 'th', - array( 'colspan' => '2' ), - $this->msg( 'statistics-mostpopular' )->parse() - ); - $text .= Xml::closeElement( 'tr' ); - - foreach ( $res as $row ) { - $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title ); - - if ( $title instanceof Title ) { - $text .= $this->formatRow( Linker::link( $title ), - $this->getLanguage()->formatNum( $row->page_counter ) ); - } - } - $res->free(); - } - - return $text; - } - /** * Conversion of external statistics into an internal representation * Following a ([][] = number) pattern diff --git a/languages/Names.php b/languages/Names.php index ad149ad7ee..24c83a9bfe 100644 --- a/languages/Names.php +++ b/languages/Names.php @@ -85,6 +85,7 @@ 'br' => 'brezhoneg', # Breton 'brh' => 'Bráhuí', # Brahui 'bs' => 'bosanski', # Bosnian + 'bto' => 'Iriga Bicolano', # Rinconada Bikol 'bug' => 'ᨅᨔ ᨕᨘᨁᨗ', # Buginese 'bxr' => 'буряад', # Buryat (Russia) 'ca' => 'català', # Catalan @@ -342,6 +343,7 @@ 'sdc' => 'Sassaresu', # Sassarese 'se' => 'sámegiella', # Northern Sami 'sei' => 'Cmique Itom', # Seri + 'ses' => 'Koyraboro Senni', # Koyraboro Senni 'sg' => 'Sängö', # Sango/Sangho 'sgs' => 'žemaitėška', # Samogitian 'sh' => 'srpskohrvatski / српскохрватски', # Serbocroatian diff --git a/languages/i18n/bcc.json b/languages/i18n/bcc.json index 3d2573b064..41d93074cd 100644 --- a/languages/i18n/bcc.json +++ b/languages/i18n/bcc.json @@ -27,6 +27,7 @@ "tog-watchdefault": "منی اصلاح کتگین فایل و پیجانء چارگ لیستء توکا هوار کن", "tog-watchmoves": "منی سُرینتگین فایل و پیجانء چارگ لیستء توکا هوار کن", "tog-watchdeletion": "منی حذف کتگین فایل و پیجانء چارگ لیستء توکا هوار بکن", + "tog-watchrollback": "آ دیمانی آڈ کورتین که آوانا برگردان کورته اون په منی پیگیری لیستی هاتیرا", "tog-minordefault": "په طور پیش فرض کل اصلاحات آ په داب جزی مشخص کن", "tog-previewontop": "بازبین پیش دار پیش چه جعبه اصلاح", "tog-previewonfirst": "ته اولین اصلاح بازبینی پیش دار", @@ -59,67 +60,67 @@ "editfont-monospace": "فۆنت گۆن مالومێن پاسلگ", "editfont-sansserif": "بئ گۆشگێن فۆنت", "editfont-serif": "گۆشه دارێن فۆنت", - "sunday": "یک شنبه", - "monday": "دوشنبه", - "tuesday": "سی شنبه", - "wednesday": "چارشنبه", - "thursday": "پنچ شنبه", - "friday": "آدینگ", - "saturday": "شنبه", - "sun": "ی.شنبه", - "mon": "د.شنبه", - "tue": "س.شنبه", - "wed": "چ.شنبه", - "thu": "پ.شنبه", - "fri": "آدینگ", - "sat": "شنبه", - "january": "ژانویه", - "february": "فوریه", - "march": "مارس", + "sunday": "یک شمبی", + "monday": "دوشمبی", + "tuesday": "سئه شمبی", + "wednesday": "چارشمبی", + "thursday": "پنچ شمبی", + "friday": "آدینگ ٬جوما", + "saturday": "شمبی", + "sun": "یک شمی", + "mon": "دو شمبی", + "tue": "سئه شمبی", + "wed": "چار شمبی", + "thu": "پنچ شمبی", + "fri": "آدینگ٬ جوما", + "sat": "شمبی", + "january": "جنوری", + "february": "پیبروری", + "march": "مارچ", "april": "آپریل", "may_long": "می", "june": "جون", "july": "جولای", "august": "آگوست", - "september": "سپتامبر", - "october": "اکتبر", - "november": "نومبر", + "september": "سپٹامبر", + "october": "اکتوبر", + "november": "نوامبر", "december": "دسمبر", - "january-gen": "ژانویه", - "february-gen": "فوریه", - "march-gen": "مارس", + "january-gen": "جنوری", + "february-gen": "پیبروری", + "march-gen": "مارچ", "april-gen": "آپریل", "may-gen": "می", "june-gen": "جون", "july-gen": "جولای", "august-gen": "آگوست", - "september-gen": "سپتمبر", - "october-gen": "اکتبر", - "november-gen": "نومبر", + "september-gen": "سپٹامبر", + "october-gen": "اکتوبر", + "november-gen": "نوامبر", "december-gen": "دسمبر", - "jan": "جن", - "feb": "فب", - "mar": "ما", - "apr": "آپر", + "jan": "جنوری", + "feb": "پیبروری", + "mar": "مارچ", + "apr": "آپریل", "may": "می", "jun": "جون", - "jul": "جول", - "aug": "آگ", - "sep": "سپت", - "oct": "اکت", - "nov": "نو", - "dec": "دس", - "january-date": "جانری، بهارگاه $1", - "february-date": "فبراری، اۆستپان $1", + "jul": "جولای", + "aug": "آگوست", + "sep": "سپٹ\tامبر", + "oct": "اکتوبر", + "nov": "نوامبر", + "dec": "دسمبر", + "january-date": "جنوری، بهارگاه $1", + "february-date": "پیبروری، اۆستپان $1", "march-date": "مارچ، مۆلمان $1", "april-date": "اپریل، کرا $1", "may-date": "مئ، سۆچکان $1", "june-date": "جون، جلکان $1", - "july-date": "جولئ، سهێل $1", + "july-date": "جولای، سهێل $1", "august-date": "اگست، ساچان $1", - "september-date": "سپتمبر، تۆمشان $1", + "september-date": "سپٹامبر، تۆمشان $1", "october-date": "اکتۆبر، سارتان $1", - "november-date": "نومبر، گۆپشان $1", + "november-date": "نوامبر، گۆپشان $1", "december-date": "دسمبر، تاکشان $1", "pagecategories": "{{PLURAL:$1|دسته|دسته جات}}", "category_header": "صفحات ته دسته \"$1\"", @@ -144,16 +145,16 @@ "cancel": "کنسل", "moredotdotdot": "گیشتر...", "morenotlisted": "ائ لیست پکا نه انت", - "mypage": "تاک", + "mypage": "دیم یا تاک", "mytalk": "گپ", "anontalk": "گپ کن گون ای آی پی", "navigation": "گردگ", "and": " و", - "qbfind": "درگیزگ", + "qbfind": "ودی کورتین", "qbbrowse": "بروز", - "qbedit": "اصلاح", - "qbpageoptions": "صفحه", - "qbmyoptions": "منی صفحات", + "qbedit": "ایڈیٹ", + "qbpageoptions": "ای دیم", + "qbmyoptions": "منی دیمان", "faq": "ب.ج.س", "faqpage": "Project:ب.ج.س", "actions": "کاران", @@ -166,52 +167,53 @@ "help": "کمک", "search": "گردگ", "searchbutton": "گردگ", - "go": "برو", - "searcharticle": "برو", - "history": "تاریح صفحه", + "go": "برا", + "searcharticle": "برا", + "history": "دیمی تاریخ", "history_short": "تاریح", "updatedmarker": "په روچ بیتگین چه منی اهری اهری چارگ", "printableversion": "نسخه چهاپی", "permalink": "دایمی لینک", "print": "چهاپ", - "view": "چارگ", - "view-foreign": "بچار مان $1", - "edit": "اصلاح", - "edit-local": "لوکال دسکریپشنء اصلاح کن", - "create": "شرکتن", - "create-local": "لوکال دسکریپشنء هوار کن", - "editthispage": "ای صفحه اصلاح کن", - "create-this-page": "ای صفحه شرکتن کن", - "delete": "حذف", - "deletethispage": "ای صفحه حذف کن", - "undeletethispage": "ائ تاکء دلیت مکن", - "undelete_short": "حذف مکن {{PLURAL:$1|one edit|$1 edits}}", - "viewdeleted_short": "چارگ {{باز،زیاتیگ:$1|یکین حذف بوتگین اصلاح|$1 اصلاح کتگانء حذف بکن}}", - "protect": "حفاظت", - "protect_change": "عوض کن", - "protectthispage": "ای صفحه حفاظت کن", + "view": "دیستین", + "view-foreign": "بگیند بی $1", + "edit": "ایڈیٹ", + "edit-local": "لوکال دسکریپشنء ایڈیٹ کورتین", + "create": "جوڑ کورتین", + "create-local": "لوکال دسکریپشنء اڈ کورتین", + "editthispage": "ای دیما ایڈیٹ کورتین", + "create-this-page": "ای دیمی جوڑ کورتین", + "delete": "پاک کورتین", + "deletethispage": "ای دیمی پاک کورتین", + "undeletethispage": "ای دیما پاک مکن", + "undelete_short": "پاک مکن {{PLURAL:$1|one edit|$1 edits}}", + "viewdeleted_short": "نمایش داتین {{PLURAL:$1|یک پاک بوتینوکین ای\tڈیٹی |$1 پاک بوتینوکین ای\tڈیٹ}}", + "protect": "ساتیتین", + "protect_change": "بدل کورتین", + "protectthispage": "ای دیما بسات", "unprotect": "پروتکشنء ٹگل بدئ", "unprotectthispage": "ائ تاکء پروتکشنء ٹگل بدئ", - "newpage": "نوکین صفحه", - "talkpage": "ای صفحه بحث کن", + "newpage": "نوکین دیم", + "talkpage": "ای دیما بحث کن", "talkpagelinktext": "گپ کن", - "specialpage": "حاصین صفحه", + "specialpage": "هاسین دیم", "personaltools": "شخصی وسایل", "articlepage": "محتوا صفحه به گند", - "talk": "بحث", + "talk": "گپ", "views": "چارگان", "toolbox": "ابزار", "userpage": "به گند صفحه کاربر", "projectpage": "به گند صفحه", - "imagepage": "به چار فایل صفحه ءَ", - "mediawikipage": "به گند صفحه کوله", - "templatepage": "به گند صفحه تمپلت آ", - "viewhelppage": "به گند صفحه کمک آ", - "categorypage": "به گند صفحه دسته آ", + "imagepage": "بگیند پایلی دیما", + "mediawikipage": "بگیند پیامی دیما", + "templatepage": "بگیند تیملیتی دیما", + "viewhelppage": "بگیند کومکی دیما", + "categorypage": "بگیند کتیگوریی دیما", "viewtalkpage": "به گند بحث آ", - "otherlanguages": "ته دگر زبان", + "otherlanguages": "بی دگه زبانانی تا", "redirectedfrom": "(غیر مستقیم بوتگ چه $1)", "redirectpagesub": "صفحه غیر مستقیم", + "redirectto": "مسیری ٹگل داتین بی:", "lastmodifiedat": " $2, $1.ای صفحه اهری تغییر دهگ بیته", "viewcount": "ای صفحه دسترسی بیتگ {{PLURAL:$1|بار|$1رند}}.", "protectedpage": "صفحه محافظتی", @@ -233,8 +235,8 @@ "disclaimers": "بی میاری گیان", "disclaimerpage": "Project:عمومی بی میاریگان", "edithelp": "کمک اصلاح", - "mainpage": "صفحه اصلی", - "mainpage-description": "صفحه اصلی", + "mainpage": "بُنیادی دیم", + "mainpage-description": "بُنیادی دیم", "policy-url": "Project:سیاست", "portal": "پرتال انجمن", "portal-url": "Project:پرتال انجمن", @@ -253,10 +255,10 @@ "newmessageslinkplural": "{{PLURAL:$1|نوکین کله|999=نوکین کله هان}}", "newmessagesdifflinkplural": "$1 {{PLURAL:$1|ٹگل داتن|پهکین ٹگل}}", "youhavenewmessagesmulti": "شما را نوکین کوله یان هست ته $1", - "editsection": "اصلاح", - "editold": "اصلاح", + "editsection": "ایڈیٹ", + "editold": "ایڈیٹ", "viewsourceold": "به گند منبع ا", - "editlink": "اصلاح", + "editlink": "ایڈیٹ", "viewsourcelink": "چارگ منبع", "editsectionhint": ": $1اصلاح انتخاب", "toc": "محتوا", @@ -279,15 +281,15 @@ "page-atom-feed": "منبع \"$1\" Atom", "feed-atom": "اتم", "feed-rss": "ار اس اس", - "red-link-title": "$1 (هنگت نیستن)", + "red-link-title": "$1 (ای دیم وجود نداریت)", "sort-descending": "نزولی نز آرتن", "sort-ascending": "صعودی نز آرتن", - "nstab-main": "صفحه", - "nstab-user": "صفحه کاربر", - "nstab-media": "صفحه مدیا", + "nstab-main": "دیم یا تاک", + "nstab-user": "کار زوروکی دیم", + "nstab-media": "میڈیای دیم", "nstab-special": "حاصین صفحات", "nstab-project": "صفحه پروژه", - "nstab-image": "فایل", + "nstab-image": "پایل", "nstab-mediawiki": "کوله", "nstab-template": "تمپلت", "nstab-help": "صفحه کمک", @@ -353,7 +355,7 @@ "invalidtitle-knownnamespace": "نامهتبرین عنوان گون نامء جاگاه «$2» ءُ تکست «$3»", "invalidtitle-unknownnamespace": "نامهتبرین نام گون ناشناسین نامء جاگاه نمبر $1 ءُ تکست «$2»", "exception-nologin": "مان نبیتگ ات", - "exception-nologin-text": "دزبندی انت سیستمء تها [[Special:Userlogin|مان بئیت]] تانکه بتوان ات ائ تاکء بگند ات.", + "exception-nologin-text": "مهربانی بکنیت بی سامانه یی [[Special:Userlogin|لوگین بیبیت]] تا که بتوانیت بی ای دیما دسترسی داشته به ئیت.", "exception-nologin-text-manual": "دزبندی انت $1 تانکه شمارء پر ائ تاک یانکه اکشنء دزرس ببیت انت.", "virus-badscanner": "تنظیم بد: ناشناسین اسکنر ویروس: ''$1''", "virus-scanfailed": "اسکن پروش وارت(کد $1)", @@ -382,13 +384,13 @@ "nav-login-createaccount": "ورود/شرکتن حساب", "userlogin": "ورود/شرکتن حساب", "userloginnocreate": "لاگین", - "logout": "در بیگ", - "userlogout": "در بیگ", + "logout": "در بوتین", + "userlogout": "در بوتین", "notloggedin": "وارد نهت", "userlogin-noaccount": "شما رء اکانت نه انت؟", "userlogin-joinproject": "مان {{SITENAME}} ناملکی بکن ات!", "nologin": "حسابء نیستن؟ '''$1'''.", - "nologinlink": "شرکتن یک حساب", + "nologinlink": "یک حسابی جوڑ کورتین", "createaccount": "حساب شرکن", "gotaccount": "یک حساب الان هست؟'''$1'''.", "gotaccountlink": "ورود", @@ -403,6 +405,8 @@ "createacct-another-email-ph": "ایمیلء ادرسء بلک ات", "createaccountmail": "کارمرز چه وتکارین موقتین پسورد ءُ رندا آئی دیم داتن پر مالومین ایمیل", "createacct-realname": "شمئی اصلیگین نام (ایهتیاری)", + "createaccountreason": "دلیل:", + "createacct-reason": "دلیل:", "createacct-reason-ph": "پرچا شما ادگر نوکین اکانتء اڈ کن ات", "createacct-captcha": "سکیوریتی چک", "createacct-imgcaptcha-ph": "برزین سیاهگء ادان بلک ات", @@ -456,6 +460,7 @@ "createaccount-text": "یکی یک حساب په شمی آدرس ایمیل ته {{SITENAME}} گون نام ($4) \"$2\"، گون کلمه رمز \"$3\" شرکتت.\nشما بایدن وارد بیت و وتی کلمه رمز الان عوض کنیت.\n\nشما شاید ای پیام شموشیت اگه ای ای حساب گون حطا شر بوتت.", "login-throttled": "شما انیگ پر لاگین کتنء چنت بار جهد کتگ ات. دزبندی انت پیسر چه پدایین جهدء $1 موه بداریت.", "login-abort-generic": "شمئی لاگینء پکا نبیت - Aborted", + "login-migrated-generic": "شمی کاربرین حساب منتکل بوته ، و شمی کاربری نام دیگه ای ویکی تا وجود نداریت .", "loginlanguagelabel": "زبان: $1", "suspicious-userlogout": "شمئی لوٹ پر در شتن چه سیستمء رد بوت پرچا که چوش که پیداگ انت ائ لوٹ چه هرابین بروزر یانکه پراکسیء راهیگ بیتگ انت.", "createacct-another-realname-tip": "اصلیگین نام ایهتیاری انت.\nاگان آئرا بلک ات رهشونء درگتء پر شمئی سیاهگان چه اصلیگین نام کارمرز بیت انت.", @@ -548,7 +553,8 @@ "preview": "بازبین", "showpreview": "بازبین پیش دار", "showdiff": "تغییرات پیش دار", - "anoneditwarning": "'''هوژاری:''' شما وارد نه بیتگیت.\nشمی آی پی ته تاریح اصلاح ای صفحه ثبت بیت.", + "blankarticle": "هشتار: شما بی یک هالی دیمی جوڑ\t کورتینا ئالاتا ویت.\nاگه \"{{int:savearticle}}\" ها پدا کلیک کنیت، بدون مئتواین دیمی جوڑ\tا بیت .", + "anoneditwarning": "هشتار: شما لوگین نه بوته ایت . شمی آی پی نشانی په موچان دیستینی وڑ\tا بیت اگه هر \tٹگلی جوڑ\t بداریت . اگه [$1 لوگین بئیت] یا [$2 یک کاربرین حسابی جوڑ بکنیت]، شمی ایڈیت بی شمی کاربرین نام نسبت داته آ بینت، لوڑ گون دیگرین مزایایان .", "anonpreviewwarning": "''شما مان سیستمء لاگین نکتگ. ذخیره کتنء حالت شمئی آی‌پیء نشانیگ مان ائ پیجء هاپزگ سبت بیت انت.''", "missingsummary": "'''یادآوری:''' شما یک خلاصه چه اصلاح وارد نه کرت.\nاگر دگه کلیک کنیت ذخیره آ، شمی اصلاح به بی آی ذخیره بنت.", "missingcommenttext": "لطفا یک نظری وارد کنیت جهل آ", @@ -649,6 +655,7 @@ "content-model-text": "سادگین سیاهگ", "content-model-javascript": "جاوا اسکریپٹ", "content-model-css": "سی اس اس", + "duplicate-args-category": "آ دیمان که گٹ زورته بوته انت گون تکرارین دلیلان بی تماس تیمپلیتی تا", "expensive-parserfunction-warning": "هوژاری: ای صفحه شامل بازگین توار عملگر تجریه کنوک سنگیننت.\nآیی بایدن کمتر چه $2{{PLURAL:$2|توار|توار}}, داشته بیت ادان هنو $1 هست.", "expensive-parserfunction-category": " صفحات گونبازگین توار عملگر تجریه کنوک", "post-expand-template-inclusion-warning": "هوژاری: اندازه شامل تمپلت باز مزننت.\nلهتی تمپلتان هور نه بینت.", @@ -659,10 +666,10 @@ "parser-template-recursion-depth-warning": "محدودیت عمق تررگ رد بوت ($1)", "language-converter-depth-warning": "چه محدودیت عمق زبانانی کارمرز گؤست ات ($1)", "node-count-exceeded-category": "پیج انی که گیش چه مکسیمم تعداد گره بیتگ انت", - "node-count-exceeded-category-desc": "کتگوری پر پیج انی که مان آهان ساب کنوگ برزتر شتگ انت.", - "node-count-exceeded-warning": "پیج چه مکسیمم تعداد گره گیش شُت", + "node-count-exceeded-category-desc": "ای دیم شه ئادین ئالا گیشتیر مشکل داریت .", + "node-count-exceeded-warning": "دیم شه مکسیمم اندازه ها گیشتیر گره شُت", "expansion-depth-exceeded-category": "پیج انی که چه مکسیمم تچک کتنء امک (عمق) گیش شتگ انت", - "expansion-depth-exceeded-category-desc": "کتگری پر پیج انی که مان آهان تچک کتنء امک(عمق) گیش شتگ انت.", + "expansion-depth-exceeded-category-desc": "کتگوری په دیمان که آوانی تا پرش بوتینی جولی گیشتیر شُته گنت.", "expansion-depth-exceeded-warning": "پیج چه مکسیمم تچک کتنء امک(عمق) گیش شُت", "parser-unstrip-loop-warning": "حلقهء unstrip ودی بوت", "parser-unstrip-recursion-limit": "چه مکسیمم ارجاع مان دستور unstrip گیش شُت ات($1)", @@ -706,6 +713,7 @@ "rev-deleted-event": "(کار آمار زورگ بیتت)", "rev-deleted-user-contribs": "[یوزرنام یانکه یانکه آی پی ادرس هزپ بیتگ انت - ویرایش چیرداتگین مان هواربیتگان]", "rev-deleted-text-permission": "ائ ویرایش چه ائ پیج '''هزپ بیتگ انت'''.\nبلکین اطلاعات گون آئی همگرنچء مان [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} هزپانی سیاهگ] موجوت بیت انت.", + "rev-suppressed-text-permission": "ای ایڈیٹ شه ای دیما '''ڈیلیٹ بوته '''.\nشما توانیت آیرا بگیندیت ؛ ممکن اینت که آیی مربوتین مئلومات بی [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ڈیلیٹی سیاه چالگی] تا موجود بیت.", "rev-deleted-text-unhide": "ائ ویرایش چه ائ پیج '''هزپ بیتگ انت'''.\nبلکین اطلاعات گون آئی همگرنچء مان [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} هزپانی سیاهگ] موجوت بیت انت.\nشما هنچوش اگان بلوٹ ات توان ات [$1 ائ نسخگء بچار ات].", "rev-suppressed-text-unhide": "ائ ویرایش چه ائ پیج '''دیم داشت''' بوت.\nبلکین اطلاعات گون آئی همگرنچء مان [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} دیم داشتانی سیاهگ]. موجوت بیت انت.\nشما هنچوش اگان بلوٹ ات توان ات [$1 ائ نسخگء بچار ات].", "rev-deleted-text-view": "ائ ویرایش چه ائ پیج '''هزپ بیتگ انت'''.\nبلکین اطلاعات گون آئی همگرنچء مان [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} هزپانی سیاهگ]. موجوت بیت انت.", @@ -841,6 +849,7 @@ "searchall": "کل", "showingresults": "جهل پیش دارگنت تا {{PLURAL:$1|'''1'''نتیجه|'''$1''' نتایج}} شروع بنت گون #'''$2'''.", "showingresultsinrange": "پیش دارگ مان جهلء تان {{PLURAL:$1|1 نتیجگ|$1 نتیجگ}} in range #$2 تان #$3.", + "search-showingresults": "{{PLURAL:$4|نتایج $1 شه $3|نتایج $1 - $2 شه $3}}", "search-nonefound": "نتیجه هم دپ په درخواست نیست", "powersearch-legend": "گردگ پیشرفته", "powersearch-ns": "گردگ ته نام فضا آن", @@ -854,7 +863,7 @@ "preferences": "ترجیحات", "mypreferences": "ترجیحات", "prefs-edits": "تعداد اصلاحات:", - "prefsnologintext2": "دزبندی انت $1 پر ترجیحاتء تنظیم کتن.", + "prefsnologintext2": "منتوارون شمی که په ٹگل داتین تنزیماتانی هاتبرا لوگین بئیت .", "prefs-skin": "پوست", "skin-preview": "بازین", "datedefault": "هچ ترجیح", @@ -953,6 +962,7 @@ "prefs-tokenwatchlist": "نشانگ", "prefs-diffs": "پرک", "prefs-help-prefershttps": "ائ ترجیحء تاثیر رند چه شمئی رندی لاگینء کارمرز بیت انت.", + "prefswarning-warning": "شمی ٹگل داتینوکین ترجیئات تا انون زاپاس نه بوته انت .\nاگه ای دیم بدون شه کلیک کورتینا بی «$1» ایلا بیت شمی ترجیئات زاپاسا نه بیینت .", "prefs-tabs-navigation-hint": "بزان: شما توان ات چه چپی و راستی پیشداروکین بٹن ان پر حرکت زبانگ انی توکا مان زبانگانی لیست کارمرز بکن ات.", "email-address-validity-valid": "شمئی ایمیل ادرس پر درستی پیداگ انت", "email-address-validity-invalid": "مهتبرین ایمیل ادرسء بلک ات", @@ -1027,6 +1037,7 @@ "right-browsearchive": "گردگ صفحات حذفی", "right-undelete": "حذف مکن یک صفحه ایء", "right-suppressrevision": "بازبینی و ترینگ بازبینی آن پناهین چه مدیران سیستم", + "right-viewsuppressed": "دیستین آ نسهه هانی که شه کار زوروکان چیهر داته بوته انت", "right-suppressionlog": "به گند خصوصی آماران", "right-block": "دگ کابران چه اصلاح محدود کن", "right-blockemail": "یک کاربری چه ایمیل دیم دهگ منع کن", @@ -1124,7 +1135,7 @@ "recentchanges-label-plusminus": "تاکء سایز همگرنچ گون ائ بایت انی انداجگ ٹگل وارتگ انت", "recentchanges-legend-heading": "'''اختصاران:'''", "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (هنچوش پر [[Special:NewPages|نوکین تاکانء فهرست]] بچار ات)", - "rcnotefrom": "جهلیگء تغییرات چه $2 (تان $1 پیش دارگ بیتگ انت).", + "rcnotefrom": "بی جهلگا ٹگلان شه $3, $4 (تا $1 {{PLURAL:$5|نشان داته بوته انت|نشان داته بوته انت}}).", "rclistfrom": "پیش دار نوکین تغییراتآ چه $3 $2", "rcshowhideminor": "$1 هوردین تغییرات", "rcshowhideminor-show": "پیش دارگ", @@ -1172,10 +1183,11 @@ "reuploaddesc": "کنسل آپلودء و ترر په فرم آپلود", "upload-tryagain": "فایلء ٹگا وارتگین توضیحاتء راهیگ بکن ات", "uploadnologin": "وارد نهیت", - "uploadnologintext": "شما بایدن [[Special:UserLogin|واردبیت]] په آپلود کتن فایل.", + "uploadnologintext": "په اپلوڈ\t کورتین پایلی هاتیرا باید $1.", "upload_directory_missing": "مسیر آپلود ($1) گارنت و گون وب سرور شر گنگ نه بیت.", "upload_directory_read_only": "مسیر آپلود ($1) قابل نوشتن گون وب سرور نهنت.", "uploaderror": "حطا آپلود", + "upload-recreate-warning": "'''هشتار: پایلی بی ناما ڈ\tیلیت یا اینتیکال بوته .'''\n\nپه آسانی هاتیرا، ڈ\tیلیتی چالگ و انتیکالی دیم بی جهلگا آته :", "uploadtext": "چه جهلگین فرم په آپلود فایلان استفاده کنت.\nپه دیستن یا گشتن پیشگین آپلودی فایلان برو [[Special:FileList|لیست فایلان آپلودی]], آپلودان و حذفیات هنچو هستن ته [[Special:Log/upload|آمار آپلود]].\n\nپه وارد کتن فایل ته یک صفحه ای، چه لینک ته فرم استفاده کن\n* '''[[{{ns:file}}:File.png|200px|thumb|left|alt text]]''' په استفاده چه نسخه کامل فایل\n* '''[[{{ns:file}}:File.png|200px|thumb|left|alt text]]''' په استفاده چه ۲۰۰ پیکسل پهنات ته یک جعبه ته چپ\n* '''[[{{ns:media}}:File.ogg]]''' په مسیری لینک دهگ په فایل بی پیش دارگ فایل", "upload-permitted": "مجازین نوع فایل: $1.", "upload-preferred": "ترجیحی نوع فایل: $1.", @@ -1192,12 +1204,19 @@ "ignorewarnings": "هردابین هوژاری شموش", "minlength1": "نام فایل باید یک حرفی حداقل بیت", "illegalfilename": "نام فایل \"$1\" شامل کاراکترانی انت که مجاز نهنت ته ای عناوین صفحه.\nلطفا نام فایل بدل کنیت و دگه آپلود آزمایش کنیت.", + "filename-toolong": "پایلی نام نباید شه ۲۴۰ بایتا تچکتیر بیت .", "badfilename": "نام فایل عوض بوتت په \"$1\".", + "filetype-mime-mismatch": "پایلی پدوند «$1.‎» گون آیی MIME رکما ($2) متابیکت نداریت.", "filetype-badmime": "فایلان نوع مایم \"$1\" مجاز په آپلود بیگ نهنت.", "filetype-bad-ie-mime": "نه تونیت ای فایلءَ آپلود کنیت په چی که اینترنت ایکسپلورر آییءَ په دا ب \"$1\" جاه کاریت که شی غیرمجازین نوع فایلینت و حطرناک انت.", "filetype-unwanted-type": "'''\".$1\"' یک نه لوٹتگین نوع فایل انت. انواع فایل ترجیحی $2 انت.\nنوع ترجیحی {{PLURAL:$3|نوع فایلنت|انواع فایلان انت}} $2.", "filetype-banned-type": "'''\".$1\"''' یک نوع مجازی ان فایلی نهنت. مجازین {{PLURAL:$3|نوع فایل|انواع فایلان}} $2.", "filetype-missing": " (په داب \".jpg\").فایل هچ بندی نیست", + "empty-file": "پایلی که دیم داتیت هالی اینت.", + "file-too-large": "پایلی که دیم داته ایت باز ٹو اینت .", + "filename-tooshort": "پایلی نام بی شه اندازهگا گونڈ اینت.", + "filetype-banned": "ای رکمی پایل اجازه نداریت.", + "verification-error": "پایل شه تائید تستا در نه بوت.", "large-file": "توصیه بیت که فایلان مزنتر چه $1 مبنت;\nای فایل $2 انت.", "largefileserver": "ای فایل مزنتر چه حدی انت که سرور تنظیم بوتت په اجازه دهگ.", "emptyfile": "فایلی که شما آپلود کتت هالیک انت. شاید شی په خاطر اشتباه نه نام فایل بیت.\nلطفا کتنرل کنیت که آیا واقعا شما لوٹیت ای فایلء آپلود کنیت.", @@ -1217,14 +1236,23 @@ "php-uploaddisabledtext": "آپلود کتن فایل ته پی‌اچ‌پی فعال نهنت. تنظیم file_uploads کنترل کنیت.", "uploadscripted": "ای فایل شامل کد HTML یا اسکریپت انت که شاید گون وب بروزر اشتباهی وانگ بیت.", "uploadvirus": "فایل یک ویروسی داریتن! جزییات: $1", + "upload-source": "پرونده منبع", "sourcefilename": "منبع نام فایل:", + "sourceurl": "نشانی منبع:", "destfilename": "مقصد نام فایل", "upload-maxfilesize": "آهرین هد اندازه فایل : $1", + "upload-description": "توضیحات پرونده", + "upload-options": "گزینه‌های بارگذاری", "watchthisupload": "ای فایل بچار", "filewasdeleted": "یک فایلی گو ای نام پیشتر آپلود بوتت و رندا حذف بوت.\nشما بایدن کنترل کنیت $1 پیش چه شی که دگه آپلود کنیت.", "filename-bad-prefix": "نام فایلی که آپلود بیت شروع بیت گون '''\"$1\"''', که یک نام بی توضیحی هنچکا اتوماتیکی گون دوربین دیجیتال دهگ بوتت.\nلطفا یک تشریحی ترین نامی په وتی فایل بزرویت.", "filename-prefix-blacklist": "#
\n# Syntax is as follows:\n#   * Everything from a \"#\" character to the end of the line is a comment\n#   * Every non-blank line is a prefix for typical file names assigned automatically by digital cameras\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # some mobil phones\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #
", "upload-success-subj": "آپلود موفق", + "upload-success-msg": "بارگذاری شما از [$2] موفق بود. این پرونده در اینجا قابل دسترسی است: [[:{{ns:file}}:$1]]", + "upload-failure-subj": "مشکل در بارگذاری", + "upload-failure-msg": "مشکلی در بارگذاری شما از [$2] وجود داشت:\n\n$1", + "upload-warning-subj": "هشدار بارگذاری", + "upload-warning-msg": "فرم بارگذاری مشکلی داشت [$2]. شما می‌توانید به [[Special:Upload/stash/$1|فرم بارگذاری]] بازگردید تا این اشکال را رفع کنید.", "upload-proto-error": "اشتباه پروتوکل", "upload-proto-error-text": "آپلود دراین نیاز په URL آنی داریت که شروع بیت گون http:// یا ftp://.", "upload-file-error": "حطا درونی", @@ -1233,6 +1261,9 @@ "upload-misc-error-text": "یک ناشناسین حطا وهد آپلود کتن پیش آتک.\nلطفا تایید کنیت که URL معتبرانت و دسترسی بیت و دگه سعی کنیت.\nاگر مشکل ادامه داشت، گون [[Special:ListUsers/sysop|مدیر]]Ø¡ تماس گریت.", "upload-too-many-redirects": "ای لینک بازگین غیرمستقیم ی هستن", "upload-http-error": "یک ارور اچ‌تی‌تی‌پی پیش آتک : $1", + "upload-copy-upload-invalid-domain": "بارگذاری کپی پرونده‌ها از این دامنه امکان‌پذیر نیست.", + "backend-fail-stream": "نمی‌توان پروندهٔ $1 را ارسال کرد.", + "uploadstash": "اپلوڈی سٹاش", "upload-curl-error6": "نه تونیت په URL برسیت", "upload-curl-error6-text": "داتگین URL دسترسی نه بیت.\nلطفا دگه کنترل کنیت که URL درستنت و سایت په راه انت.", "upload-curl-error28": "وهد آپلود هلت", @@ -1253,6 +1284,8 @@ "listfiles_size": "اندازه", "listfiles_description": "توضیح", "listfiles_count": "نسخ", + "listfiles-latestversion-yes": "هان", + "listfiles-latestversion-no": "نه", "file-anchor-link": "فایل", "filehist": "تاریح فایل", "filehist-help": "اور تاریح/زمان کلیک کنیت دان فایلا په داب هما تاریح بگندیت", @@ -1334,9 +1367,13 @@ "statistics-users-active": "فعالین کاربر", "statistics-users-active-desc": "کاربرانی که ته پیشگین {{PLURAL:$1|روچ|$1 روچان}} کاری اش کتت", "statistics-mostpopular": "باز چار تگین صفحات", + "pageswithprop-submit": "برا", + "pageswithprop-prophidden-long": "جزییات مخفی متن طولانی ($1)", + "pageswithprop-prophidden-binary": "جزییات مقدار مخفی باینری ($1)", "doubleredirects": "دوبل غیر مستقیم", "doubleredirectstext": "ای صفحه لیست کنت صفحاتی که غیر مستقیم رونت په دگه صفحات. هر ردیف شامل لینکانی انت به اولی و دومی غیر مستقیم، و هدف دومی غیر مستقیم، که معمولا استفاده بیت \"real\" صفحه هدف، که بایدن اولی غیر مستقیم پیش داریت.", "double-redirect-fixed-move": "[[$1]] انتقال دهگ بوتت، و الان تغییر مسیری په [[$2]] انت", + "double-redirect-fixed-maintenance": "رفع خودکار تغییرمسیر دوتایی از [[$1]] به [[$2]] در روند نگهداری.", "double-redirect-fixer": "تعمیرکنوک غیر مستقیم", "brokenredirects": "پروشتگین غیر مستقیمان", "brokenredirectstext": "جهلیگین غیر مستقیم لینک بوتگن په صفحات نیستن:", @@ -1349,10 +1386,13 @@ "fewestrevisions": "صفحات گون کمترین بازبینی", "nbytes": "$1 {{PLURAL:$1|بایت|بایت}}", "ncategories": "$1 {{PLURAL:$1|دسته|دسته جات}}", + "ninterwikis": "$1 {{PLURAL:$1|میان‌ویکی|میان‌ویکی}}", "nlinks": "$1 {{PLURAL:$1|link|لینک}}", "nmembers": "$1 {{PLURAL:$1|member|اعضا}}", + "nmemberschanged": "$1 → $2 {{PLURAL:$2| عضو|عضو}}", "nrevisions": "$1 {{PLURAL:$1|بازبینی|بازبینی ان}}", "nviews": "$1 {{PLURAL:$1|دیستن|دیستن}}", + "nimagelinks": "$1 × $2, $3 {{PLURAL:$3|صفحه|صفحات}}", "specialpage-empty": "په ای گزارش هچ نتیجه ای نیست ان.", "lonelypages": "صفحات یتیم", "lonelypagestext": "جهلیگین صفحات چه دگه صفحات لینک یا داهل نه بوتگنت ته {{SITENAME}}.", @@ -1383,6 +1423,7 @@ "protectedpages-indef": "فقط محافظت نامحدود", "protectedpages-cascade": "محافظتان آبشاری فقط", "protectedpagesempty": "هچ صفحه ای گون ای پارامترآن", + "protectedpages-page": "دیم یا تاک", "protectedtitles": "عناوین محافظتی", "protectedtitlesempty": "هچ عنوانی هنو گو ای پارامتران محافظت نهنت.", "listusers": "لیست کاربر", @@ -1957,6 +1998,7 @@ "spam_reverting": "عوض کتن په آهری نسحه که شامل لینکان می بیت په $1", "spam_blanking": "کل بازبینی آن شامل لینکان په $1, بوتت هالیکی", "simpleantispam-label": "کنترل ضد اسپم.\nای شیء پر ''مکن''", + "pageinfo-category-info": "تهرِ مئلومات", "markaspatrolleddiff": "نشان کن په داب نظارت بوتگین", "markaspatrolledtext": "ای صفحه نشان کن په داب نظارت بوتگین", "markedaspatrolled": "نشاننت په داب نظارتی", @@ -1999,6 +2041,18 @@ "seconds-abbrev": "$1س", "minutes-abbrev": "$1م", "hours-abbrev": "$1ه", + "just-now": "همی انون", + "hours-ago": "$1 سائت دیمتیرا", + "minutes-ago": "$1 دکیکه دیمتیرا", + "seconds-ago": "$1 {{PLURAL:$1|سانیه|سانیه}} دیمتیرا", + "monday-at": "دوشمبی $1", + "tuesday-at": "سئه شمبی $1", + "wednesday-at": "چارشمبی $1", + "thursday-at": "پنج‌شمبی $1", + "friday-at": "جوما", + "saturday-at": "شمبی", + "sunday-at": "یک‌شمبی $1", + "yesterday-at": "زئ بی $1", "bad_image_list": "فرمت په داب جهلیگی انت:\n\nفقط ایتمان لیست چارگ بنت(خطانی که گون * شروع بنت).\nاولین لینک ته یک خط باید یک لینکی په یک بدین فایلی بیت.\nهر لینکی که کیت ته هما خط اسنثتا بینت.", "variantname-zh-hans": "هانس", "variantname-zh-hant": "هانت", @@ -2027,7 +2081,7 @@ "metadata-help": "ای فایل شامل مزیدین اطلاعاتنیت، شاید چه یک دوربین یا اسکنر په شرکتن و دیجیتالی کتن هور بیتت.\nاگه فایل چه اولیگین حالتی تغییر داته بوته شاید لهتی کل جزییات شر پیش مداریت.", "metadata-expand": "پیش دار گیشترین جزییات", "metadata-collapse": "پناه کن مزیدین جزییاتا", - "metadata-fields": "EXIF متادیتا فیلدان لسیت بوتگن ته ای کوله شامل بینت تع عکس صفحه پیش داریت وهخهدی کهجدول متادیتا is هراب بیت.\nدگران پناه بنت په طور پیش فرض.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude", + "metadata-fields": "EXIF متادیتا فیلدان لسیت بوتگن ته ای کوله شامل بینت تع اکس صفحه پیش داریت وهخهدی کهجدول متادیتا is هراب بیت.\nدگران پناه بنت په طور پیش فرض.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude", "exif-imagewidth": "پهنات", "exif-imagelength": "بلندی", "exif-bitspersample": "بیت ته جز", @@ -2142,6 +2196,14 @@ "exif-gpsareainformation": "نام منطقه جی پی اس", "exif-gpsdatestamp": "تاریح جی پی اس", "exif-gpsdifferential": "اصلاح متفاوت جی پی اس", + "exif-countrydest": "نشان داته بوته گین ملک", + "exif-countrycodedest": "نشان داته بوته گین ملکِ کود", + "exif-provinceorstatedest": "نشان داته بوته گین ولایت یا ایالت", + "exif-citydest": "نشان داته بوته گین شار", + "exif-sublocationdest": "نشان داته بوته گین مئل", + "exif-writer": "نویسوک", + "exif-languagecode": "زبان", + "exif-iimcategory": "تهر", "exif-compression-1": "کمپرس نه بوتت", "exif-compression-6": "جیی پی ای جی", "exif-photometricinterpretation-2": "آی جی بی", @@ -2454,8 +2516,9 @@ "revdelete-unrestricted": "به زور چه مدیران سیستم محدودیتان", "rightsnone": "(هچ یک)", "revdelete-summary": "خلاصه اصلاح", + "limitreport-templateargumentsize": "تراشوانِ ارگومینت اندازه", "expandtemplates": "پچ کن تمپلیت آنء", - "expand_templates_intro": "ای صفحه حاص لهتی متنء گریت و کل تمپلتان ته آییء برگشتی مزنش کنت.\nآیی هنچوش عمگر تجزیه کنوکء مزن کنت په داب\n{{#language:…}}, و متغییرانی په داب\n{{CURRENTDAY}}— در حقیقت هر چیزی که ته دو براکتن.\nآیی ای کارء گون توار کنگ تجزیه کنوک مناسب چه مدیا وی کی وت انجام دنت.", + "expand_templates_intro": "ای تاک حاص لهتی متنء گریت و کل تمپلتان ته آییء برگشتی مزنش کنت.\nآیی هنچوش عمگر تجزیه کنوکء مزن کنت په داب\n{{#language:…}}, و متغییرانی په داب\n{{CURRENTDAY}}— در حقیقت هر چیزی که ته دو براکتن.\nآیی ای کارء گون توار کنگ تجزیه کنوک مناسب چه مدیا وی کی وت انجام دنت.", "expand_templates_title": "عنوان متن په {{FULLPAGENAME}} و دگه.:", "expand_templates_input": "ورودی متن", "expand_templates_output": "نتیجه", diff --git a/languages/i18n/be-tarask.json b/languages/i18n/be-tarask.json index 170dd9d5c9..57f89be70a 100644 --- a/languages/i18n/be-tarask.json +++ b/languages/i18n/be-tarask.json @@ -658,6 +658,8 @@ "content-model-text": "просты тэкст", "content-model-javascript": "JavaScript", "content-model-css": "CSS", + "duplicate-args-category": "Старонкі, на якіх у шаблёнах выкарыстоўваюцца парамэтры-дублікаты", + "duplicate-args-category-desc": "Старонкі, якія ўтрымліваюць шаблёны з парамэтрамі-дублікатамі, напрыклад, {{foo|bar=1|bar=2}} або {{foo|bar|1=baz}}.", "expensive-parserfunction-warning": "Папярэджаньне: гэтая старонка ўтрымлівае зашмат працаёмістых зваротаў да функцыяў парсэра.\n\nПавінна быць ня болей за $2 {{PLURAL:$2|зварот|звароты|зваротаў}}, а цяпер ўтрымліваецца {{PLURAL:$1|$1 зварот|$1 звароты|$1 зваротаў}}.", "expensive-parserfunction-category": "Старонкі, якія ўтрымліваюць зашмат працаёмістых зваротаў да функцыяў парсэра", "post-expand-template-inclusion-warning": "Папярэджаньне: Памер уключаемых шаблёнаў занадта вялікі.\nНекаторыя шаблёны ня будуць уключаныя.", @@ -943,7 +945,7 @@ "gender-female": "Яна рэдагуе вікістаронкі", "prefs-help-gender": "Вызначаць гэта неабавязкова.\nАпраграмаваньне выкарыстоўвае гэтае значэньне толькі для граматычна карэктнага звароту да вас.\nГэтая інфармацыя будзе агульнадаступнай.", "email": "Электронная пошта", - "prefs-help-realname": "Сапраўднае імя паведамляць неабавязкова.\nКалі Вы яго пазначыце, яно будзе выкарыстоўвацца для пазначэньня Вашай працы.", + "prefs-help-realname": "Сапраўднае імя паведамляць неабавязковае.\nКалі Вы яго пазначыце, яно можа быць выкарыстанае для пазначэньня Вашай працы.", "prefs-help-email": "Адрас электроннай пошты неабавязковы, але ён дае магчымасьць даслаць Вам пароль, калі Вы забылі яго.", "prefs-help-email-others": "Вы можаце таксама дазволіць іншым удзельнікам кантактаваць з Вамі праз Вашую асабістую старонку гутарак безь неабходнасьці раскрыцьця адрасу электроннай пошты.", "prefs-help-email-required": "Патрабуецца адрас электроннай пошты.", @@ -2235,6 +2237,7 @@ "tooltip-feed-atom": "Atom-стужка для гэтай старонкі", "tooltip-t-contributions": "Паказаць унёсак гэтага удзельніка/гэтай удзельніцы", "tooltip-t-emailuser": "Даслаць ліст гэтаму ўдзельніку/гэтай удзельніцы па электроннай пошце", + "tooltip-t-info": "Болей інфармацыі пра гэтую старонку", "tooltip-t-upload": "Загрузіць файл", "tooltip-t-specialpages": "Сьпіс усіх спэцыяльных старонак", "tooltip-t-print": "Вэрсія гэтай старонкі для друку", @@ -2853,6 +2856,7 @@ "unknown_extension_tag": "Невядомы тэг пашырэньня «$1»", "duplicate-defaultsort": "Папярэджаньне: Ключ сартыроўкі па змоўчваньні «$2» замяняе папярэдні ключ сартыроўкі па змоўчваньні «$1».", "duplicate-displaytitle": "Папярэджаньне: назва для адлюстраваньня «$2» перапісвае ранейшую назву для адлюстраваньня «$1».", + "invalid-indicator-name": "Памылка: атрыбут name індыкатараў статусу старонкі ня мусіць быць пустым.", "version": "Вэрсія", "version-extensions": "Усталяваныя пашырэньні", "version-skins": "Усталяваныя тэмы афармленьня", diff --git a/languages/i18n/ca.json b/languages/i18n/ca.json index 06edf40c2f..849cc4c1cc 100644 --- a/languages/i18n/ca.json +++ b/languages/i18n/ca.json @@ -973,7 +973,7 @@ "gender-female": "Femení", "prefs-help-gender": "Opcional: s'usa perquè el programari se us adreci amb missatges amb el gènere adient. Aquesta informació serà pública.", "email": "Correu electrònic", - "prefs-help-realname": "* Nom real (opcional): si escolliu donar aquesta informació es utilitzarà per a donar-vos l’atribució de la vostra feina.", + "prefs-help-realname": "El nom real és opcional.\nSi escolliu donar aquesta informació, s'utilitzarà per a donar-vos l'atribució del vostre treball.", "prefs-help-email": "L'adreça electrònica és opcional, però permet l'enviament d'una nova contrasenya en cas que oblideu l'actual.", "prefs-help-email-others": "També podeu optar per deixar que els altres contactin amb vós a través de la pàgina personal de discussió, sense necessitat de desvetllar la vostra identitat.", "prefs-help-email-required": "Cal una adreça de correu electrònic.", @@ -1599,6 +1599,8 @@ "pager-older-n": "{{PLURAL:$1|anterior|$1 anteriors}}", "suppress": "Oversight", "querypage-disabled": "Aquesta pàgina especial està desactivada per a no perjudicar el rendiment.", + "apihelp": "Ajuda de l'API", + "apihelp-no-such-module": "No s'ha trobat el mòdul \"$1\".", "booksources": "Obres de referència", "booksources-search-legend": "Cerca fonts de llibres", "booksources-search": "Cerca", diff --git a/languages/i18n/ckb.json b/languages/i18n/ckb.json index 4bade64ade..b5abb6b3ad 100644 --- a/languages/i18n/ckb.json +++ b/languages/i18n/ckb.json @@ -235,8 +235,8 @@ "mainpage": "دەستپێک", "mainpage-description": "دەستپێک", "policy-url": "Project: سیاسەت", - "portal": "دەروازەی بەکارھێنەران", - "portal-url": "Project: دەروازەی بەکارھێنەران", + "portal": "دەروازەی کۆمەڵگا", + "portal-url": "Project:دەروازەی کۆمەڵگا", "privacy": "سیاسەتی تایبەتێتی", "privacypage": "Project:پاراستنی زانیارییەکان", "badaccess": "ھەڵە لە بە دەست ھێنان", diff --git a/languages/i18n/cs.json b/languages/i18n/cs.json index bf1e5821cb..43fe809dfc 100644 --- a/languages/i18n/cs.json +++ b/languages/i18n/cs.json @@ -671,6 +671,8 @@ "content-model-text": "čistý text", "content-model-javascript": "JavaScript", "content-model-css": "CSS", + "duplicate-args-category": "Stránky s duplicitními argumenty ve voláních Å¡ablon", + "duplicate-args-category-desc": "Stránka obsahuje volání Å¡ablony, které používá duplicitní argumenty, např. {{foo|bar=1|bar=2}} nebo {{foo|bar|1=baz}}.", "expensive-parserfunction-warning": "'''Varování:''' Tato stránka obsahuje příliÅ¡ mnoho volání výkonnostně náročných funkcí syntaktického analyzátoru.\n\nPovolený limit je $2, v současné chvíli vÅ¡ak {{PLURAL:$1|zde jedno volání je|zde jsou $1 volání|zde je $1 volání}}.", "expensive-parserfunction-category": "Stránky s příliÅ¡ mnoho voláními náročných funkcí syntaktického analyzátoru", "post-expand-template-inclusion-warning": "Varování: Objem vkládaných Å¡ablon je příliÅ¡ velký.\nNěkteré Å¡ablony nebudou vloženy.", @@ -956,7 +958,7 @@ "gender-female": "Ona upravila článek.", "prefs-help-gender": "Toto nastavení je nepovinné.\nSoftware ho používá pro volbu gramatického rodu, když vás oslovuje nebo vás zmiňuje.\nTato informace je veřejná.", "email": "E-mail", - "prefs-help-realname": "Skutečné jméno je nepovinné.\nPokud se ho rozhodnete uvést, bude použito pro označení autorství vaší práce.", + "prefs-help-realname": "Skutečné jméno je nepovinné.\nPokud ho uvedete, může být použito pro označení autorství vaší práce.", "prefs-help-email": "Uvedení e-mailu není povinné, ale umožní zaslání nového hesla v případě, že své heslo zapomenete.", "prefs-help-email-others": "Také můžete dovolit ostatním uživatelům vás prostřednictvím uživatelské stránky kontaktovat.\nVaÅ¡e adresa v takovém případě není prozrazena.", "prefs-help-email-required": "Je vyžadována e-mailová adresa.", @@ -1666,7 +1668,7 @@ "noindex-category-desc": "Stránka není indexována roboty, protože obsahuje kouzelné slovo __NOINDEX__ a je ve jmenném prostoru, ve kterém je tento příznak dovolen.", "index-category-desc": "Stránka obsahuje kouzelné slovo __INDEX__ (a je ve jmenném prostoru, ve kterém je tento příznak dovolen), takže je indexována roboty, přestože by normálně nebyla.", "post-expand-template-inclusion-category-desc": "Stránka je po rozbalení vÅ¡ech Å¡ablon větší než $wgMaxArticleSize, takže některé Å¡ablony rozbaleny nebyly.", - "post-expand-template-argument-category-desc": "Stránka je po rozbalení argumentu Å¡ablony (něco v trojitých závorkách, např. {{{Foo}}}) větší než $wgMaxArticleSize.", + "post-expand-template-argument-category-desc": "Stránka je po rozbalení argumentu Å¡ablony (něco v trojitých závorkách, např. {{{Foo}}}) větší než $wgMaxArticleSize.", "expensive-parserfunction-category-desc": "Stránka používá příliÅ¡ mnoho náročných funkcí syntaktického analyzátoru (jako #ifexist). Vizte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", "broken-file-category-desc": "Stránka obsahuje nefunkční odkaz na soubor (odkaz pro vložení souboru, který neexistuje).", "hidden-category-category-desc": "Kategorie ve svém textu obsahuje __HIDDENCAT__, což způsobuje, že se na stránkách implicitně nezobrazuje v rámečku odkazů na kategorie.", diff --git a/languages/i18n/de.json b/languages/i18n/de.json index e51aaa1d4e..7417532230 100644 --- a/languages/i18n/de.json +++ b/languages/i18n/de.json @@ -404,7 +404,8 @@ "viewsourcetext": "Du kannst den Quelltext dieser Seite betrachten und kopieren:", "viewyourtext": "Du kannst den Quelltext '''deiner Bearbeitung''' dieser Seite betrachten und kopieren:", "protectedinterface": "Diese Seite enthält Text für die Benutzeroberfläche der Software auf diesem Wiki und ist geschützt, um Missbrauch vorzubeugen.\nNutze bitte [//translatewiki.net/ translatewiki.net], das Lokalisierungsprojekt von MediaWiki, um Übersetzungen für alle Wikis hinzuzufügen oder zu ändern.", - "editinginterface": "'''Warnung:''' Diese Seite enthält von der MediaWiki-Software genutzten Text.\nÄnderungen auf dieser Seite wirken sich auf die Benutzeroberfläche dieses Wikis aus.\nNutze bitte [//translatewiki.net/ translatewiki.net], das Lokalisierungsprojekt von MediaWiki, um Übersetzungen für alle Wikis hinzuzufügen oder zu ändern.", + "editinginterface": "Warnung: Diese Seite enthält von der MediaWiki-Software genutzten Text.\nÄnderungen auf dieser Seite wirken sich auf die Benutzeroberfläche dieses Wikis aus.", + "translateinterface": "Um Übersetzungen für alle Wikis hinzuzufügen oder zu ändern, verwende bitte [//translatewiki.net/ translatewiki.net], das MediaWiki-Lokalisierungsprojekt.", "cascadeprotected": "Diese Seite ist zur Bearbeitung gesperrt. Sie ist in die {{PLURAL:$1|folgende Seite|folgenden Seiten}} eingebunden, die mittels der Kaskadensperroption geschützt {{PLURAL:$1|ist|sind}}:\n$2", "namespaceprotected": "Du hast nicht die erforderliche Berechtigung, um Seiten im Namensraum '''$1''' bearbeiten zu können.", "customcssprotected": "Du hast nicht die Berechtigung, diese CSS enthaltende Seite zu bearbeiten, da sie die persönlichen Einstellungen eines anderen Benutzers enthält.", @@ -721,6 +722,8 @@ "content-model-text": "Klartext", "content-model-javascript": "JavaScript", "content-model-css": "CSS", + "duplicate-args-category": "Seiten, die doppelte Argumente in Vorlagenaufrufe verwenden", + "duplicate-args-category-desc": "Die Seite enthält Vorlagenaufrufe, die Duplikate von Argumenten verwenden, wie {{foo|bar=1|bar=2}} oder {{foo|bar|1=baz}}.", "expensive-parserfunction-warning": "'''Achtung:''' Diese Seite enthält zu viele Aufrufe aufwändiger Parserfunktionen.\n\nSie darf nicht mehr als $2 {{PLURAL:$2|Aufruf|Aufrufe}} haben, es {{PLURAL:$1|ist aktuell $1 Aufruf|sind aktuell $1 Aufrufe}}.", "expensive-parserfunction-category": "Seiten, die aufwändige Parserfunktionen zu oft aufrufen", "post-expand-template-inclusion-warning": "Warnung: Die Größe eingebundener Vorlagen ist zu groß, einige Vorlagen können nicht eingebunden werden.", @@ -1008,7 +1011,7 @@ "gender-female": "Ich bin weiblich", "prefs-help-gender": "Dies ist eine freiwillige Angabe.\nDie Software nutzt sie, um dich anzureden sowie als Hinweis für andere durch Verwendung des zutreffenden grammatikalischen Geschlechts.\nDiese Information ist öffentlich.", "email": "E-Mail", - "prefs-help-realname": "Dies ist eine freiwillige Angabe. Damit kann dein bürgerlicher Name deinen Beiträgen zugeordnet werden.", + "prefs-help-realname": "Der bürgerliche Name ist optional.\nFalls angegeben, kann er verwendet werden, um dir eine Zuordnung für deine Beiträge zu geben.", "prefs-help-email": "Die Angabe einer E-Mail-Adresse ist optional, ermöglicht aber die Zusendung eines Ersatzpasswortes, sofern du dein Passwort vergessen hast.", "prefs-help-email-others": "Mit anderen Benutzern kannst du auch über die Benutzerdiskussionsseiten Kontakt aufnehmen, ohne dass du deine Identität offenlegen musst.", "prefs-help-email-required": "Es wird eine gültige E-Mail-Adresse benötigt.", @@ -2935,6 +2938,7 @@ "unknown_extension_tag": "Unbekanntes Parsertag „$1“", "duplicate-defaultsort": "Achtung: Der Sortierungsschlüssel „$2“ überschreibt den vorher verwendeten Schlüssel „$1“.", "duplicate-displaytitle": "Warnung: Der Anzeigetitel „$2“ überschreibt den früheren Anzeigetitel „$1“.", + "invalid-indicator-name": "Fehler: Das Attribut name des Seitenstatusindikators darf nicht leer sein.", "version": "Version", "version-extensions": "Installierte Erweiterungen", "version-skins": "Installierte Benutzeroberflächen", diff --git a/languages/i18n/egl.json b/languages/i18n/egl.json index 3b33a5e3eb..5578204ba1 100644 --- a/languages/i18n/egl.json +++ b/languages/i18n/egl.json @@ -322,8 +322,8 @@ "no-null-revision": "An pōl èser fât 'na versiòun mìa vâlida per la pàgina \"$1\"", "badtitle": "Tétol mìa curèt.", "badtitletext": "Al tétol ed la pàgina serchêda l'é vōd, şbaliê opór al deşvîn da 'n erōr int i colegamèint di côdis o int i colegamèint druvê in wiki. In pió al pré avèir ûn o pió carâter ch'an pōlen mìa èser druvê int i tétol.", - "perfcached": "Al j infurmasiòun ché sòta vînen registrêdi int la \"cache\" dal databêş e an pōlen mìa èser arnuvê. Int la \"cache\" a gh'é un mâsim ed {{PLURAL:$1|un rişultêt |$1 rişultêt}} ch' es pōl/en druvêr.", - "perfcachedts": "Al j infurmasiòun ché sòta vînen registrêdi int la \"cache\" dal databêş e l'ûltma vôlta l' è stê arnuvê al $ 1. Int la \"cache\" a gh'é un mâsim ed {{PLURAL:$4|un rişultêt |$4 rişultêt}} ch' es pōl/en druvêr.", + "perfcached": "Al j infurmasiòun ché sòta vînen registrêdi int la \"cache\" dal databêş e an pōlen mìa èser arnuvê. Int la \"cache\" a gh'é un mâsim ed {{PLURAL:$1|un rişultêt |$1 rişultêt}} ch' es pōlen druvêr.", + "perfcachedts": "Al j infurmasiòun ché sòta vînen registrêdi int la cache dal databêş e l'ûltma vôlta l' è stê arnuvê al $1. Int la cache a gh'é un mâsim ed {{PLURAL:$4|un rişultêt |$4 rişultêt}} ch' es pōlen druvêr.", "querypage-no-updates": "J arnuvamèint ed la pàgina în p'r al mumèint fērom. Al j infurmasiòun dèinter a la pàgina a gnirân mia arnuvêdi.", "viewsource": "Guêrda la surzéia", "viewsource-title": "Guêrda la surzéia 'd $1", @@ -838,7 +838,7 @@ "searchrelated": "coleghê", "searchall": "tót", "showingresults": "Ed sègvit {{PLURAL:$1|a vîn preşentê al mâsim 1 rişultêt| a vînen preşentê al mâsim $1 rişultêt}} a partîr dal nómer #$2.", - "showingresultsinrange": "{{PLURAL:$1|A vîn mustrê| a vînen mustrê}} sòta {{PLURAL:$1|1 rişultêt|$1 rişultêt}} dal #$2 al #$3.", + "showingresultsinrange": "{{PLURAL:$1|Sòt a vîn mustrê| Sòt a vînen mustrê}} {{PLURAL:$1|1 rişultêt|$1 rişultêt}} dal $2 al $3.", "search-showingresults": "{{PLURAL:$4|Rişultêt $1 ed $3|Rişultêt $1 - $2 ed $3}}", "search-nonefound": "La sērca an n'à mìa dê di rişultê.", "powersearch-legend": "Sèirca specêla", @@ -931,7 +931,7 @@ "gender-female": "L'é registrêda in sém a {{SITENAME}}", "prefs-help-gender": "L'impustasiòun ed cla preferèinsa ché l'é a siēlta. Al progrâma al drōva cól valōr ché per parlêr cun tè e numinêret cun chiêter cun al druvêr al gèner ed gramâtica gióst. Cl'infurmasiòun ché la srà póblica.", "email": "E-mail", - "prefs-help-realname": "Druvêr al nòm vèira l'é 'na siēlta personêla; s' es pèinsa 'd druvêrel al gnirâ uşê per dêr la paternitê di lavōr spidî.", + "prefs-help-realname": "Al nòm vèira l'é da druvêr a piaşèir. Se druvê, al pōl èser uşê per dêr la paternitê al lavōr fât.", "prefs-help-email": "Mèter l'indéris ed la tó pôsta eletrônica an n'é mia necesâri, mó al permèt ed ricêver la cêva 'd ingrès se per chêş ét la scurdés.", "prefs-help-email-others": "Ét pō ânca sernîr ed lasêr che chiêter a 's mèten in cuntât tēgh cun la pôsta eletrônica cun al colegamèint da la tó pàgina utèint o da còla 'd discusiòun. Al tó indirés al vîn mìa fât savèir a quî ch'ét 's mèten in cuntât tēgh.", "prefs-help-email-required": "L'indirés ed pôsta eletrônica l'é ubligatôri.", diff --git a/languages/i18n/en.json b/languages/i18n/en.json index 9aa05f3c3c..e81131e7bb 100644 --- a/languages/i18n/en.json +++ b/languages/i18n/en.json @@ -346,7 +346,8 @@ "viewsourcetext": "You can view and copy the source of this page:", "viewyourtext": "You can view and copy the source of your edits to this page:", "protectedinterface": "This page provides interface text for the software on this wiki, and is protected to prevent abuse.\nTo add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.", - "editinginterface": "Warning: You are editing a page that is used to provide interface text for the software.\nChanges to this page will affect the appearance of the user interface for other users on this wiki.\nTo add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.", + "editinginterface": "Warning: You are editing a page that is used to provide interface text for the software.\nChanges to this page will affect the appearance of the user interface for other users on this wiki.", + "translateinterface": "To add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.", "cascadeprotected": "This page has been protected from editing because it is included in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the \"cascading\" option turned on:\n$2", "namespaceprotected": "You do not have permission to edit pages in the $1 namespace.", "customcssprotected": "You do not have permission to edit this CSS page because it contains another user's personal settings.", @@ -1528,7 +1529,6 @@ "statistics-summary": "", "statistics-header-pages": "Page statistics", "statistics-header-edits": "Edit statistics", - "statistics-header-views": "View statistics", "statistics-header-users": "User statistics", "statistics-header-hooks": "Other statistics", "statistics-articles": "Content pages", @@ -1537,13 +1537,9 @@ "statistics-files": "Uploaded files", "statistics-edits": "Page edits since {{SITENAME}} was set up", "statistics-edits-average": "Average edits per page", - "statistics-views-total": "Views total", - "statistics-views-total-desc": "Views to non-existing pages and special pages are not included", - "statistics-views-peredit": "Views per edit", "statistics-users": "Registered [[Special:ListUsers|users]]", "statistics-users-active": "Active users", "statistics-users-active-desc": "Users who have performed an action in the last {{PLURAL:$1|day|$1 days}}", - "statistics-mostpopular": "Most viewed pages", "statistics-footer": "", "pageswithprop": "Pages with a page property", "pageswithprop-summary": "", @@ -1596,8 +1592,6 @@ "unusedcategories-summary": "", "unusedimages": "Unused files", "unusedimages-summary": "", - "popularpages": "Popular pages", - "popularpages-summary": "", "wantedcategories": "Wanted categories", "wantedcategories-summary": "", "wantedpages": "Wanted pages", @@ -2529,7 +2523,6 @@ "pageinfo-robot-policy": "Indexing by robots", "pageinfo-robot-index": "Allowed", "pageinfo-robot-noindex": "Disallowed", - "pageinfo-views": "Number of views", "pageinfo-watchers": "Number of page watchers", "pageinfo-few-watchers": "Fewer than $1 {{PLURAL:$1|watcher|watchers}}", "pageinfo-redirects-name": "Number of redirects to this page", @@ -3235,6 +3228,7 @@ "unknown_extension_tag": "Unknown extension tag \"$1\"", "duplicate-defaultsort": "Warning: Default sort key \"$2\" overrides earlier default sort key \"$1\".", "duplicate-displaytitle": "Warning: Display title \"$2\" overrides earlier display title \"$1\".", + "invalid-indicator-name": "Error: Page status indicators' name attribute must not be empty.", "version": "Version", "version-summary": "", "version-extensions": "Installed extensions", diff --git a/languages/i18n/et.json b/languages/i18n/et.json index bfe82f48e2..27751637a7 100644 --- a/languages/i18n/et.json +++ b/languages/i18n/et.json @@ -952,7 +952,7 @@ "gender-female": "Naine", "prefs-help-gender": "Selle eelistuse määramine on valikuline.\nTarkvara kasutab valitud väärtust mõnes keeles, et pöörduda sinu poole ja mainida sind teistele, kasutades soole vastavat sõna või sõnavormi.\nSee teave on avalik.", "email": "E-post", - "prefs-help-realname": "Vabatahtlik. Kui otsustad päris nime avaldada, kasutatakse seda sinu kaastöö seostamiseks sinuga.", + "prefs-help-realname": "Tegelik nimi on valikuline.\nKui avaldatud, võidakse seda kasutada sinu kaastöö seostamiseks sinuga.", "prefs-help-email": "E-posti aadressi sisestamine pole kohustuslik, kuid võimaldab sul tellida parooli meeldetuletuse, kui peaksid oma parooli unustama.", "prefs-help-email-others": "Võid ka paluda teistel sinu kasutaja- või aruteluleheküljel sinuga ühendust võtta, selle asemel, et peaksid oma isikuandmeid avaldama.", "prefs-help-email-required": "E-posti aadress on vajalik.", @@ -1577,6 +1577,8 @@ "pager-older-n": "{{PLURAL:$1|vanem 1|vanemad $1}}", "suppress": "Varjamine", "querypage-disabled": "See erilehekülg on keelatud, et jõudlust hoida.", + "apihelp": "API abi", + "apihelp-no-such-module": "Moodulit \"$1\" ei leitud.", "booksources": "Raamatuotsimine", "booksources-search-legend": "Raamatuotsimine", "booksources-search": "Otsi", @@ -2210,6 +2212,7 @@ "tooltip-pt-mycontris": "Sinu kaastööde loend", "tooltip-pt-login": "Me julgustame teid sisse logima, kuid see pole kohustuslik.", "tooltip-pt-logout": "Logi välja", + "tooltip-pt-createaccount": "See pole küll kohustuslik, aga sul tasub konto luua ja sisse logida.", "tooltip-ca-talk": "Selle artikli arutelu", "tooltip-ca-edit": "Sa saad seda lehekülge muuta. Palun kasuta enne salvestamist eelvaadet.", "tooltip-ca-addsection": "Lisa uus alaosa", @@ -2239,6 +2242,7 @@ "tooltip-feed-atom": "Selle lehekülje Atom-voog", "tooltip-t-contributions": "Kuva selle kasutaja kaastöö", "tooltip-t-emailuser": "Saada sellele kasutajale e-kiri", + "tooltip-t-info": "Lisateave selle lehekülje kohta", "tooltip-t-upload": "Laadi faile üles", "tooltip-t-specialpages": "Erilehekülgede loend", "tooltip-t-print": "Selle lehe trükiversioon", diff --git a/languages/i18n/fi.json b/languages/i18n/fi.json index 88ce0c7d01..6cf1027d48 100644 --- a/languages/i18n/fi.json +++ b/languages/i18n/fi.json @@ -687,6 +687,7 @@ "content-model-text": "pelkkä teksti", "content-model-javascript": "JavaScript", "content-model-css": "CSS", + "duplicate-args-category": "Sivut, jotka käyttävät kaksinkertaisia argumentteja mallinekutsuissa", "expensive-parserfunction-warning": "Tällä sivulla on liian monta hitaiden laajennusfunktioiden kutsua.\nKutsuja pitäisi olla alle $2 {{PLURAL:$2|kappale|kappaletta}}, mutta nyt niitä on $1 {{PLURAL:$1|kappale|kappaletta}}.", "expensive-parserfunction-category": "Sivut, joissa on liian monta vaativaa jäsenninfunktiota", "post-expand-template-inclusion-warning": "'''Varoitus:''' Sisällytettyjen mallineiden koko on liian suuri.\nJoitakin mallineita ei ole sisällytetty.", @@ -880,7 +881,7 @@ "searchall": "kaikki", "showingresults": "Alla on vain {{PLURAL:$1|1 hakutulos|$1 hakutulosta}} alkaen tuloksesta nro $2.", "showingresultsinrange": "Alla näytetään {{PLURAL:$1|1 tulos|$1 tulosta}} väliltä $2 – $3.", - "search-showingresults": "{{PLURAL:$4|Tulos $1 enimmäismäärästä $3|Tulokset $1 - $2 enimmäismäärästä $3}}", + "search-showingresults": "{{PLURAL:$4|Tulos $1 enimmäismäärästä $3|Tulokset $1 – $2 enimmäismäärästä $3}}", "search-nonefound": "Hakusi ei tuottanut tulosta.", "powersearch-legend": "Laajennettu haku", "powersearch-ns": "Hae nimiavaruuksista:", @@ -972,7 +973,7 @@ "gender-female": "Nainen", "prefs-help-gender": "Tämän asetuksen määrittäminen on vapaaehtoista.\nOhjelmisto käyttää annettua arvoa viitaten sinuun oikealla kieliopillisella suvulla.\nTämä tieto on julkinen.", "email": "Sähköpostitoiminnot", - "prefs-help-realname": "Oikean nimen ilmoittaminen on vapaaehtoista.\nJos annat sen, sitä voidaan käyttää kertomaan, kuka on tehnyt muokkauksesi.", + "prefs-help-realname": "Oikean nimen ilmoittaminen on vapaaehtoista.\nJos ilmoitettu, sitä voidaan käyttää tekijän mainitsemiseen.", "prefs-help-email": "Vapaaehtoinen, mutta tarvitaan uuden salasanan pyytämiseen, jos unohdat salasanasi.", "prefs-help-email-others": "Voit myös antaa muiden käyttäjien ottaa yhteyttä sinuun sähköpostilla. Osoitteesi ei paljastu toisen käyttäjän ottaessa sinuun yhteyttä.", "prefs-help-email-required": "Sähköpostiosoite on pakollinen.", @@ -1600,7 +1601,7 @@ "suppress": "Häivytys", "querypage-disabled": "Tämä toimintosivu on poistettu käytöstä suorituskykysyistä.", "apihelp": "API-apu", - "apihelp-no-such-module": "Moduulia \"$1\" ei löydy.", + "apihelp-no-such-module": "Moduulia ”$1” ei löydy.", "booksources": "Kirjalähteet", "booksources-search-legend": "Etsi kirjalähteitä", "booksources-isbn": "ISBN", diff --git a/languages/i18n/he.json b/languages/i18n/he.json index 3d974ef3d3..5aaa84396d 100644 --- a/languages/i18n/he.json +++ b/languages/i18n/he.json @@ -672,6 +672,8 @@ "content-model-text": "טקסט פשוט", "content-model-javascript": "JavaScript", "content-model-css": "CSS", + "duplicate-args-category": "דפים שמשתמשים בפרמטרים כפולים בקריאות לתבניות", + "duplicate-args-category-desc": "הדף מכיל קריאות לתבניות שמשתמשות בפרמטרים כפולים, כגון {{תאריך|יום=1|יום=2}} או {{שעה|חמש|1=שש}}.", "expensive-parserfunction-warning": "'''אזהרה:''' דף זה כולל יותר מדי קריאות לפונקציות מפענח שגוזלות משאבים.\n\nנדרש {{PLURAL:$2|שתהיה בו לכל היותר קריאה אחת|שתהיינה בו לכל היותר $2 קריאות}} לפונקציות כאלה, אך כרגע יש בו {{PLURAL:$1|קריאה אחת|$1 קריאות}}.", "expensive-parserfunction-category": "דפים עם יותר מדי קריאות למשתנים הגוזלים משאבים", "post-expand-template-inclusion-warning": "'''אזהרה:''' התבניות המוכללות בדף זה גדולות מדי.\nחלק מהתבניות לא יוכללו.", @@ -841,8 +843,8 @@ "nextn-title": "{{PLURAL:$1|התוצאה הבאה|$1 התוצאות הבאות}}", "shown-title": "הצגת {{PLURAL:$1|תוצאה אחת|$1 תוצאות}} בדף", "viewprevnext": "צפייה ב: ($1 {{int:pipe-separator}} $2) ($3)", - "searchmenu-exists": "'''קיים דף בשם \"[[:$1]]\" באתר זה.'''", - "searchmenu-new": "'''יצירת הדף \"[[:$1]]\" באתר הוויקי הזה.'''\n{{PLURAL:$2|0=|ר' גם את הדף שנמצא בחיפוש.|ר' גם את תוצאות החיפוש.}}", + "searchmenu-exists": "קיים דף בשם \"[[:$1]]\" באתר הוויקי הזה. {{PLURAL:$2|0=|ר' גם את הדפים האחרים שנמצאו בחיפוש.}}", + "searchmenu-new": "ליצירת הדף \"[[:$1]]\" באתר הוויקי הזה. {{PLURAL:$2|0=|ר' גם את הדף שנמצא בחיפוש.|ר' גם את הדפים שנמצאו בחיפוש.}}", "searchprofile-articles": "דפי תוכן", "searchprofile-images": "מולטימדיה", "searchprofile-everything": "הכול", @@ -957,7 +959,7 @@ "gender-female": "היא עורכת דפים בוויקי", "prefs-help-gender": "אין חובה למלא העדפה זו.\nהמערכת משתמשת במידע זה כדי לפנות אליך/אלייך ולציין את שם המשתמש שלך במין הדקדוקי הנכון.\nהמידע יהיה ציבורי.", "email": "דוא\"ל", - "prefs-help-realname": "השם האמיתי הוא אופציונאלי.\nאם תבחרו לספקו, הוא ישמש לייחוס עבודתכם אליכם.", + "prefs-help-realname": "אין חובה למלא את השם האמיתי.\nהשם האמיתי עשוי לשמש כדי לייחס לך את עבודתך.", "prefs-help-email": "כתובת דואר אלקטרוני היא אופציונאלית, אבל היא חיונית לאיפוס הסיסמה במקרה שתשכחו אותה.", "prefs-help-email-others": "באפשרותך גם לבחור לאפשר לאחרים ליצור איתך קשר באמצעות דוא\"ל דרך קישור בדף המשתמש או בדף השיחה שלך.\nכתובת הדוא\"ל שלך לא תיחשף כשמשתמשים אחרים ייצרו קשר איתך.", "prefs-help-email-required": "כתובת דואר אלקטרוני נדרשת לכתיבה באתר.", @@ -2247,7 +2249,7 @@ "tooltip-n-randompage": "צפייה בדף תוכן אקראי", "tooltip-n-help": "עזרה בשימוש באתר", "tooltip-t-whatlinkshere": "רשימת כל הדפים המקושרים לכאן", - "tooltip-t-recentchangeslinked": "השינויים האחרונים שבוצעו בדפים המקושרים מכאן", + "tooltip-t-recentchangeslinked": "השינויים האחרונים שבוצעו בדפים המקושרים מדף זה", "tooltip-feed-rss": "הזנת RSS עבור דף זה", "tooltip-feed-atom": "הזנת Atom עבור דף זה", "tooltip-t-contributions": "תרומותיו של משתמש זה", @@ -2937,6 +2939,7 @@ "unknown_extension_tag": "תגית בלתי ידועה: \"$1\"", "duplicate-defaultsort": "'''אזהרה:''' המיון הרגיל \"$2\" דורס את המיון הרגיל המוקדם ממנו \"$1\".", "duplicate-displaytitle": "אזהרה: כותרת התצוגה \"$2\" דורסת את כותרת התצוגה הקודמת \"$1\".", + "invalid-indicator-name": "שגיאה: התכונה name של מצייני מצב הדף אינה יכולה להיות ריקה.", "version": "גרסת התוכנה", "version-extensions": "הרחבות מותקנות", "version-skins": "עיצובים מותקנים", diff --git a/languages/i18n/hu.json b/languages/i18n/hu.json index ffb77f5ecb..419b4b91dd 100644 --- a/languages/i18n/hu.json +++ b/languages/i18n/hu.json @@ -578,7 +578,7 @@ "showpreview": "Előnézet megtekintése", "showdiff": "Változtatások megtekintése", "blankarticle": "Figyelem: A létrehozandó szócikk üres.\nHa ismét a \"{{int:savearticle}}\" gombra kattintasz, a szócikket tartalom nélkül fogod létrehozni.", - "anoneditwarning": "'''Figyelem:''' Nem vagy bejelentkezve. Ha szerkesztesz, az IP-címed látható lesz a laptörténetben.", + "anoneditwarning": "Figyelem: Nem vagy bejelentkezve. Ha szerkesztesz, az IP-címed nyilvánosan látható lesz a laptörténetben. Ha [$1 bejelentkezel] vagy [$2 regisztrálsz], a szerkesztéseid a felhasználónevedhez lesznek társítva, egyéb hasznos dolgok mellett.", "anonpreviewwarning": "''Nem vagy bejelentkezve. A mentéskor az IP-címed rögzítve lesz a laptörténetben.''", "missingsummary": "'''Emlékeztető:''' Nem adtál meg szerkesztési összefoglalót. Ha összefoglaló nélkül akarod elküldeni a szöveget, kattints újra a mentésre.", "missingcommenttext": "Kérjük, írj összefoglalót a szerkesztésedhez.", @@ -689,8 +689,8 @@ "parser-template-recursion-depth-warning": "A sablon rekurzív beillesztésének mélysége átlépte a határérékét ($1)", "language-converter-depth-warning": "A nyelvátalakító rekurzióinak száma túllépve ($1)", "node-count-exceeded-category": "Lapok, ahogy a csomópontszám túl nagy", - "node-count-exceeded-category-desc": "Azon oldalaknak a kategóriája, ahol a csomópontszám túl nagy.", - "node-count-exceeded-warning": "Az oldal meghaladta a csomópont számot", + "node-count-exceeded-category-desc": "A lap túllépi a maximális csomópontszámot.", + "node-count-exceeded-warning": "Az oldal meghaladta a csomópontszámot", "expansion-depth-exceeded-category": "Lapok, melyeken a sablonok kibontása meghaladja a megengedett szintet", "expansion-depth-exceeded-warning": "A lap meghaladta az engedélyezett kiterjesztési mélységet", "parser-unstrip-loop-warning": "Unstrip hurok észlelve", @@ -854,6 +854,7 @@ "search-result-category-size": "$1 oldal, $2 alkategória, $3 fájl", "search-redirect": "(átirányítva innen: $1)", "search-section": "($1 szakasz)", + "search-file-match": "(fájl tartalma egyezik)", "search-suggest": "Keresési javaslat: $1", "search-interwiki-caption": "Társlapok", "search-interwiki-default": "$1 találatok:", @@ -1442,6 +1443,7 @@ "randompage-nopages": "A következő {{PLURAL:$2|névtérben|névterekben}} nincsenek lapok: $1.", "randomincategory": "Véletlen lap egy kategóriából", "randomincategory-invalidcategory": "\"$1\" nem egy érvényes kategória neve.", + "randomincategory-nopages": "Nincsenek lapok a [[:Category:$1|$1]] kategóriában.", "randomincategory-category": "Kategória:", "randomincategory-legend": "Véletlen lap a kategóriából", "randomredirect": "Átirányítás találomra", @@ -1559,6 +1561,8 @@ "pager-older-n": "{{PLURAL:$1|1 régebbi|$1 régebbi}}", "suppress": "adatvédelmi biztos", "querypage-disabled": "Ez a speciális lap a megfelelő teljesítmény fenntartása érdekében le van tiltva.", + "apihelp": "API segítség", + "apihelp-no-such-module": "A(z) „$1\" modul nem található.", "booksources": "Könyvforrások", "booksources-search-legend": "Könyvforrások keresése", "booksources-search": "Keresés", @@ -1630,6 +1634,7 @@ "listgrouprights-removegroup-self-all": "az összes csoporból eltávolíthatja a saját fiókját", "listgrouprights-namespaceprotection-header": "Névtér korlátozások", "listgrouprights-namespaceprotection-namespace": "Névtér", + "trackingcategories-name": "Üzenetnév", "trackingcategories-nodesc": "Nem található leírás.", "trackingcategories-disabled": "A kategória le van tiltva", "mailnologin": "Nincs feladó", @@ -1766,9 +1771,9 @@ "protect-locked-dblock": "A védelmi szinteket egy aktív adatbázis zárolás miatt nem változtathatod meg.\nItt vannak a(z) '''$1''' lap jelenlegi beállításai:", "protect-locked-access": "A fiókod számára nem engedélyezett a védelmi szintek megváltoztatása.\nItt vannak a(z) '''$1''' lap jelenlegi beállításai:", "protect-cascadeon": "A lap jelenleg le van védve, mert {{PLURAL:$1|tartalmazza az alábbi lap, amelyen|tartalmazzák az alábbi lapok, amelyeken}} be van kapcsolva a kaszkád védelem.\nEzen lap védelmi szintjének megváltoztatása nem lesz hatással a kaszkád védelemre.", - "protect-default": "Minden szerkesztő számára engedélyezett", - "protect-fallback": "\"$1\" engedély szükséges hozzá", - "protect-level-autoconfirmed": "Csak automatikusan megerősített szerkesztőknek engedélyezett (nem vagy frissen regisztráltaknak nem)", + "protect-default": "minden szerkesztő számára engedélyezett", + "protect-fallback": "„$1”-i engedély szükséges hozzá", + "protect-level-autoconfirmed": "automatikusan megerősített szerkesztők számára", "protect-level-sysop": "csak adminisztrátoroknak engedélyezett", "protect-summary-cascade": "kaszkád védelem", "protect-expiring": "lejár: $1 (UTC)", @@ -2828,6 +2833,8 @@ "version-entrypoints-header-entrypoint": "Belépési pont", "version-entrypoints-header-url": "URL", "redirect": "Átirányítás fájl, szerkesztő, oldal vagy oldalváltozat alapján", + "redirect-legend": "Átirányítás egy fájlra vagy lapra", + "redirect-submit": "Mehet", "redirect-lookup": "Keresés:", "redirect-value": "Érték:", "redirect-user": "Felhasználói azonosító", @@ -3046,10 +3053,12 @@ "mediastatistics-header-drawing": "Rajzok (vektoros képek)", "mediastatistics-header-audio": "Hang", "mediastatistics-header-video": "Videók", + "mediastatistics-header-multimedia": "Interaktív média", "mediastatistics-header-office": "Iroda", "mediastatistics-header-text": "Szöveges", "mediastatistics-header-executable": "Futtatható", "mediastatistics-header-archive": "Tömörített formátumok", + "json-error-unknown": "Hiba volt a JSON-ban. Hiba: $1", "json-error-state-mismatch": "Érvénytelen vagy hibás JSON", "json-error-syntax": "Szintaktikai hiba", "json-error-utf8": "Hibás UTF-8 karakter, esetleg helytelenül kódolt" diff --git a/languages/i18n/is.json b/languages/i18n/is.json index 18aaf201d0..d4354fa18b 100644 --- a/languages/i18n/is.json +++ b/languages/i18n/is.json @@ -181,6 +181,7 @@ "permalink": "Varanlegur tengill", "print": "Prenta", "view": "Skoða", + "view-foreign": "Skoða á $1", "edit": "Breyta", "create": "Skapa", "editthispage": "Breyta þessari síðu", @@ -215,6 +216,7 @@ "otherlanguages": "Á öðrum tungumálum", "redirectedfrom": "(Tilvísað frá $1)", "redirectpagesub": "Tilvísunarsíða", + "redirectto": "Tilvísun á", "lastmodifiedat": "Þessari síðu var síðast breytt $1 klukkan $2.", "viewcount": "Þessi síða hefur verið skoðuð $1 {{PLURAL:$1|sinni|sinnum}}.", "protectedpage": "Vernduð síða", @@ -265,6 +267,9 @@ "hidetoc": "fela", "collapsible-collapse": "Fela", "collapsible-expand": "Sýna", + "confirmable-confirm": "Ert {{GENDER:$1|þú}} viss?", + "confirmable-yes": "Já", + "confirmable-no": "Nei", "thisisdeleted": "Endurvekja eða skoða $1?", "viewdeleted": "Skoða $1?", "restorelink": "$1 {{PLURAL:$1|eydd breyting|eyddar breytingar}}", @@ -382,6 +387,7 @@ "gotaccountlink": "Skráðu þig inn", "userlogin-resetlink": "Gleymdir þú notendaupplýsingunum þínum?", "userlogin-resetpassword-link": "Gleymdiru lykilorðinu þínu?", + "userlogin-helplink2": "Hjálp við innskráningu", "userlogin-loggedin": "Þú ert búin(n) að skrá þig inn sem {{GENDER:$1|$1}}.\nNotaðu eyðablaðið fyrir neðan til að skrá þig inn sem annar notandi.", "userlogin-createanother": "Stofna annan aðgang", "createacct-emailrequired": "Netfang", @@ -445,9 +451,12 @@ "createaccount-text": "Einhver bjó til aðgang fyrir netfangið þitt á {{SITENAME}} ($4) undir nafninu „$2“, með lykilorðið „$3“.\nÞú ættir að skrá þig inn og breyta lykilorðinu núna.\n\nÞú getur hunsað þessi skilaboð, ef villa hefur átt sér stað.", "login-throttled": "Þér hefur mistekist að skrá þig inn undir þessu notendanafni of oft.\nVinsamlegast bíðið $1 áður en þú reynir aftur.", "login-abort-generic": "Innskráningin misheppnaðist - hætt var við hana.", + "login-migrated-generic": "Aðgangurinn þinn hefur verið sameinaður og notendanafnið þitt finnst ekki lengur á þessum wiki.", "loginlanguagelabel": "Tungumál: $1", "suspicious-userlogout": "Beiðni um útskráningu hafnað því hún var líklegast send frá biluðum vafra eða vefseli sem hefur vistað vefsíðuna í flýtiminni.", "createacct-another-realname-tip": "Alvöru nafn er valfrjálst. Ef þú kýst að gefa það upp, verður það notað til að gefa þér heiður af verkum þínum.", + "pt-login": "Innskrá", + "pt-login-button": "Innskrá", "pt-createaccount": "Stofna aðgang", "pt-userlogout": "Útskrá", "php-mail-error-unknown": "Óþekkt villa í PHP mail() aðgerð.", @@ -462,6 +471,7 @@ "retypenew": "Endurtaktu nýja lykilorðið:", "resetpass_submit": "Skrifaðu aðgangsorðið og skráðu þig inn", "changepassword-success": "Það tókst að breyta lykilorðinu þínu!", + "changepassword-throttled": "Þú hefur gert of margar tilraunir til innskráningar.\nVinsamlegast bíddu í $1 áður en þú reynir aftur.", "resetpass_forbidden": "Ekki er hægt að breyta lykilorðum", "resetpass-no-info": "Þú verður að vera skráð(ur) inn til að hafa aðgang að þessari síðu.", "resetpass-submit-loggedin": "Breyta lykilorði", @@ -805,12 +815,14 @@ "searchrelated": "tengt", "searchall": "öllum", "showingresults": "Sýni $1 {{PLURAL:$1|niðurstöðu|niðurstöður}} frá og með #$2.", + "showingresultsinrange": "Sýni allt að $1 {{PLURAL:$1|niðurstöðu|niðurstöður}} á bilinu $2 til $3.", "search-nonefound": "Engar niðurstöður pössuðu við fyrirspurnina.", "powersearch-legend": "Ítarlegri leit", "powersearch-ns": "Leita í nafnrýmum:", "powersearch-togglelabel": "Athuga:", "powersearch-toggleall": "Allt", "powersearch-togglenone": "Ekkert", + "powersearch-remember": "Muna val fyrir leitir í framtíðinni", "search-external": "Ytri leit", "searchdisabled": "{{SITENAME}}-leit er óvirk.\nÞú getur leitað í genum Google á meðan.\nAthugaðu að skrár þeirra yfir {{SITENAME}}-efni kunna að vera úreltar.", "search-error": "Villa kom upp við leit að: $1", @@ -1078,6 +1090,7 @@ "recentchanges-label-minor": "Þetta er minniháttar breyting", "recentchanges-label-bot": "Þessi breyting var gerð af vélmenni", "recentchanges-label-unpatrolled": "Þessi breyting hefur ekki verið yfirfarin", + "recentchanges-label-plusminus": "Stærð síðunnar breyttist um svona mörg bæti", "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sjá einng [[Special:NewPages|lista yfir nýjar síður]])", "rcnotefrom": "Að neðan {{PLURAL:$5|er breyting síðan|eru breytingar síðan}} $3, $4 (allt að $1 sýndar).", "rclistfrom": "Sýna breytingar frá og með $3 $2", @@ -1180,6 +1193,7 @@ "fileexists-shared-forbidden": "Skrá með þessu nafni er þegar til í sameiginlega myndasafninu.\nEf þú villt hlaða inn skránni þinni engu að síður, farðu þá til baka og veldu annað skráarnafn.\n[[File:$1|thumb|center|$1]]", "file-exists-duplicate": "Þessi skrá er afrit eftirfarandi {{PLURAL:$1|skráar|skráa}}:", "file-deleted-duplicate": "Afriti þessarar skráar ([[:$1]]) hefur verið eytt.\nÞú ættir að fara yfir eyðingarsögu skráarinnar áður en þú velur að hlaða skránni aftur inn.", + "file-deleted-duplicate-notitle": "Skrá sem er eins og þessi skrá hefur verið hlaðið inn áður og titll hennar hefur verið falinn.\nÞú ættir að spurja einhvern með réttindi til að skoða földu skránna til að fara yfir málið áður en þú hleður skránni inn.", "uploadwarning": "Aðvörun", "uploadwarning-text": "Vinsamlegast breyttu myndalýsingunni hér fyrir neðan og reyndu aftur.", "savefile": "Vista", @@ -1288,6 +1302,7 @@ "license": "Leyfisupplýsingar:", "license-header": "Leyfisupplýsingar:", "nolicense": "Ekkert valið", + "licenses-edit": "Breyta leyfisvali", "license-nopreview": "(Forskoðun ekki fáanleg)", "upload_source_url": "(þín valda skrá frá gildri, aðgengilegri vefslóð)", "upload_source_file": "(þín valda skrá frá tölvunni þinni)", @@ -1369,6 +1384,9 @@ "download": "Hlaða niður", "unwatchedpages": "Óvaktaðar síður", "listredirects": "Tilvísanir", + "listduplicatedfiles": "Listi yfir afritaðar skrár", + "listduplicatedfiles-summary": "Þetta er listi yfir skrár þar sem nýjasta útgáfa hennar er afrit af nýjustu útgáfu einhverrar annarar skrár. Aðeins staðbundnar skrár eru taldar með.", + "listduplicatedfiles-entry": "[[:File:$1|$1]] hefur $2 [[$3|{{PLURAL:$2|afrit}}]].", "unusedtemplates": "Ónotuð snið", "unusedtemplatestext": "Þetta er listi yfir allar síður í {{ns:snið}} nafnrýminu sem ekki eru notaðar í neinum öðrum síðum. Munið að gá að öðrum tenglum í sniðin áður en þeim er eytt.", "unusedtemplateswlh": "aðrir tenglar", @@ -1459,8 +1477,18 @@ "deadendpagestext": "Eftirfarandi síður tengjast ekki við aðrar síður á {{SITENAME}}.", "protectedpages": "Verndaðar síður", "protectedpages-indef": "Aðeins óendanlegar verndanir", + "protectedpages-summary": "Þessi skrá sýnir lista yfir síður sem eru til og eru verndaðar í auknablikinu. Til að sjá lista yfir titla sem eru verndaðir gegn stofnun þeirra, sjáðu [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].", "protectedpages-cascade": "Keðjuverndun eingöngu", + "protectedpages-noredirect": "Fela tilvísanir", "protectedpagesempty": "Engar síður eru verndaðar með þessum stikum.", + "protectedpages-timestamp": "Tímastimpill", + "protectedpages-page": "Síða", + "protectedpages-expiry": "Rennur út", + "protectedpages-performer": "Vernduð af", + "protectedpages-params": "Verndunar stikar", + "protectedpages-reason": "Ástæða", + "protectedpages-unknown-timestamp": "Óþekktur", + "protectedpages-unknown-performer": "Óþekktur notandi", "protectedtitles": "Verndaðir titlar", "protectedtitlesempty": "Engir titlar eru verndaðir með þessum stikum.", "listusers": "Notendalisti", @@ -1486,6 +1514,7 @@ "querypage-disabled": "Þessi kerfisíða er óvirk til að minnka ekki afköst vefþjónsins.", "booksources": "Bókaleit", "booksources-search-legend": "Leita að bókaverslunum", + "booksources-search": "Leita", "booksources-text": "Fyrir neðan er listi af tenglum í aðrar síður sem selja nýjar og notaðar bækur og gætu einnig haft nánari upplýsingar í sambandi við bókina sem þú varst að leita að:", "booksources-invalid-isbn": "ISBN gildið virðist ekki vera gilt; leitaðu eftir villum við innslátt eða afritun gildisins frá upsprettu þess.", "specialloguserlabel": "Gerandi:", @@ -1705,10 +1734,10 @@ "protect-edit-reasonlist": "Breyta verndarástæðum", "protect-expiry-options": "1 tími:1 hour,1 dag:1 day,1 viku:1 week,2 vikur:2 weeks,1 mánuð:1 month,3 mánuði:3 months,6 mánuði:6 months,1 ár:1 year,aldrei:infinite", "restriction-type": "Réttindi:", - "restriction-level": "Takmarkaði við:", + "restriction-level": "Takmarkað við:", "minimum-size": "Lágmarksstærð", "maximum-size": "Hámarksstærð:", - "pagesize": "(bæt)", + "pagesize": "(bæti)", "restriction-edit": "Breyta", "restriction-move": "Færa", "restriction-create": "Skapa", @@ -2637,6 +2666,7 @@ "autosumm-replace": "Skipti út innihaldi með „$1“", "autoredircomment": "Tilvísun á [[$1]]", "autosumm-new": "Ný síða: $1", + "autosumm-newblank": "Bjó til tóma síðu", "lag-warn-normal": "Breytingar nýrri en $1 {{PLURAL:$1|sekúnda|sekúndur}} kunna að vera ekki á þessm lista.", "lag-warn-high": "Vegna mikils álags á vefþjónanna, kunna breytingar yngri en $1 {{PLURAL:$1|sekúnda|sekúndur}} ekki að vera á þessum lista.", "watchlistedit-normal-title": "Breyta vaktlistanum", @@ -2652,6 +2682,7 @@ "watchlistedit-raw-done": "Vaktlistinn þinn hefur verið uppfærður.", "watchlistedit-raw-added": "$1 {{PLURAL:$1|titli|titlum}} var bætt við:", "watchlistedit-raw-removed": "$1 {{PLURAL:$1|titill var fjarlægður|titlar voru fjarlægðir}}:", + "watchlistedit-clear-titles": "Titlar:", "watchlisttools-view": "Sýna viðeigandi breytingar", "watchlisttools-edit": "Skoða og breyta vaktlistanum", "watchlisttools-raw": "Breyta opnum vaktlistanum", @@ -2787,6 +2818,8 @@ "logentry-rights-rights": "$1 {{GENDER:$2|breytti}} réttindum $3 frá $4 í $5", "logentry-rights-rights-legacy": "$1 {{GENDER:$2|breytti}} réttindum $3", "logentry-rights-autopromote": "$1 fékk sjálfvirkt {{GENDER:$2|aukin}} réttindi frá $4 til $5", + "logentry-upload-upload": "$1 {{GENDER:$2|hlóð inn}} $3", + "logentry-upload-overwrite": "$1 {{GENDER:$2|hlóð inn}} nýrri útgáfu af $3", "rightsnone": "(engum)", "revdelete-summary": "breytingarágrip", "feedback-bugornote": "Ef þú ert reiðubúinn að lýsa tæknilegri villu í smáatriðum, vinsamlegast [$1 tilkynntu villu].\nEf ekki, þá getur þú notað einfalt eyðublað hér fyrir neðan. Athugasemdin þín verður bætt við síðuna \"[$3 $2]\" ásamt notendanafni og nafni vafrarans sem þú ert að nota.", @@ -2861,5 +2894,26 @@ "expand_templates_xml_output": "XML-úttak", "expand_templates_ok": "Í lagi", "expand_templates_remove_comments": "Fjarlægja athugasemdir", - "expand_templates_preview": "Forskoða" + "expand_templates_preview": "Forskoða", + "mediastatistics": "Margmiðlunar tölfræði", + "mediastatistics-summary": "Tölfræði um upphaldar skráar gerðir. Hún inniheldur eingöngu nýjustu útgáfu skráarinnar. Gamlar eða eyddar skrár eru ekki teknar með.", + "mediastatistics-nbytes": "{{PLURAL:$1|$1 bæti}} ($2; $3%)", + "mediastatistics-table-mimetype": "MIME tegund", + "mediastatistics-table-extensions": "Mögulegar skráargerðir", + "mediastatistics-table-count": "Fjöldi skráa", + "mediastatistics-table-totalbytes": "Heildarstærð", + "mediastatistics-header-unknown": "Óþekkt", + "mediastatistics-header-bitmap": "Bitmap myndir", + "mediastatistics-header-drawing": "Teikningar (vector-myndir)", + "mediastatistics-header-audio": "Hljóð", + "mediastatistics-header-video": "Myndbönd", + "mediastatistics-header-text": "Textar", + "mediastatistics-header-executable": "Uppsetninga skrár", + "mediastatistics-header-archive": "Þjappaðar skrár", + "json-warn-trailing-comma": "$1 eftirfylgjandi {{PLURAL:$1|komma var fjarlægð|kommur voru fjarlægðar}} úr JSON", + "json-error-unknown": "Það varð villa í JSON. Villa: $1", + "json-error-state-mismatch": "Ógild eða ranglega uppsett JSON", + "json-error-syntax": "málfræði villa", + "json-error-utf8": "Gallaðir UTF-8 stafir, líklega vitlaust kótaðir", + "json-error-unsupported-type": "Gildi af gerð sem ekki er hægt að kóta var gefin." } diff --git a/languages/i18n/it.json b/languages/i18n/it.json index 321aa3b70a..5a61f1c3ca 100644 --- a/languages/i18n/it.json +++ b/languages/i18n/it.json @@ -720,6 +720,8 @@ "content-model-text": "testo normale", "content-model-javascript": "JavaScript", "content-model-css": "CSS", + "duplicate-args-category": "Pagine che usano argomenti duplicati in chiamate a template", + "duplicate-args-category-desc": "La pagina contiene chiamate a template che utilizzano argomenti duplicati, come ad esempio {{foo|bar=1|bar=2}} o {{foo|bar|1=baz}}.", "expensive-parserfunction-warning": "'''Attenzione:''' Questa pagina contiene troppe chiamate alle parser functions.\n\nDovrebbe averne meno di $2, al momento ce {{PLURAL:$1|n'è $1|ne sono $1}}.", "expensive-parserfunction-category": "Pagine con troppe chiamate alle funzioni parser", "post-expand-template-inclusion-warning": "Attenzione: la dimensione dei template inclusi è troppo grande.\nAlcuni template non verranno inclusi.", @@ -1005,7 +1007,7 @@ "gender-female": "È registrata su {{SITENAME}}", "prefs-help-gender": "L'impostazione di questa preferenza è opzionale.\nIl software utilizza questo valore per rivolgersi a te e menzionarti agli altri usando il genere grammaticale appropriato.\nQuesta informazione sarà pubblica.", "email": "Indirizzo email", - "prefs-help-realname": "L'indicazione del proprio nome vero è opzionale; se si sceglie di inserirlo, verrà utilizzato per attribuire la paternità dei contenuti inviati.", + "prefs-help-realname": "Il vero nome è facoltativo.\nSe fornito, può essere usato per attribuirvi la paternità del vostro lavoro.", "prefs-help-email": "L'inserimento del proprio indirizzo email è facoltativo, ma permette di ricevere la propria password qualora venisse dimenticata.", "prefs-help-email-others": "Puoi anche scegliere di lasciare che gli altri ti contattino via posta elettronica con un collegamento dalla tua pagina utente o di discussione.\nIl tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.", "prefs-help-email-required": "L'indirizzo email è obbligatorio.", @@ -2930,6 +2932,7 @@ "unknown_extension_tag": "Tag estensione sconosciuto: \"$1\"", "duplicate-defaultsort": "Attenzione: la chiave di ordinamento predefinita \"$2\" sostituisce la precedente \"$1\".", "duplicate-displaytitle": "Attenzione: il titolo visualizzato \"$2\" sostituisce il precedente titolo \"$1\".", + "invalid-indicator-name": "Errore: attributo name degli indicatori dello stato della pagina non può essere vuoto.", "version": "Versione", "version-extensions": "Estensioni installate", "version-skins": "Skin installate", diff --git a/languages/i18n/ja.json b/languages/i18n/ja.json index bc06414b2e..9b9d9054ef 100644 --- a/languages/i18n/ja.json +++ b/languages/i18n/ja.json @@ -708,6 +708,8 @@ "content-model-text": "プレーンテキスト", "content-model-javascript": "JavaScript", "content-model-css": "CSS", + "duplicate-args-category": "テンプレート呼び出しで引数が重複しているページ", + "duplicate-args-category-desc": "引数が重複したテンプレート呼び出しを含むページ。例: {{foo|bar=1|bar=2}}、{{foo|bar|1=baz}}", "expensive-parserfunction-warning": "警告: このページでは、高負荷なパーサー関数の呼び出し回数が多過ぎます。\n\n{{PLURAL:$2|呼び出しを $2 回}}未満にしてください ({{PLURAL:$1|現在は $1 回}})。", "expensive-parserfunction-category": "高負荷な構文解析関数の呼び出しが多過ぎるページ", "post-expand-template-inclusion-warning": "警告: テンプレートの読み込みサイズが大き過ぎます。\nいくつかのテンプレートは読み込まれません。", @@ -887,7 +889,7 @@ "searchprofile-images-tooltip": "ファイルを検索", "searchprofile-everything-tooltip": "全本文ページ (トークページを含む) 内を検索", "searchprofile-advanced-tooltip": "特定の名前空間内を検索", - "search-result-size": "$1 ({{PLURAL:$2|$2 単語}})", + "search-result-size": "$1 ({{PLURAL:$2|$2 語}})", "search-result-category-size": "{{PLURAL:$1|$1 件}} ({{PLURAL:$2|$2 下位カテゴリ}}、{{PLURAL:$3|$3 ファイル}})", "search-redirect": "($1からのリダイレクト)", "search-section": "($1の節)", @@ -995,7 +997,7 @@ "gender-female": "女", "prefs-help-gender": "この項目の設定は省略できます。\nソフトウェアが利用者向けの画面表示であなたに言及する際に、適切な文法的性を選択するために使用されます。\nこの情報は公開されます。", "email": "メール", - "prefs-help-realname": "本名は省略できます。\n入力すると、あなたの著作物の帰属表示に使われます。", + "prefs-help-realname": "本名は省略できます。\n入力すると、あなたの著作物の帰属表示に使用されます。", "prefs-help-email": "メールアドレスは省略できますが、パスワードを忘れた際にパスワードをリセットするのに必要です。", "prefs-help-email-others": "利用者ページやトークページ上のリンクを通じて、他の利用者があなたにメールで連絡を取れるようにすることもできます。\n他の利用者が連絡を取る際にあなたのメールアドレスが開示されることはありません。", "prefs-help-email-required": "メールアドレスが必要です。", @@ -1628,6 +1630,8 @@ "pager-older-n": "{{PLURAL:$1|以前の$1件}}", "suppress": "秘匿する", "querypage-disabled": "パフォーマンスに悪影響を与えるおそれがあるため、この特別ページは無効になっています。", + "apihelp": "API のヘルプ", + "apihelp-no-such-module": "モジュール「$1」が見つかりません。", "booksources": "書籍情報源", "booksources-search-legend": "書籍情報源を検索", "booksources-isbn": "ISBN:", diff --git a/languages/i18n/ko.json b/languages/i18n/ko.json index 7d5680805c..e621fbe661 100644 --- a/languages/i18n/ko.json +++ b/languages/i18n/ko.json @@ -909,7 +909,7 @@ "prefs-changeemail": "이메일 주소 바꾸기", "prefs-setemail": "이메일 주소 설정하기", "prefs-email": "이메일 설정", - "prefs-rendering": "문서 보기 설정", + "prefs-rendering": "문서 보이기 설정", "saveprefs": "저장", "restoreprefs": "(모든 부분에서) 모두 기본 설정으로 되돌리기", "prefs-editing": "편집 상자", @@ -968,7 +968,7 @@ "gender-female": "위키 문서를 편집하는 여자입니다", "prefs-help-gender": "이 환경 설정은 선택 사항입니다.\n소프트웨어는 적절한 성별 문법을 사용하여 다른 사용자에게 당신을 언급하는 것을 해결하기 위해 사용됩니다.\n이 정보는 공개됩니다.", "email": "이메일", - "prefs-help-realname": "실명은 선택 사항입니다.\n실명을 입력하면 문서 기여에 자신의 이름이 들어가게 됩니다.", + "prefs-help-realname": "실명은 선택 사항입니다.\n실명을 입력하면 당신의 기여에 대한 저작자표시에 쓰이게 될 수 있습니다.", "prefs-help-email": "이메일 주소 입력은 선택 사항입니다. 다만 비밀번호를 잊었을 때 비밀번호를 재설정하기 위해 필요합니다.", "prefs-help-email-others": "자신의 문서나 토론 문서에 있는 이메일 보내기 링크로 다른 사용자가 연락할 수 있게 할 수도 있습니다.\n이 경우에도 이메일 주소는 다른 사용자가 연락할 때 공개되지 않습니다.", "prefs-help-email-required": "이메일 주소가 필요합니다.", @@ -1597,6 +1597,7 @@ "pager-older-n": "{{PLURAL:$1|이전 1개|이전 $1개}}", "suppress": "오버사이트", "querypage-disabled": "이 특수 문서는 성능상의 이유로 비활성화되었습니다.", + "apihelp": "API 도움말", "booksources": "책 찾기", "booksources-search-legend": "책 원본 검색", "booksources-isbn": "ISBN:", diff --git a/languages/i18n/lb.json b/languages/i18n/lb.json index 7b040025bf..93d287104d 100644 --- a/languages/i18n/lb.json +++ b/languages/i18n/lb.json @@ -1554,6 +1554,8 @@ "pager-older-n": "{{PLURAL:$1|vireg|vireg $1}}", "suppress": "Iwwersiicht", "querypage-disabled": "Dës Spezialsäit ass aus Performance-Grënn ausgeschalt.", + "apihelp": "API-Hëllef", + "apihelp-no-such-module": "Modul \"$1\" net fonnt.", "booksources": "Bicherreferenzen", "booksources-search-legend": "No Bicherreferenze sichen", "booksources-search": "Sichen", @@ -2209,6 +2211,7 @@ "tooltip-feed-atom": "Atom-Feed fir dës Säit", "tooltip-t-contributions": "Lëscht vun de Kontributioune vun dësem Benotzer", "tooltip-t-emailuser": "Dësem Benotzer eng E-Mail schécken", + "tooltip-t-info": "Méi Informatiounen iwwer dës Säit", "tooltip-t-upload": "Biller oder Mediefichieren eroplueden", "tooltip-t-specialpages": "Lëscht vun alle Spezialsäiten", "tooltip-t-print": "Versioun vun dëser Säit fir auszedrécken", diff --git a/languages/i18n/lt.json b/languages/i18n/lt.json index bfd8856cf6..d478959a55 100644 --- a/languages/i18n/lt.json +++ b/languages/i18n/lt.json @@ -194,7 +194,7 @@ "print": "Spausdinti", "view": "ŽiÅ«rėti", "view-foreign": "Rodyti $1", - "edit": "Redaguoti", + "edit": "Keisti", "edit-local": "Redaguoti vietos apraÅ¡ymą", "create": "Sukurti", "create-local": "Pridėti vietos apraÅ¡ymą", @@ -230,6 +230,7 @@ "otherlanguages": "Kitomis kalbomis", "redirectedfrom": "(Nukreipta iÅ¡ $1)", "redirectpagesub": "Nukreipimo puslapis", + "redirectto": "Nukreipti į:", "lastmodifiedat": "Å is puslapis paskutinį kartą keistas $1 $2.", "viewcount": "Å is puslapis buvo atvertas $1 {{PLURAL:$1|kartą|kartus|kartų}}.", "protectedpage": "Užrakintas puslapis", @@ -269,7 +270,7 @@ "newmessageslinkplural": "{{PLURAL:$1|nauja žinutė|999=naujos žinutės}}", "newmessagesdifflinkplural": "paskutinis {{PLURAL:$1|pakeitimas|999=pakeitimai}}", "youhavenewmessagesmulti": "Turite naujų žinučių $1", - "editsection": "redaguoti", + "editsection": "keisti", "editold": "taisyti", "viewsourceold": "žiÅ«rėti Å¡altinį", "editlink": "keisti", @@ -300,7 +301,7 @@ "nstab-media": "Media puslapis", "nstab-special": "Specialusis puslapis", "nstab-project": "Projekto puslapis", - "nstab-image": "Failas", + "nstab-image": "Rinkmena", "nstab-mediawiki": "PraneÅ¡imas", "nstab-template": "Å ablonas", "nstab-help": "Pagalbos puslapis", @@ -529,12 +530,12 @@ "nowiki_sample": "Čia įterpkite neformuotą tekstą", "nowiki_tip": "Ignoruoti wiki formatą", "image_sample": "Pavyzdys.jpg", - "image_tip": "Ä®dėti failą", + "image_tip": "Ä®terpta rinkmena", "media_sample": "Pavyzdys.ogg", - "media_tip": "Nuoroda į failą", + "media_tip": "Nuoroda į rinkmeną", "sig_tip": "JÅ«sų paraÅ¡as bei laikas", "hr_tip": "Horizontali linija (naudokite taupiai)", - "summary": "Komentaras:", + "summary": "PaaiÅ¡kinimas:", "subject": "Tema/antraÅ¡tė:", "minoredit": "Tai smulkus pataisymas", "watchthis": "Stebėti šį puslapį", @@ -590,7 +591,7 @@ "editing": "Taisomas $1", "creating": "Kuriama $1", "editingsection": "Taisomas $1 (skyrelis)", - "editingcomment": "Taisomas $1 (komentaras)", + "editingcomment": "Taisomas $1 (naujas skyrius)", "editconflict": "IÅ¡pręskite konfliktą: $1", "explainconflict": "Kažkas kitas jau pakeitė puslapį nuo tada, kai jÅ«s pradėjote jį redaguoti.\nVirÅ¡utiniame tekstiniame lauke pateikta Å¡iuo metu esanti puslapio versija.\nJÅ«sų keitimai pateikti žemiau esančiame lauke.\nJums reikia sujungti jÅ«sų pakeitimus su esančia versija.\nKai paspausite „{{int:savearticle}}“, bus įraÅ¡ytas '''tik''' tekstas virÅ¡utiniame tekstiniame lauke.", "yourtext": "JÅ«sų tekstas", @@ -627,6 +628,7 @@ "edit-gone-missing": "Negalima atnaujinti puslapio.\nGreičiausiai jis yra iÅ¡trintas.", "edit-conflict": "Redagavimo konfliktas.", "edit-no-change": "JÅ«sų keitimas buvo ignoruotas kadangi nebuvo atlikta jokių teksto pakeitimų.", + "postedit-confirmation-created": "Puslapis sukurtas.", "postedit-confirmation-saved": "JÅ«sų pakeitimas iÅ¡saugotas.", "edit-already-exists": "Negalima sukurti naujo puslapio.\nJis jau egzistuoja.", "defaultmessagetext": "Numatytasis praneÅ¡imo tekstas", @@ -807,12 +809,14 @@ "searchrelated": "susiję", "searchall": "visi", "showingresults": "Žemiau rodoma iki '''$1''' {{PLURAL:$1|rezultato|rezultatų|rezultatų}} pradedant #'''$2'''.", + "search-showingresults": "{{PLURAL:$4|Davinys $1 iÅ¡ $3|Daviniai $1 - $2 iÅ¡ $3}}", "search-nonefound": "Nėra rezultatų, atitinkančių užklausą.", "powersearch-legend": "IÅ¡plėstinė paieÅ¡ka", "powersearch-ns": "IeÅ¡koti vardų srityse:", "powersearch-togglelabel": "Pažymėti:", "powersearch-toggleall": "Viską", "powersearch-togglenone": "Nieko", + "powersearch-remember": "Atsiminti pasirinkimą bÅ«simoms paieÅ¡koms", "search-external": "IÅ¡orinė paieÅ¡ka", "searchdisabled": "Projekto {{SITENAME}} paieÅ¡ka yra uždrausta. Galite pamėginti ieÅ¡koti Google paieÅ¡kos sistemoje. PaieÅ¡kos sistemoje projekto {{SITENAME}} duomenys gali bÅ«ti pasenę.", "preferences": "Nustatymai", @@ -913,6 +917,7 @@ "prefs-displayrc": "Rodymo nustatymai", "prefs-displaywatchlist": "Rodymo nuostatos", "prefs-diffs": "Skirtumai", + "prefs-help-prefershttps": "Å is nustatymas suveiks kitą kartą prisijungiant.", "email-address-validity-valid": "PanaÅ¡u, kad E-paÅ¡to adresas yra teisingas", "email-address-validity-invalid": "Ä®veskite korektiÅ¡ką e-paÅ¡to adresą", "userrights": "Naudotojų teisių valdymas", @@ -993,7 +998,7 @@ "right-unblockself": "Atblokuoti pačius", "right-protect": "Pakeisti apsaugos lygius ir redaguoti apsaugotus puslapius", "right-editprotected": "Redaguoti apsaugotus puslapius (be pakopinės apsaugos)", - "right-editinterface": "Redaguoti naudotojo aplinką", + "right-editinterface": "Keisti naudotojo aplinką", "right-editusercssjs": "Redaguoti kitų naudotojų CSS ir JS failus", "right-editusercss": "Redaguoti kitų naudotojų CSS failus", "right-edituserjs": "Redaguoti kitų naudotojų JS failus", @@ -1022,7 +1027,7 @@ "rightslog": "Naudotojų teisių pakeitimai", "rightslogtext": "Pateikiamas naudotojų teisių pakeitimų sąraÅ¡as.", "action-read": "skaityti šį puslapį", - "action-edit": "redaguoti šį puslapį", + "action-edit": "keisti šį puslapį", "action-createpage": "kurti puslapius", "action-createtalk": "kurti aptarimų puslapius", "action-createaccount": "kurti Å¡ią naudotojo paskyrą", @@ -1031,10 +1036,10 @@ "action-move-subpages": "pervadinti šį puslapį ir jo subpuslapius", "action-move-rootuserpages": "perkelti pagrindinius naudotojų puslapius", "action-movefile": "perkelti šį failą", - "action-upload": "įkelti šį failą", + "action-upload": "įkelti Å¡ią rinkmeną", "action-reupload": "perraÅ¡yti šį esamą failą", "action-reupload-shared": "perraÅ¡yti šį failą bendrojoje saugykloje", - "action-upload_by_url": "įkelti šį failą iÅ¡ URL adreso", + "action-upload_by_url": "įkelti Å¡ią rinkmeną iÅ¡ URL adreso", "action-writeapi": "naudotis raÅ¡ymo API", "action-delete": "iÅ¡trinti šį puslapį", "action-deleterevision": "iÅ¡trinti Å¡ią reviziją", @@ -1071,6 +1076,7 @@ "recentchanges-label-bot": "Šį keitimą atliko automatinė programa", "recentchanges-label-unpatrolled": "Å is keitimas dar nebuvo patikrintas", "recentchanges-label-plusminus": "Å iuo baitų skaičiumi pakeista puslapio apimtis", + "recentchanges-legend-heading": "'''PaaiÅ¡kinimai:'''", "recentchanges-legend-newpage": "$1 - naujas puslapis", "rcnotefrom": "Žemiau yra pakeitimai pradedant $2 (rodoma iki $1 pakeitimų).", "rclistfrom": "Rodyti naujus pakeitimus pradedant $3 $2", @@ -1115,8 +1121,8 @@ "recentchangeslinked-summary": "Tai paskutinių keitimų, atliktų puslapiuose, į kuriuos yra nuoroda iÅ¡ nurodyto puslapio (arba į nurodytos kategorijos narius), sąraÅ¡as.\nPuslapiai iÅ¡ jÅ«sų [[Special:Watchlist|stebimųjų sąraÅ¡o]] yra '''paryÅ¡kinti'''.", "recentchangeslinked-page": "Puslapio pavadinimas:", "recentchangeslinked-to": "Rodyti su duotuoju puslapiu susijusių puslapių pakeitimus", - "upload": "Ä®kelti failą", - "uploadbtn": "Ä®kelti failą", + "upload": "Ä®kelti rinkmeną", + "uploadbtn": "Ä®kelti rinkmeną", "reuploaddesc": "AtÅ¡aukti įkėlimą ir grįžti į įkėlimo formą.", "upload-tryagain": "Siųsti pakeistą failo apraÅ¡ymą", "uploadnologin": "Neprisijungęs", @@ -1126,14 +1132,14 @@ "uploaderror": "Ä®kėlimo klaida", "upload-recreate-warning": "'''Dėmėsio: Failas Å¡iuo pavadinimu buvo iÅ¡trintas arba pervadintas.'''\n\nJÅ«sų patogumui pateiktas įraÅ¡as apie Å¡io puslapio trynimą ar pervadinimą:", "uploadtext": "Kad įkeltumėte failą, naudokitės žemiau pateikta forma.\nNorėdami peržiÅ«rėti ar ieÅ¡koti anksčiau įkeltų paveikslėlių, eikite į [[Special:FileList|įkeltų failų sąrašą]], įkėlimai yra registruojami [[Special:Log/upload|įkėlimų sąraÅ¡e]], trynimai — [[Special:Log/delete|trynimų sąraÅ¡e]].\n\nNorėdami panaudoti įkeltą failą puslapyje, naudokite tokias nuorodas:\n* '''[[{{ns:file}}:Failas.jpg]]''' norėdami naudoti pilną failo versiją\n* '''[[{{ns:file}}:Failas.png|200px|thumb|left|alternatyvusis tekstas]]''' norėdami naudoti 200 pikselių pločio paveikslėlį rėmelyje puslapio kairėje; „alternatyvus tekstas“ bus naudojamas paveikslėlio apraÅ¡ymui.\n* '''[[{{ns:media}}:Failas.ogg]]''' tiesioginei nuorodai į failą.", - "upload-permitted": "Leidžiami failų tipai: $1.", + "upload-permitted": "Leidžiami rinkmenų tipai: $1.", "upload-preferred": "Pageidautini failų tipai: $1.", "upload-prohibited": "Uždrausti failų tipai: $1.", "uploadlogpage": "Ä®kėlimų sąraÅ¡as", "uploadlogpagetext": "Žemiau pateikiamas paskutinių failų įkėlimų sąraÅ¡as.\nTaip pat galite peržvelgti [[Special:NewFiles|naujausių failų galeriją]].", "filename": "Failo vardas", "filedesc": "ApraÅ¡ymas", - "fileuploadsummary": "Komentaras:", + "fileuploadsummary": "ApraÅ¡ymas:", "filereuploadsummary": "Failo pakeitimai:", "filestatus": "Autorystės teisės:", "filesource": "Å altinis:", @@ -1164,10 +1170,10 @@ "largefileserver": "Å is failas yra didesnis nei serveris yra sukonfigÅ«ruotas leisti.", "emptyfile": "PanaÅ¡u, kad failas, kurį įkėlėte yra tuščias. Tai gali bÅ«ti dėl klaidos failo pavadinime. Pasitikrinkite ar tikrai norite įkelti Å¡itą failą.", "windows-nonascii-filename": "Å i viki neleidžia naudoti failų vardų su specialiais simboliais.", - "fileexists": "Failas tuo pačiu vardu jau egzistuoja, praÅ¡ome pažiÅ«rėti [[:$1]], jei nesate tikras, ar norite perraÅ¡yti šį failą.\n[[$1|thumb]]", + "fileexists": "Rinkmena tokiu pačiu pavadinimu jau esti, praÅ¡ome pažiÅ«rėti [[:$1]], jei nesate tikras, ar norite perraÅ¡yti Å¡ią rinkmeną.\n[[$1|thumb]]", "filepageexists": "Å io failo apraÅ¡ymo puslapis jau buvo sukurtas [[:$1]], bet Å¡iuo metu nėra jokio failo Å¡iuo pavadinimu.\nJÅ«sų įvestas komentaras neatsiras apraÅ¡ymo puslapyje.\nJei norite, kad jÅ«sų komentaras ten atsirastų, jums reikia jį pakeisti pačiam.\n[[$1|thumb]]", "fileexists-extension": "Failas su panaÅ¡iu pavadinimu jau yra: [[$2|thumb]]\n* Ä®keliamo failo pavadinimas: [[:$1]]\n* Jau esančio failo pavadinimas: [[:$2]]\nPraÅ¡ome pasirinkti kitą vardą.", - "fileexists-thumbnail-yes": "Failas turbÅ«t yra sumažinto dydžio failas ''(miniatiÅ«ra)''. [[$1|thumb]]\nPraÅ¡ome peržiÅ«rėti failą [[:$1]].\nJeigu tai yra toks pats pradinio dydžio paveikslėlis, tai įkelti papildomos miniatÅ«ros nereikia.", + "fileexists-thumbnail-yes": "Rinkmena turbÅ«t yra sumažinto dydžio ''(miniatiÅ«ra)''. [[$1|thumb]]\nPraÅ¡ome peržiÅ«rėti rinkmeną [[:$1]].\nJeigu tai yra toks pats pradinio dydžio paveikslėlis, tai įkelti papildomos miniatÅ«ros nereikia.", "file-thumbnail-no": "Failo pavadinimas prasideda $1.\nAtrodo, kad yra sumažinto dydžio paveikslėlis ''(miniatiÅ«ra)''.\nJei jÅ«s turite šį paveisklėlį pilna raiÅ¡ka, įkelkite Å¡itą, prieÅ¡ingu atveju praÅ¡ome pakeisti failo pavadinimą.", "fileexists-forbidden": "Failas tokiu pačiu vardu jau egzistuoja ir negali bÅ«ti perraÅ¡ytas;\npraÅ¡ome eiti atgal ir įkelti šį failą kitu vardu. [[File:$1|thumb|center|$1]]", "fileexists-shared-forbidden": "Failas tokiu vardu jau egzistuoja bendrojoje failų saugykloje;\nJei visvien norite įkelti savo failą, praÅ¡ome eiti atgal ir įkelti šį failą kitu vardu. [[File:$1|thumb|center|$1]]", @@ -1175,7 +1181,7 @@ "file-deleted-duplicate": "Failas, identiÅ¡kas Å¡iam failui ([[:$1]]), seniau buvo iÅ¡trintas. PrieÅ¡ įkeldami jį vėl patikrinkite Å¡io failo iÅ¡trynimo istoriją.", "uploadwarning": "Dėmesio", "uploadwarning-text": "PraÅ¡ome pakeisti failo apraÅ¡ymą ir bandykite dar kartą.", - "savefile": "IÅ¡saugoti failą", + "savefile": "IÅ¡saugoti rinkmeną", "uploaddisabled": "Ä®kėlimai uždrausti", "copyuploaddisabled": "Ä®kėlimas pagal URL iÅ¡jungtas.", "uploaddisabledtext": "Failų įkėlimai yra uždrausti.", @@ -1183,15 +1189,15 @@ "uploadscripted": "Å is failas turi HTML arba programinį kodą, kuris gali bÅ«ti klaidingai suprastas interneto narÅ¡yklės.", "uploadscriptednamespace": "Å is SVG failas turi neteisėtą vietą vardui '$1'", "uploadvirus": "Å iame faile yra virusas! Smulkiau: $1", - "uploadjava": "Failas yra ZIP failas, kuriame yra Java .class failas.\nÄ®kelti Java failus neleidžiama, nes jie gali padėti apeiti saugumo apribojimus.", - "upload-source": "Failo Å¡altinis", - "sourcefilename": "Ä®keliamas failas:", + "uploadjava": "Å i rinkmena tai ZIP rinkmena, kurioje yra Java .class rinkmena.\nÄ®kelti Java rinkmenų neleidžiama, nes jos gali padėti apeiti saugumo apribojimus.", + "upload-source": "Pradinė rinkmena", + "sourcefilename": "Ä®keliama rinkmena:", "sourceurl": "Å altinio adresas:", "destfilename": "Norimas failo vardas:", - "upload-maxfilesize": "Didžiausias failo dydis: $1", - "upload-description": "Failo apraÅ¡ymas", + "upload-maxfilesize": "Didžiausias rinkmenos dydis: $1", + "upload-description": "Rinkmenos apraÅ¡ymas", "upload-options": "Ä®kėlimo nustatymai", - "watchthisupload": "Stebėti šį failą", + "watchthisupload": "Stebėti Å¡ią rinkmeną", "filewasdeleted": "Failas Å¡iuo vardu anksčiau buvo įkeltas, o paskui iÅ¡trintas. Jums reikėtų patikrinti $1 prieÅ¡ bandant įkelti jį vėl.", "filename-bad-prefix": "JÅ«sų įkeliamas failas prasideda su '''„$1“''', bet tai yra neapibÅ«dinantis pavadinimas, dažniausiai priskirtas skaitmeninių kamerų. PraÅ¡ome suteikti labiau apibÅ«dinantį pavadinimą savo failui.", "upload-success-subj": "Ä®kelta sėkmingai", @@ -1276,7 +1282,7 @@ "nolicense": "Nepasirinkta", "license-nopreview": "(PeržiÅ«ra negalima)", "upload_source_url": " (tikras, vieÅ¡ai prieinamas URL)", - "upload_source_file": " (failas jÅ«sų kompiuteryje)", + "upload_source_file": "(pasirinkta rinkmena jÅ«sų kompiuteryje)", "listfiles-summary": "Å iame specialiame puslapyje rodomi visi įkelti failai.\nKai sąraÅ¡as susiaurinamas pagal naudotoją, rodomi tik tie failai, kurių naujausią versiją jis yra įkėlęs.", "listfiles_search_for": "IeÅ¡koti failo pavadinimo:", "imgfile": "failas", @@ -1291,7 +1297,7 @@ "listfiles-latestversion": "Dabartinė versija", "listfiles-latestversion-yes": "Taip", "listfiles-latestversion-no": "Ne", - "file-anchor-link": "Failas", + "file-anchor-link": "Rinkmena", "filehist": "Paveikslėlio istorija", "filehist-help": "Paspauskite ant datos/laiko, kad pamatytumėte failą tokį, koks jis buvo tuo metu.", "filehist-deleteall": "trinti visus", @@ -1304,21 +1310,21 @@ "filehist-nothumb": "Nėra miniatiÅ«ros", "filehist-user": "Naudotojas", "filehist-dimensions": "Matmenys", - "filehist-filesize": "Failo dydis", - "filehist-comment": "Komentaras", - "imagelinks": "Failų panaudojimas", + "filehist-filesize": "Rinkmenos dydis", + "filehist-comment": "PaaiÅ¡kinimas", + "imagelinks": "Rinkmenos naudojimas", "linkstoimage": "{{PLURAL:$1|Å is puslapis|Å ie puslapiai}} nurodo į šį failą:", "linkstoimage-more": "Daugiau nei $1 {{PLURAL:$1|puslapis|puslapiai|puslapių}} rodo į šį failą.\nÅ is sąraÅ¡as rodo tik {{PLURAL:$1|puslapio|pirmų $1 puslapių}} nuorodas į šį failą.\nYra pasiekiamas ir [[Special:WhatLinksHere/$2|visas sąraÅ¡as]].", - "nolinkstoimage": "Ä® failą nenurodo joks puslapis.", + "nolinkstoimage": "Ä® rinkmeną nenurodo joks puslapis.", "morelinkstoimage": "ŽiÅ«rėti [[Special:WhatLinksHere/$1|daugiau nuorodų]] į šį failą.", "linkstoimage-redirect": "$1 (failo peradresavimas) $2", "duplicatesoffile": "Å is failas turi {{PLURAL:$1|$1 dublikatą|$1 dublikatus|$1 dublikatų}} ([[Special:FileDuplicateSearch/$2|daugiau informacijos]]):", - "sharedupload": "Å is failas yra iÅ¡ $1 ir gali bÅ«ti naudojamas kituose projektuose.", + "sharedupload": "Å i rinkmena yra iÅ¡ $1 ir gali bÅ«ti naudojama kitose wiki svetainėse.", "sharedupload-desc-there": "Å is failas yra iÅ¡ $1 ir gali bÅ«ti naudojamas kituose projektuose.\nNorėdami sužinoti daugiau, žiÅ«rėkite [$2 failo apraÅ¡ymą].", "sharedupload-desc-here": "Å is failas yra iÅ¡ $1 ir gali bÅ«ti naudojamas kituose projektuose.\nInformacija iÅ¡ [$2 failo apraÅ¡ymo puslapio] yra pateikiama žemiau.", "filepage-nofile": "Joks failas su duotu pavadinimu neegzistuoja.", "filepage-nofile-link": "Joks failas su duotu pavadinimu neegzistuoja, bet vis dar galite [$1 jį įkelti].", - "uploadnewversion-linktext": "Ä®kelti naują failo versiją", + "uploadnewversion-linktext": "Ä®kelti naują Å¡ios rinkmenos atmainą", "shared-repo-from": "iÅ¡ $1", "shared-repo": "bendrosios failų saugyklos", "shared-repo-name-wikimediacommons": "Vikiteka", @@ -1332,7 +1338,7 @@ "filerevert-success": "'''[[Media:$1|$1]]''' buvo sugrąžintas į versiją $4 ($2, $3).", "filerevert-badversion": "Nėra jokių ankstesnių vietinių Å¡io failo versijų su pateiktu laiku.", "filedelete": "Trinti $1", - "filedelete-legend": "Trinti failą", + "filedelete-legend": "Trinti rinkmeną", "filedelete-intro": "JÅ«s ketinate iÅ¡trinti failą '''[[Media:$1|$1]]''' su visa istorija.", "filedelete-intro-old": "JÅ«s trinate '''[[Media:$1|$1]]''' [$4 $3, $2] versiją.", "filedelete-comment": "Priežastis:", @@ -1588,7 +1594,7 @@ "wlheader-enotif": "El. paÅ¡to praneÅ¡imai yra įjungti.", "wlheader-showupdated": "Puslapiai pakeisti nuo tada, kai paskutinį kartą apsilankėte juose, yra pažymėti '''pastorintai'''", "wlnote": "{{PLURAL:$1|Rodomas '''$1''' paskutinis pakeitimas, atliktas|Rodomi '''$1''' paskutiniai pakeitimai, atlikti|Rodoma '''$1''' paskutinių pakeitimų, atliktų}} per '''$2''' {{PLURAL:$2|paskutinę valandą|paskutines valandas|paskutinių valandų}}, nuo $3 $4.", - "wlshowlast": "Rodyti paskutinių $1 valandų, $2 dienų ar pakeitimus", + "wlshowlast": "Rodyti paskutinių $1 valandų, $2 dienų", "watchlist-options": "Stebimųjų sąraÅ¡o parinktys", "watching": "Ä®traukiama į stebimųjų sąrašą...", "unwatching": "Å alinama iÅ¡ stebimųjų sąraÅ¡o...", @@ -1642,7 +1648,7 @@ "rollbackfailed": "Atmetimas nepavyko", "cantrollback": "Negalima atmesti redagavimo; paskutinis keitęs naudotojas yra Å¡io puslapio autorius.", "alreadyrolled": "Nepavyko atmesti paskutinio [[User:$2|$2]] ([[User talk:$2|Aptarimas]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) daryto puslapio [[:$1]] keitimo;\nkažkas jau pakeitė puslapį arba suspėjo pirmas atmesti keitimą.\n\nPaskutimas keitimas darytas naudotojo [[User:$3|$3]] ([[User talk:$3|Aptarimas]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).", - "editcomment": "Redagavimo komentaras: „''$1''“.", + "editcomment": "Pateiktas toks keitimo paaiÅ¡kinimas: „''$1''“.", "revertpage": "Atmestas [[Special:Contributions/$2|$2]] ([[User talk:$2|Aptarimas]]) pakeitimas; sugrąžinta [[User:$1|$1]] versija", "revertpage-nouser": "Atversti pakeitimai paslėpto vartotojo, grąžino prieÅ¡ tai buvusią versiją {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Atmesti $1 pakeitimai;\ngrąžinta prieÅ¡ tai buvusi $2 versija.", @@ -1737,7 +1743,7 @@ "undelete-cleanup-error": "Klaida trinant nenaudotą archyvo failą „$1“.", "undelete-missing-filearchive": "Nepavyksta atkurti failo archyvo ID $1, nes jo nėra duomenų bazėje. Jis gali bÅ«ti jau atkurtas.", "undelete-error": "Klaida panaikinant puslapį", - "undelete-error-short": "Klaida atkuriant failą: $1", + "undelete-error-short": "Klaida atkuriant rinkmeną: $1", "undelete-error-long": "Ä®vyko klaidų atkuriant failą:\n\n$1", "undelete-show-file-confirm": "Ar tikrai norite peržiÅ«rėti iÅ¡trintą failo „$1“ $2 $3 versiją?", "undelete-show-file-submit": "Taip", @@ -1747,7 +1753,7 @@ "namespace_association": "Susijusi vardų sritis", "tooltip-namespace_association": "Ä®junkite Å¡ią parinktį, kad taip pat įtrauktumėte aptarimų arba temos sritį, susijusią su pasirinkta sritimi", "blanknamespace": "(Pagrindinė)", - "contributions": "{{GENDER:$1|Naudotojo}} įndėlis", + "contributions": "{{GENDER:$1|Naudotojo}} indėlis", "contributions-title": "{{GENDER:$1|Naudotojo|Naudotojos}} $1 indėlis", "mycontris": "Ä®naÅ¡ai", "contribsub2": "Dėl {{GENDER:$3|$1}} ($2)", @@ -1769,6 +1775,7 @@ "sp-contributions-search": "IeÅ¡koti įnaÅ¡o", "sp-contributions-username": "IP adresas arba naudotojo vardas:", "sp-contributions-toponly": "Rodyti tik paskutinius keitimus", + "sp-contributions-newonly": "Rodyti tik tuos keitimus, kuriais sukurti nauji straipsniai", "sp-contributions-submit": "IeÅ¡koti", "whatlinkshere": "Susiję puslapiai", "whatlinkshere-title": "Puslapiai, kurie nurodo į „$1“", @@ -1958,7 +1965,7 @@ "move-leave-redirect": "Pervadinant palikti nukreipimą", "protectedpagemovewarning": "'''Dėmesio:''' Å is puslapis buvo užrakintas, kad tik naudotojai su administratoriaus teisėmis galėtų jį pervadinti.\nNaujausias įraÅ¡as žurnale yra pateiktas žemiau:", "semiprotectedpagemovewarning": "'''Pastaba''': Å is puslapis buvo užrakintas, kad tik registruoti naudotojai galėtų jį redaguoti.\nNaujausias įraÅ¡as žurnale yra pateiktas žemiau:", - "move-over-sharedrepo": "== Failas jau yra ==\n[[:$1]] egzistuoja bendrojoje saugykloje. Perkėlus failą į šį pavadinimą, jis pakeis bendrąjį failą.", + "move-over-sharedrepo": "== Rinkmena jau yra ==\n[[:$1]] esti bendrojoje saugykloje. Ä®kėlus rinkmeną Å¡iuo pavadinimu, ji pakeis bendrąją rinkmeną.", "file-exists-sharedrepo": "Pasirinktas failo pavadinimas jau yra naudojamas bendrojoje saugykloje.\nPraÅ¡ome pasirinkti kitą pavadinimą.", "export": "Eksportuoti puslapius", "exporttext": "Galite eksportuoti vieno puslapio tekstą ir istoriją ar kelių puslapių vienu metu tame pačiame XML atsakyme.\nÅ ie puslapiai galės bÅ«ti importuojami į kitą projektą, veikiantį MediaWiki pagrindu, per [[Special:Import|importo puslapį]].\n\nNorėdami eksportuoti puslapius, įveskite pavadinimus žemiau esančiame tekstiniame lauke po vieną pavadinimą eilutėje, taip pat pasirinkite ar norite eksportuoti ir istoriją ar tik dabartinę versiją su paskutinio redagavimo informacija.\n\nPastaruoju atveju, jÅ«s taip pat galite naudoti nuorodą, pvz. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] puslapiui „[[{{MediaWiki:Mainpage}}]]“.", @@ -1981,11 +1988,11 @@ "allmessagestext": "Čia pateikiamas sisteminių praneÅ¡imų sąraÅ¡as, esančių MediaWiki vardų srityje.\nAplankykite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation „MediaWiki“ lokaliziciją] ir [//translatewiki.net „translatewiki.net“], jei norite prisidėti prie bendrojo „MediaWiki“ lokalizavimo.", "allmessagesnotsupportedDB": "Å is puslapis nepalaikomas, nes nuostata '''$wgUseDatabaseMessages''' yra iÅ¡jungtas.", "allmessages-filter-legend": "Filtras", - "allmessages-filter": "Filtruoti pagal bÅ«seną:", + "allmessages-filter": "PerkoÅ¡ti pagal bÅ«seną:", "allmessages-filter-unmodified": "Nepakeisti", "allmessages-filter-all": "Visi", "allmessages-filter-modified": "Pakeisti", - "allmessages-prefix": "Filtruoti pagal pradžią:", + "allmessages-prefix": "PerkoÅ¡ti pagal pradžią:", "allmessages-language": "Kalba:", "allmessages-filter-submit": "Rodyti", "thumbnail-more": "Padidinti", @@ -2010,7 +2017,7 @@ "import-interwiki-namespace": "Paskirties vardų sritis:", "import-interwiki-rootpage": "Paskirties namų puslapis (pasirinktinai):", "import-upload-filename": "Failo pavadinimas:", - "import-comment": "Komentaras:", + "import-comment": "PaaiÅ¡kinimas:", "importtext": "PraÅ¡ome eksportuoti iÅ¡ projekto-Å¡altinio failo, naudojant [[Special:Export|eksportavimo pagalbininką.]]\nIÅ¡saugokite jį savo kompiuteryje ir įkelkite jį čia.", "importstart": "Imporuojami puslapiai...", "import-revision-count": "$1 {{PLURAL:$1|versija|versijos|versijų}}", @@ -2194,7 +2201,7 @@ "patrol-log-header": "Tai patvirtintų versijų sąraÅ¡as.", "log-show-hide-patrol": "$1 patvirtinimų sąrašą", "deletedrevision": "IÅ¡trinta sena versija $1", - "filedeleteerror-short": "Klaida trinant failą: $1", + "filedeleteerror-short": "Klaida trinant rinkmeną: $1", "filedeleteerror-long": "Ä®vyko klaidų trinant failą:\n\n$1", "filedelete-missing": "Failas „$1“ negali bÅ«ti iÅ¡trintas, nes jo nėra.", "filedelete-old-unregistered": "Nurodytos failo versijos „$1“ nėra duomenų bazėje.", @@ -2206,15 +2213,15 @@ "imagemaxsize": "Riboti paveikslėlių dydį:
''(failų aprašymo puslapiuose)''", "thumbsize": "Sumažintų paveikslėlių dydis:", "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|puslapis|puslapiai|puslapių}}", - "file-info": "failo dydis: $1, MIME tipas: $2", + "file-info": "rinkmenos dydis: $1, MIME tipas: $2", "file-info-size": "$1 × $2 taškų, failo dydis: $3, MIME tipas: $4", - "file-info-size-pages": "$1 × $2 taškų, failo dydis: $3, MIME tipas: $4, $5 {{PLURAL:$5|page|pages}}", + "file-info-size-pages": "$1 × $2 taškų, rinkmenos dydis: $3, MIME tipas: $4, $5 {{PLURAL:$5|puslapis|puslapiai|puslapių}}", "file-nohires": "Geresnė raiška negalima.", "svg-long-desc": "SVG failas, formaliai $1 × $2 taškų, failo dydis: $3", "svg-long-desc-animated": "Animuotas SVG failas, formaliai $1 × $2 pikselių, failo dydis: $3", "svg-long-error": "Neleistinas SVG failas: $1", - "show-big-image": "Originalus failas", - "show-big-image-preview": "Sumažintos iliustracijos dydis: $1 .", + "show-big-image": "Pradinė rinkmena", + "show-big-image-preview": "Šios peržiūros dydis: $1 .", "show-big-image-other": "{{PLURAL:$2|Kita rezoliucija|Kitos $2 rezoliucijos|Kitų $2 rezoliucijų}}: $1 .", "show-big-image-size": "$1 × $2 taškų", "file-info-gif-looped": "ciklinis", @@ -2425,7 +2432,7 @@ "exif-pngfilecomment": "JPEG failo komentaras", "exif-disclaimer": "Atsakomybės apribojimas", "exif-contentwarning": "Turinio įspėjimas", - "exif-giffilecomment": "GIF failo komentaras", + "exif-giffilecomment": "GIF rinkmenos paaiškinimas", "exif-intellectualgenre": "Elemento tipas", "exif-subjectnewscode": "Objektas kodas", "exif-scenecode": "IPTC scenos kodas", @@ -2669,6 +2676,7 @@ "watchlistedit-raw-done": "Jūsų stebimųjų sąrašas buvo atnaujintas.", "watchlistedit-raw-added": "$1 {{PLURAL:$1|puslapis buvo pridėtas|puslapiai buvo pridėti|puslapių buvo pridėta}}:", "watchlistedit-raw-removed": "$1 {{PLURAL:$1|puslapis buvo pašalintas|puslapiai buvo pašalinti|puslapių buvo pašalinta}}:", + "watchlisttools-clear": "Išvalyti stebimųjų sąrašą", "watchlisttools-view": "Rodyti susijusius keitimus", "watchlisttools-edit": "Rodyti ir redaguoti stebimųjų sąrašą", "watchlisttools-raw": "Redaguoti grynąjį sąrašą", @@ -2812,7 +2820,7 @@ "logentry-rights-rights-legacy": "$1 {{GENDER:$2|pakeista}} narystė grupėje $3", "logentry-rights-autopromote": "$1 buvo automatiškai {{GENDER:$2|pervestas}} iš $4 į $5", "rightsnone": "(jokių)", - "revdelete-summary": "keitimo komentaras", + "revdelete-summary": "keitimo paaiškinimas", "feedback-bugornote": "Jei jūs esate pasirengę aprašyti techninę problemą išsamiau, [$1 praneškite apie programinę klaidą].\nKitu atveju, galite naudotis žemiau esančia paprastesne forma. Jūsų komentaras bus įtrauktas į puslapį „[$3 $2]“, kartu su jūsų naudotojo vardu ir jūsų naudojama naršykle.", "feedback-subject": "Tema:", "feedback-message": "Pranešimas:", diff --git a/languages/i18n/mk.json b/languages/i18n/mk.json index 1798e4ecf5..073d1c1a80 100644 --- a/languages/i18n/mk.json +++ b/languages/i18n/mk.json @@ -183,9 +183,9 @@ "view": "Преглед", "view-foreign": "Погл. на $1", "edit": "Уреди", - "edit-local": "Уреди локален опис", + "edit-local": "Уреди месен опис", "create": "Создај", - "create-local": "Додај локален опис", + "create-local": "Додај месен опис", "editthispage": "Уреди ја страницава", "create-this-page": "Создај ја страницава", "delete": "Избриши", @@ -666,6 +666,8 @@ "content-model-text": "прост текст", "content-model-javascript": "JavaScript", "content-model-css": "CSS", + "duplicate-args-category": "Страници што користат дуплирани аргументи во повикувања на шаблони", + "duplicate-args-category-desc": "Страницава содржи повикувања на шаблони кои се дупликати на аргументи, како што се {{foo|bar=1|bar=2}} или {{foo|bar|1=baz}}.", "expensive-parserfunction-warning": "Предупредување: Оваа страница користи премногу повикувања на parser функции.\n\nТреба да има помалку од $2 {{PLURAL:$2|повикување|повикувања}} а сега има {{PLURAL:$1|$1 повикување|$1 повикувања}}.", "expensive-parserfunction-category": "Страници со премногу повикувања на парсер функции", "post-expand-template-inclusion-warning": "'''Предупредување:''' Големината на вклучените шаблони е преголема.\nНекои шаблони нема да бидат вклучени.", @@ -908,7 +910,7 @@ "prefs-help-watchlist-token2": "Ова е тајна шифра за вашиот канализиран список на набљудувања.\nСекој што ја знае ќе може да ја чита, па затоа ви препорачуваме да не ја кажувате никому.\n[[Special:ResetTokens|Стиснете тука ако треба да зададете нова]].", "savedprefs": "Вашите нагодувања се зачувани.", "timezonelegend": "Часовен појас:", - "localtime": "Локално време:", + "localtime": "Месно време:", "timezoneuseserverdefault": "Од викито ($1)", "timezoneuseoffset": "Друго (посочете отстапување)", "servertime": "Време на опслужувачот:", @@ -951,7 +953,7 @@ "gender-female": "Таа уредува викистраници", "prefs-help-gender": "Оваа поставка е незадолжителна.\nПрограмот го користи посочениот род за да ве опишува согласно вашиот пол.\nИнформацијата ќе биде јавна.", "email": "Е-пошта", - "prefs-help-realname": "'''Вистинското име''' е незадолжително.\nДоколку изберете да го внесете, тоа може да се искористи за оддавање на заслуги за Вашата работа.", + "prefs-help-realname": "Вистинското име е незадолжително.\nДоколку изберете да го внесете, тоа може да се искористи за оддавање на заслуги за Вашата работа.", "prefs-help-email": "Е-поштата е незадолжителна, но ќе ви треба за добивање на нова лозинка ако си ја заборавите постоечката.", "prefs-help-email-others": "Можете да изберете другите да ве контактираат преку вашата корисничка страница без да го откриете вашиот идентитет.", "prefs-help-email-required": "Е-поштенска адреса е задолжително да се наведе.", @@ -1031,7 +1033,7 @@ "right-upload": "Подигни податотеки", "right-reupload": "Заменување на постоечки податотеки", "right-reupload-own": "Преснимување на постоечка податотека подигната од вас", - "right-reupload-shared": "Презапис на едни податотеки врз други на заедничкото мултимедијално складиште локално", + "right-reupload-shared": "Презапис на едни податотеки врз други на заедничкото мултимедијално складиште месно", "right-upload_by_url": "Подигање на податотека од URL-адреса", "right-purge": "Бришење од опслужувачки меѓусклад на страницата без барање потврда за тоа", "right-autoconfirmed": "Без ограничувања на стапки за IP-адреса", @@ -1447,7 +1449,7 @@ "unwatchedpages": "Ненабљудувани страници", "listredirects": "Список на пренасочувања", "listduplicatedfiles": "Список на податотеки со дупликати", - "listduplicatedfiles-summary": "Ова е список на податотеки чија најнова верзија е дупликат на најнова верзија на некоја друга податотека. Се земаат предвид само локални податотеки.", + "listduplicatedfiles-summary": "Ова е список на податотеки чија најнова верзија е дупликат на најнова верзија на некоја друга податотека. Се земаат предвид само месни податотеки.", "listduplicatedfiles-entry": "[[:File:$1|$1]] има [[$3|{{PLURAL:$2|дупликат|$2 дупликати}}]].", "unusedtemplates": "Неискористени шаблони", "unusedtemplatestext": "Оваа страница ги прикажува сите страници во именскиот простор {{ns:template}} кои не се вклучени во друга страница.\nНе заборавајте да ги проверите другите врски во шаблоните пред да ги избришете.", @@ -1982,7 +1984,7 @@ "blocklist-params": "Параметри на блокот", "blocklist-reason": "Причина", "ipblocklist-submit": "Пребарај", - "ipblocklist-localblock": "Локален блок", + "ipblocklist-localblock": "Месен блок", "ipblocklist-otherblocks": "{{PLURAL:$1|друг блок|други блокови}}", "infiniteblock": "бесконечно", "expiringblock": "истекува на $1 во $2 ч.", @@ -2987,6 +2989,7 @@ "unknown_extension_tag": "Непозната ознака на додатокот „$1“", "duplicate-defaultsort": "Предупредување: Основниот клуч за подредување „$2“ го поништува претходниот основен клуч за подредување „$1“.", "duplicate-displaytitle": "Предупредување: Приказниот наслов „$2“ го заменува претходнито приказен наслов „$1“.", + "invalid-indicator-name": "Грешка: Атрибутот name што го покажува статусот на страницата не може да биде празен.", "version": "Верзија", "version-extensions": "Воспоставени додатоци", "version-skins": "Воспоставени рува", diff --git a/languages/i18n/ml.json b/languages/i18n/ml.json index 4c7f52f1ed..e25bafa9a7 100644 --- a/languages/i18n/ml.json +++ b/languages/i18n/ml.json @@ -672,6 +672,8 @@ "content-model-text": "വെറും എഴുത്ത്", "content-model-javascript": "ജാവാസ്ക്രിപ്റ്റ്", "content-model-css": "സി.എസ്.എസ്.", + "duplicate-args-category": "ഫലകങ്ങൾ വിളിക്കുമ്പോൾ ചരങ്ങൾ ആവർത്തിച്ചുപയോഗിക്കുന്ന താളുകൾ", + "duplicate-args-category-desc": "താളിൽ ഫലകങ്ങൾ വിളിക്കുമ്പോൾ ചരങ്ങൾ അതായത് {{foo|bar=1|bar=2}} അല്ലെങ്കിൽ {{foo|bar|1=baz}} എന്ന രീതിയിൽ.", "expensive-parserfunction-warning": "'''മുന്നറിയിപ്പ്:''' ഈ താളിൽ വളരെക്കൂടുതൽ പാഴ്സർ ഫങ്ഷനുകൾ വിളിച്ചിരിക്കുന്നു.\n\n{{PLURAL:$2|ഒരു വിളി|$2 വിളികൾ}} മാത്രമുണ്ടാകേണ്ടയിടത്ത്, ഇപ്പോൾ {{PLURAL:$1|ഒരു വിളി|$1 വിളികൾ}} ഉണ്ട്.", "expensive-parserfunction-category": "വളരെയധികം ചിലവേറിയ പാഴ്സർ ഫങ്ഷൻ വിളികൾ ഉൾക്കൊള്ളുന്ന താളുകൾ", "post-expand-template-inclusion-warning": "'''അറിയിപ്പ്:''' ഫലകം ഉൾപ്പെടുത്താവുന്ന വലിപ്പത്തിലും വളരെ കൂടുതൽ ആയിരിക്കുന്നു.\nചില ഫലകങ്ങൾ ഉൾപ്പെടുത്തുകയില്ല.", @@ -957,7 +959,7 @@ "gender-female": "സ്ത്രീ", "prefs-help-gender": "ഈ സജ്ജീകരണം നിർബന്ധമല്ല.\nസോഫ്റ്റ്‌വെയർ ഉപയോഗിച്ച് സ്ത്രീകളേയും പുരുഷന്മാരേയും ശരിയായി സംബോധന ചെയ്യാൻ ഉപയോഗിക്കുന്നു.\nഈ വിവരം പരസ്യമായി ലഭ്യമായിരിക്കുന്നതാണ്‌.", "email": "ഇമെയിൽ", - "prefs-help-realname": "താങ്കളുടെ യഥാർത്ഥ പേര്‌ നൽകണമെന്നു നിർബന്ധമില്ല. എങ്കിലും അങ്ങനെ ചെയ്താൽ താങ്കളുടെ സംഭാവനകൾ ആ പേരിൽ അംഗീകരിക്കപ്പെടും.", + "prefs-help-realname": "താങ്കളുടെ യഥാർത്ഥ പേര്‌ നൽകണമെന്നു നിർബന്ധമില്ല.\nഎന്നാൽ അങ്ങനെ ചെയ്താൽ താങ്കളുടെ സംഭാവനകൾ ആ പേരിൽ അംഗീകരിക്കപ്പെടുന്നതാണ്.", "prefs-help-email": "ഇമെയിൽ വിലാസം നൽകണമെന്ന് നിർബന്ധമില്ല, പക്ഷേ താങ്കൾ രഹസ്യവാക്ക് മറന്നാൽ പുതിയത് അയച്ചു തരാൻ വിലാസം ആവശ്യമാണ്.", "prefs-help-email-others": "താങ്കൾക്കായുള്ള താളിൽ നിന്നോ, താങ്കൾക്കുള്ള സന്ദേശങ്ങളുടെ താളിൽ നിന്നോ മറ്റുപയോക്താക്കൾക്ക് താങ്കളുടെ വ്യക്തിത്വം മനസ്സിലാക്കാതെ തന്നെ താങ്കൾക്ക് സന്ദേശങ്ങളയയ്ക്കാനും ഈ സം‌വിധാനം അവസരം നൽകുന്നു.", "prefs-help-email-required": "ഇമെയിൽ വിലാസം ആവശ്യമാണ്‌.", @@ -2245,6 +2247,7 @@ "tooltip-feed-atom": "ഈ താളിന്റെ ആറ്റം ഫീഡ്", "tooltip-t-contributions": "ഉപയോക്താവിന്റെ സംഭാവനകളുടെ പട്ടിക കാണുക", "tooltip-t-emailuser": "ഈ ഉപയോക്താവിനു ഇമെയിൽ അയക്കുക", + "tooltip-t-info": "ഈ താളിനെക്കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾ", "tooltip-t-upload": "പ്രമാണങ്ങൾ അപ്‌ലോഡ് ചെയ്യുവാൻ", "tooltip-t-specialpages": "പ്രത്യേകതാളുകളുടെ പട്ടിക", "tooltip-t-print": "ഈ താളിന്റെ അച്ചടി രൂപം", diff --git a/languages/i18n/ms.json b/languages/i18n/ms.json index cc0a9d5d91..74de4eec7c 100644 --- a/languages/i18n/ms.json +++ b/languages/i18n/ms.json @@ -669,6 +669,8 @@ "content-model-text": "teks biasa", "content-model-javascript": "JavaScript", "content-model-css": "CSS", + "duplicate-args-category": "Laman yang menggunakan argumen pendua dalam panggilan templat", + "duplicate-args-category-desc": "Laman ini mengandungi panggilan templat yang menggunakan pendua argumen seperti {{foo|bar=1|bar=2}} atau {{foo|bar|1=baz}}.", "expensive-parserfunction-warning": "Amaran: Laman ini mengandungi terlalu banyak panggilan fungsi penghurai yang intensif.\n\nHad panggilan ialah $2, sekarang terdapat $1 panggilan.", "expensive-parserfunction-category": "Laman yang mengandungi terlalu banyak panggilan fungsi penghurai yang intensif", "post-expand-template-inclusion-warning": "Amaran: Saiz penyertaan templat terlalu besar.\nSesetengah templat tidak akan disertakan.", @@ -956,7 +958,7 @@ "gender-female": "Perempuan", "prefs-help-gender": "Pilihan: Digunakan oleh perisian ini untuk merujuk jantina anda dengan betul. Maklumat ini akan didedahkan kepada awam.", "email": "E-mel", - "prefs-help-realname": "Nama sebenar adalah tidak wajib. Jika dinyatakan, ia akan digunakan untuk mengiktiraf karya anda.", + "prefs-help-realname": "Nama sebenar adalah tidak wajib.\n\nJika dinyatakan, ia akan digunakan untuk mengiktiraf karya anda.", "prefs-help-email": "Alamat e-mail adalah tidak wajib, tapi diperlukan untuk set semula kata laluan jika anda terlupa kata laluan anda.", "prefs-help-email-others": "Anda juga boleh memilih untuk membolehkan pengguna lain menghubungi anda melalui e-mel melalui sebuah pautan pada laman pengguna atau perbincangan anda.\nAlamat e-mel anda tidak didedahkan apabila pengguna lain menghubungi anda.", "prefs-help-email-required": "Alamat e-mel adalah wajib.", @@ -2222,6 +2224,7 @@ "tooltip-pt-mycontris": "Senarai sumbangan anda", "tooltip-pt-login": "Walaupun tidak wajib, anda digalakkan supaya log masuk.", "tooltip-pt-logout": "Log keluar", + "tooltip-pt-createaccount": "Anda digalakkan untuk membuka akaun dan log masuk; namun begitu ianya tidak diwajibkan", "tooltip-ca-talk": "Perbincangan mengenai laman kandungan", "tooltip-ca-edit": "Anda boleh menyunting laman ini. Sila tekan butang 'pralihat' terlebih dahulu sebelum menyimpan.", "tooltip-ca-addsection": "Buka bahagian baru", @@ -2251,6 +2254,7 @@ "tooltip-feed-atom": "Suapan Atom bagi laman ini", "tooltip-t-contributions": "Lihat senarai sumbangan pengguna ini", "tooltip-t-emailuser": "Kirim e-mel kepada pengguna ini", + "tooltip-t-info": "Maklumat lanjut mengenai laman ini", "tooltip-t-upload": "Muat naik imej atau fail media", "tooltip-t-specialpages": "Senarai laman khas", "tooltip-t-print": "Versi boleh cetak bagi laman ini", diff --git a/languages/i18n/nb.json b/languages/i18n/nb.json index 8b72bad289..84736a20f5 100644 --- a/languages/i18n/nb.json +++ b/languages/i18n/nb.json @@ -685,6 +685,7 @@ "content-model-text": "Ren tekst", "content-model-javascript": "JavaScript", "content-model-css": "CSS", + "duplicate-args-category": "Sider med like argumenter i malkall", "expensive-parserfunction-warning": "Advarsel: Denne siden inneholder for mange prosesskrevende parserfunksjoner.\n\nDet burde være mindre enn {{PLURAL:$2|$2|$2}}, men er nå {{PLURAL:$1|$1|$1}}..", "expensive-parserfunction-category": "Sider med for mange prosesskrevende parserfunksjoner", "post-expand-template-inclusion-warning": "Advarsel: Størrelsen på inkluderte maler er for stor.\nNoen maler vil ikke bli inkludert.", @@ -1597,6 +1598,7 @@ "pager-older-n": "{{PLURAL:$1|1 eldre|$1 eldre}}", "suppress": "Historikkrydding", "querypage-disabled": "Denne spesialsiden er deaktivert av ytelsesårsaker.", + "apihelp": "API hjelp", "booksources": "Bokkilder", "booksources-search-legend": "Søk etter bokkilder", "booksources-search": "Søk", @@ -3169,6 +3171,9 @@ "mediastatistics-header-drawing": "Tegninger (vektor-bilder)", "mediastatistics-header-audio": "Lyd", "mediastatistics-header-video": "Videoer", + "mediastatistics-header-multimedia": "Rikt media", + "mediastatistics-header-office": "Kontor", + "mediastatistics-header-text": "Tekstlig", "mediastatistics-header-executable": "Kjørbare filer", "mediastatistics-header-archive": "Komprimerte formater", "json-warn-trailing-comma": "$1 etterfølgende {{PLURAL:$1|komma|kommaer}} ble fjernet fra JSON", diff --git a/languages/i18n/nl.json b/languages/i18n/nl.json index fa1687c4cf..4ca1c1bb86 100644 --- a/languages/i18n/nl.json +++ b/languages/i18n/nl.json @@ -2281,6 +2281,7 @@ "tooltip-feed-atom": "Atom-feed voor deze pagina", "tooltip-t-contributions": "Een lijst met bijdragen van deze gebruiker", "tooltip-t-emailuser": "Een e-mail naar deze gebruiker verzenden", + "tooltip-t-info": "Meer informatie over deze pagina", "tooltip-t-upload": "Bestanden uploaden", "tooltip-t-specialpages": "Lijst met alle speciale pagina's", "tooltip-t-print": "Printvriendelijke versie van deze pagina", diff --git a/languages/i18n/nn.json b/languages/i18n/nn.json index 1d464d2047..9bcd584435 100644 --- a/languages/i18n/nn.json +++ b/languages/i18n/nn.json @@ -304,7 +304,7 @@ "nospecialpagetext": "Du har bede om ei spesialside som ikkje finst. Lista over spesialsider finn du [[Special:SpecialPages|her]].", "error": "Feil", "databaseerror": "Databasefeil", - "databaseerror-text": "Ein spørjefeil mot databasa har oppstått.\nDette kan indikere ein feil i programvara.", + "databaseerror-text": "Ein spørjefeil mot databasen har oppstått.\nDette kan indikere ein feil i programvara.", "databaseerror-error": "Feil: $1", "laggedslavemode": "Åtvaring: Det er mogleg at sida ikkje er heilt oppdatert.", "readonly": "Databasen er skriveverna", diff --git a/languages/i18n/pl.json b/languages/i18n/pl.json index 613dcfb8b6..3920e40767 100644 --- a/languages/i18n/pl.json +++ b/languages/i18n/pl.json @@ -67,11 +67,13 @@ "아라", "Matik7", "Vengir", - "Darellur" + "Darellur", + "Michał Sobkowski", + "Py64" ] }, "tog-underline": "Podkreślenie linków:", - "tog-hideminor": "Ukryj drobne edycje w ostatnich zmianach", + "tog-hideminor": "Ukryj drobne edycje z ostatnich zmian", "tog-hidepatrolled": "Ukryj sprawdzone edycje w ostatnich zmianach", "tog-newpageshidepatrolled": "Ukryj sprawdzone strony na liście nowych stron", "tog-extendwatchlist": "Pokaż na liście obserwowanych wszystkie zmiany, nie tylko ostatnie", @@ -183,7 +185,7 @@ "category_header": "Strony w kategorii „$1”", "subcategories": "Podkategorie", "category-media-header": "Pliki w kategorii „$1”", - "category-empty": "Obecnie w tej kategorii brak stron oraz plików.", + "category-empty": "Obecnie w tej kategorii nie ma stron ani plików.", "hidden-categories": "{{PLURAL:$1|Ukryta kategoria|Ukryte kategorie}}", "hidden-category-category": "Ukryte kategorie", "category-subcat-count": "{{PLURAL:$2|Ta kategoria ma tylko jedną podkategorię.|Poniżej wyświetlono $1 spośród wszystkich $2 podkategorii tej kategorii.}}", @@ -257,7 +259,7 @@ "personaltools": "Osobiste", "articlepage": "Artykuł", "talk": "Dyskusja", - "views": "Widok", + "views": "Wyświetleń", "toolbox": "Narzędzia", "userpage": "Strona użytkownika", "projectpage": "Strona projektu", @@ -275,8 +277,8 @@ "viewcount": "Tę stronę obejrzano {{PLURAL:$1|tylko raz|$1 razy}}.", "protectedpage": "Strona zabezpieczona", "jumpto": "Skocz do:", - "jumptonavigation": "nawigacji", - "jumptosearch": "wyszukiwania", + "jumptonavigation": "nawigacja", + "jumptosearch": "szukaj", "view-pool-error": "Niestety w chwili obecnej serwery są przeciążone.\nZbyt wielu użytkowników próbuje wyświetlić tę stronę.\nPoczekaj chwilę przed ponowną próbą dostępu do tej strony.\n\n$1", "generic-pool-error": "Niestety w chwili obecnej serwery są przeciążone.\nZbyt wielu użytkowników próbuje wyświetlić tę stronę.\nPoczekaj chwilę przed ponowną próbą dostępu do tej strony.", "pool-timeout": "Zbyt długi czas oczekiwania na blokadę", @@ -613,7 +615,7 @@ "showpreview": "Pokaż podgląd", "showdiff": "Podgląd zmian", "blankarticle": "Uwaga: Strona, którą masz zamiar utworzyć jest pusta.\nJeżeli klikniesz \"{{int:savearticle}}\" ponownie, strona zostanie utworzona bez jakiejkolwiek treści.", - "anoneditwarning": "'''Uwaga:''' Nie jesteś {{GENDER:|zalogowany|zalogowana}}.\nTwój adres IP zostanie zapisany w historii edycji strony.", + "anoneditwarning": "Uwaga: Nie jesteś zalogowany. Twój adres IP będzie publicznie widoczny jeśli zrobisz dowolną zmianę. Jeśli [$1 zalogujesz się] lub [$2 stworzysz konto], Twoje zmiany zostaną przypisane do konta, wraz z innymi korzyściami.", "anonpreviewwarning": "''Nie jesteś zalogowany. Jeśli zapiszesz zmiany, w historii edycji strony zostanie umieszczony Twój adres IP.''", "missingsummary": "'''Uwaga:''' Nie wprowadz{{GENDER:|iłeś|iłaś|ono}} opisu zmian.\nJeżeli nie chcesz go wprowadzać, naciśnij przycisk „Zapisz” jeszcze raz.", "missingcommenttext": "Wprowadź komentarz poniżej.", @@ -714,6 +716,8 @@ "content-model-text": "zwykły tekst", "content-model-javascript": "JavaScript", "content-model-css": "CSS", + "duplicate-args-category": "Strony używają duplikaty argumentów w odwołaniach do szablonów.", + "duplicate-args-category-desc": "Strona zawiera szablony, które używają duplikaty argumentów, jak {{foo|bar=1|bar=2}} lub {{foo|bar|1=baz}}", "expensive-parserfunction-warning": "Uwaga! Ta strona zawiera zbyt wiele wywołań złożonych obliczeniowo funkcji parsera.\n\nPowinno być mniej niż $2 {{PLURAL:$2|wywołanie|wywołania|wywołań}}, a obecnie {{PLURAL:$1|jest $1 wywołanie|są $1 wywołania|jest $1 wywołań}}.", "expensive-parserfunction-category": "Strony ze zbyt dużą liczbą wywołań kosztownych funkcji parsera", "post-expand-template-inclusion-warning": "Uwaga – zbyt duża wielkość wykorzystanych szablonów.\nNiektóre szablony nie zostaną użyte.", @@ -999,7 +1003,7 @@ "gender-female": "kobieta", "prefs-help-gender": "Podanie płci nie jest obowiązkowe. Jeśli zdecydujesz się ją określić, oprogramowanie dostosuje do niej interfejs. Informacja o Twojej płci będzie widoczna dla wszystkich.", "email": "E‐mail", - "prefs-help-realname": "Wpisanie imienia i nazwiska nie jest obowiązkowe.\nJeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje autorstwo.", + "prefs-help-realname": "Imię i nazwisko jest opcjonalne.\nJeśli je podasz, to może być stosowane w celu przypisania Twojej pracy.", "prefs-help-email": "Podanie adresu e‐mail nie jest obowiązkowe, lecz jest konieczne do zresetowania zapomnianego hasła.", "prefs-help-email-others": "Możesz również umożliwić innym użytkownikom wysłanie do Ciebie e‐maila poprzez Twoją stronę użytkownika lub stronę dyskusji (bez ujawniania Twojego adresu).", "prefs-help-email-required": "Wymagany jest adres e‐mail.", @@ -1627,6 +1631,8 @@ "pager-older-n": "{{PLURAL:$1|1 starszy|$1 starsze|$1 starszych}}", "suppress": "Rewizor", "querypage-disabled": "Ta strona specjalna została wyłączona ze względu na ograniczenia wydajności.", + "apihelp": "Pomoc API", + "apihelp-no-such-module": "Moduł \"$1\" nie znaleziony.", "booksources": "Książki", "booksources-search-legend": "Szukaj informacji o książkach", "booksources-search": "Szukaj", @@ -2260,6 +2266,7 @@ "tooltip-pt-mycontris": "Lista moich edycji", "tooltip-pt-login": "Zachęcamy do zalogowania się, choć nie jest to obowiązkowe.", "tooltip-pt-logout": "Wyloguj", + "tooltip-pt-createaccount": "Zachęcamy do stworzenia konta i zalogowania, ale nie jest to konieczne.", "tooltip-ca-talk": "Dyskusja o zawartości tej strony", "tooltip-ca-edit": "Możesz edytować tę stronę. Przed zapisaniem zmian użyj przycisku podgląd.", "tooltip-ca-addsection": "Dodaj nowy wątek.", @@ -2289,6 +2296,7 @@ "tooltip-feed-atom": "Kanał Atom dla tej strony", "tooltip-t-contributions": "Pokaż listę edycji tego użytkownika", "tooltip-t-emailuser": "Wyślij e‐mail do tego użytkownika", + "tooltip-t-info": "Więcej informacji na temat tej strony", "tooltip-t-upload": "Prześlij plik", "tooltip-t-specialpages": "Lista wszystkich specjalnych stron", "tooltip-t-print": "Wersja do wydruku", @@ -3122,7 +3130,7 @@ "searchsuggest-search": "Szukaj", "searchsuggest-containing": "zawierające...", "api-error-badaccess-groups": "Nie masz uprawnień aby przesyłać pliki do tej wiki.", - "api-error-badtoken": "Błąd wewnętrzny – żeton wykorzystywany do identyfikacji użytkownika jest nieprawidłowy.", + "api-error-badtoken": "Błąd wewnętrzny – znacznik wykorzystywany do identyfikacji użytkownika jest nieprawidłowy.", "api-error-copyuploaddisabled": "Przesyłanie poprzez podanie adresu URL zostało na tym serwerze wyłączone.", "api-error-duplicate": "{{PLURAL:$1|Jest już [$2 inny plik]|Są już [$2 inne pliki]}} o tej samej zawartości", "api-error-duplicate-archive": "{{PLURAL:$1|Był już [$2 inny plik]|Były już [$2 inne pliki]}} o takiej samej zawartości, ale {{PLURAL:$1|został usunięty|zostały usunięte}}.", diff --git a/languages/i18n/pms.json b/languages/i18n/pms.json index 2fae44f085..6da229ee01 100644 --- a/languages/i18n/pms.json +++ b/languages/i18n/pms.json @@ -659,6 +659,7 @@ "content-model-text": "mach test", "content-model-javascript": "JavaScript", "content-model-css": "CSS", + "duplicate-args-category": "Pàgine ch'a deuvro d'argoment dobi ant j'arceste dë stamp", "expensive-parserfunction-warning": "'''Atension:''' Costa pàgina a l'ha tròpe ciamà costose a le fonsions d'anàlisi sintàtica.\n\nA dovrìa essnie men che {{PLURAL:$2|$2}}, adess a-i na j'é {{PLURAL:$1|$1}}.", "expensive-parserfunction-category": "Pàgine con tròpe ciamà costose ëd fonsion ëd l'analisator sintàtich", "post-expand-template-inclusion-warning": "'''Atension:''' La dimension dj'anseriment dë stamp a l'é tròp gròssa.\nChèich stamp a saran nen anserì.", diff --git a/languages/i18n/pt.json b/languages/i18n/pt.json index a734e03d02..db7f2460c9 100644 --- a/languages/i18n/pt.json +++ b/languages/i18n/pt.json @@ -993,7 +993,7 @@ "gender-female": "Ela edita páginas wiki", "prefs-help-gender": "Esta preferência é opcional.\nO software usa o seu valor para o endereçar e para o mencionar a outros usando o género gramatical apropriado.\nEsta informação será pública.", "email": "Correio eletrónico", - "prefs-help-realname": "O fornecimento do nome verdadeiro é opcional.\nSe optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu trabalho.", + "prefs-help-realname": "O fornecimento do nome verdadeiro é opcional.\nSe optar por revelá-lo, será utilizado para atribuir-lhe crédito pelo seu trabalho.", "prefs-help-email": "Opcional: o endereço de correio eletrónico é opcional, mas será necessário para redefinir a palavra-passe caso esqueça a antiga.", "prefs-help-email-others": "Também pode optar por permitir que outros entrem em contacto consigo por correio eletrónico, através de uma ligação nas suas páginas de utilizador ou de discussão, sem revelar o seu endereço de correio eletrónico.", "prefs-help-email-required": "É necessário o endereço de correio eletrónico.", @@ -1620,6 +1620,8 @@ "pager-older-n": "{{PLURAL:$1|1 anterior|$1 anteriores}}", "suppress": "Supervisor", "querypage-disabled": "Esta página especial está desativada para não prejudicar o desempenho.", + "apihelp": "Ajuda API", + "apihelp-no-such-module": "Módulo \"$1\" não encontrado.", "booksources": "Fontes bibliográficas", "booksources-search-legend": "Pesquisar referências bibliográficas", "booksources-search": "Pesquisar", @@ -2252,6 +2254,7 @@ "tooltip-pt-mycontris": "Lista das suas contribuições", "tooltip-pt-login": "É encorajado que inicie sessão, apesar de não ser obrigatório.", "tooltip-pt-logout": "Sair da conta", + "tooltip-pt-createaccount": "É encorajado a criar uma conta e iniciar sessão; no entanto, não é obrigatório", "tooltip-ca-talk": "Discussão sobre o conteúdo da página", "tooltip-ca-edit": "Pode editar esta página.\nUtilize o botão de antevisão do resultado antes de gravar, por favor.", "tooltip-ca-addsection": "Iniciar uma nova seção", @@ -2281,6 +2284,7 @@ "tooltip-feed-atom": "''Feed'' Atom desta página", "tooltip-t-contributions": "Ver as contribuições deste utilizador", "tooltip-t-emailuser": "Enviar uma mensagem de correio a este utilizador", + "tooltip-t-info": "Mais informações sobre esta página", "tooltip-t-upload": "Carregar ficheiros", "tooltip-t-specialpages": "Lista de páginas especiais", "tooltip-t-print": "Versão para impressão desta página", diff --git a/languages/i18n/qqq.json b/languages/i18n/qqq.json index 55945e92ca..4712b0525e 100644 --- a/languages/i18n/qqq.json +++ b/languages/i18n/qqq.json @@ -510,6 +510,7 @@ "viewyourtext": "Same as {{msg-mw|viewsourcetext}} but when showing the text submitted by the user, this happens e.g. when the user was blocked while he is editing the page", "protectedinterface": "Message shown if a user without the \"editinterface\" right tries to edit a page in the MediaWiki namespace.\n\nSee also {{msg-mw|editinginterface}}. Parameters:\n* $1 - (Unused) the action the user attempted to perform", "editinginterface": "A message shown when editing pages in the namespace MediaWiki:.\n\nSee also {{msg-mw|protectedinterface}}.", + "translateinterface": "A message shown when editing pages in the namespace MediaWiki:, which have a default message text.\n\nSee also {{msg-mw|protectedinterface}}, {{msg-mw|editinginterface}}.", "cascadeprotected": "Parameters:\n* $1 - number of cascade-protected pages, used for PLURAL\n* $2 - list of cascade-protected pages\n* $3 - (Unused) the action the user attempted to perform", "namespaceprotected": "Parameters:\n* $1 - namespace name\n* $2 - (Unused) the action the user attempted to perform", "customcssprotected": "Used as error message. Parameters:\n* $1 - (Unused) the action the user attempted to perform", @@ -1691,7 +1692,6 @@ "statistics-summary": "{{doc-specialpagesummary|statistics}}", "statistics-header-pages": "Used in [[Special:Statistics]]", "statistics-header-edits": "Used in [[Special:Statistics]]", - "statistics-header-views": "Used in [[Special:Statistics]]", "statistics-header-users": "Used in [[Special:Statistics]].\n{{Identical|User statistics}}", "statistics-header-hooks": "Header of a section on [[Special:Statistics]] containing data provided by MediaWiki extensions", "statistics-articles": "Used in [[Special:Statistics]].\n\nA 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For technical definition of 'content namespaces' see [[mw:Manual:Using_custom_namespaces#Content_namespaces|MediaWiki]].\n\nPossible alternatives to the word 'content' are 'subject matter' or 'wiki subject' or 'wiki purpose'.\n\n{{Identical|Content page}}", @@ -1700,13 +1700,9 @@ "statistics-files": "Used in [[Special:Statistics]].\n{{Identical|Uploaded file}}", "statistics-edits": "Used in [[Special:Statistics]]", "statistics-edits-average": "Used in [[Special:Statistics]]", - "statistics-views-total": "Used in [[Special:Statistics]]", - "statistics-views-total-desc": "This message follows the message {{msg-mw|statistics-views-total}}, in [[Special:Statistics]].", - "statistics-views-peredit": "Used in [[Special:Statistics]]", "statistics-users": "{{doc-important|Do not translate \"Special:ListUsers\"}}\nUsed in [[Special:Statistics]].", "statistics-users-active": "Used in [[Special:Statistics]]", "statistics-users-active-desc": "Description shown beneath ''Active users'' in [[Special:Statistics]]. Parameters:\n* $1 - Value of $wgRCMaxAge in days", - "statistics-mostpopular": "Used in [[Special:Statistics]]", "statistics-footer": "{{notranslate}}", "pageswithprop": "{{doc-special|PagesWithProp}}\n{{Identical|Page with page property}}", "pageswithprop-summary": "{{doc-specialpagesummary|pageswithprop}}", @@ -1759,8 +1755,6 @@ "unusedcategories-summary": "{{doc-specialpagesummary|unusedcategories}}", "unusedimages": "{{doc-special|UnusedImages}}", "unusedimages-summary": "{{doc-specialpagesummary|unusedimages}}", - "popularpages": "{{doc-special|PopularPages}}", - "popularpages-summary": "{{doc-specialpagesummary|popularpages}}", "wantedcategories": "{{doc-special|WantedCategories}}", "wantedcategories-summary": "{{doc-specialpagesummary|wantedcategories}}", "wantedpages": "{{doc-special|WantedPages}}\n{{Identical|Wanted page}}", @@ -2692,7 +2686,6 @@ "pageinfo-robot-policy": "The search engine status of the page.\n\nUsed as label. Followed by any one of the following messages:\n*{{msg-mw|Pageinfo-robot-index}}\n*{{msg-mw|Pageinfo-robot-noindex}}", "pageinfo-robot-index": "An indication that the page is indexable by search engines, that is listed in their search results.\n\nPreceded by the label {{msg-mw|Pageinfo-robot-policy}}.", "pageinfo-robot-noindex": "An indication that the page is not indexable (that is, is not listed on the results page of a search engine).\n\nPreceded by the label {{msg-mw|Pageinfo-robot-policy}}.", - "pageinfo-views": "The number of times the page has been viewed.", "pageinfo-watchers": "Header of the row in the first table of the info action.", "pageinfo-few-watchers": "Message displayed when there are fewer than $wgUnwatchedPageThreshold watchers. $1 is the value of $wgUnwatchedPageThreshold.", "pageinfo-redirects-name": "Header of the row in the first table of the info action.\n\nFollowed by {{msg-mw|Pageinfo-redirects-value}}.\n\nUsed as link text. The link points to \"{{int:Whatlinkshere-title}}\" page ([[Special:WhatLinksHere]]).\n\nSee example: [{{canonicalurl:Main page|action=info}} Main page?action=info]", @@ -3398,6 +3391,7 @@ "unknown_extension_tag": "This is an error shown when you use an unknown extension tag name.\n\nThis feature allows tags like
 to be called with a parser like {{#tag:pre}}.\n\nParameters:\n* $1 - the unknown extension tag name",
 	"duplicate-defaultsort": "See definition of [[w:Sorting|sort key]] on Wikipedia. Parameters:\n* $1 - old default sort key\n* $2 - new default sort key",
 	"duplicate-displaytitle": "Warning shown when a page has its display title set multiple times. Parameters:\n* $1 - old display title\n* $2 - new display title",
+	"invalid-indicator-name": "Warning shown when the [https://www.mediawiki.org/wiki/Help:Page_status_indicators <indicator name=\"''unique-identifier''\">''content''</indicator>] parser tag is used incorrectly.",
 	"version": "{{doc-special|Version}}\n{{Identical|Version}}",
 	"version-summary": "{{doc-specialpagesummary|version}}",
 	"version-extensions": "Header on [[Special:Version]].",
diff --git a/languages/i18n/ro.json b/languages/i18n/ro.json
index 42f39d2041..c33530af05 100644
--- a/languages/i18n/ro.json
+++ b/languages/i18n/ro.json
@@ -668,6 +668,8 @@
 	"content-model-text": "text simplu",
 	"content-model-javascript": "JavaScript",
 	"content-model-css": "CSS",
+	"duplicate-args-category": "Pagini care folosesc argumente duplicate în apelarea formatelor",
+	"duplicate-args-category-desc": "Pagina conține apelări ale formatelor care folosesc argumente duplicate, cum ar fi {{foo|bar=1|bar=2}} sau {{foo|bar|1=baz}}.",
 	"expensive-parserfunction-warning": "Atenție: Această pagină conține prea multe apelări costisitoare ale funcțiilor parser.\n\nAr trebui să existe mai puțin de $2 {{PLURAL:$2|apelare|apelări}}, acolo există {{PLURAL:$1|$1 apelare|$1 apelări}}.",
 	"expensive-parserfunction-category": "Pagini cu prea multe apelări costisitoare de funcții parser",
 	"post-expand-template-inclusion-warning": "Atenție: Formatele incluse sunt prea mari.\nUnele formate nu vor fi incluse.",
@@ -953,7 +955,7 @@
 	"gender-female": "Ea modifică pagini wiki",
 	"prefs-help-gender": "Stabilirea acestei preferințe este opțională.\nAcest software folosește datele pentru a vi se adresa și pentru a face referire la dumneavoastră utilizând genul gramatical corespunzător.\nAceastă informație va fi publică.",
 	"email": "E-mail",
-	"prefs-help-realname": "Numele real este opțional.\nDacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.",
+	"prefs-help-realname": "Numele real este opțional.\nDacă este furnizat, ar putea fi folosit pentru a vă atribui munca.",
 	"prefs-help-email": "Adresa de e-mail este opțională, dar este necesară pentru recuperarea parolei în cazul în care o uitați.",
 	"prefs-help-email-others": "Puteți de asemenea permite altora să vă contacteze prin intermediul paginii dumneavoastră de utilizator fără a vă divulga identitatea.",
 	"prefs-help-email-required": "Adresa de e-mail este necesară.",
@@ -2853,6 +2855,7 @@
 	"unknown_extension_tag": "Extensie etichetă necunoscută „$1”",
 	"duplicate-defaultsort": "'''Atenție:''' Cheia de sortare implicită („$2”) o înlocuiește pe precedenta („$1”).",
 	"duplicate-displaytitle": "Atenție: Titlul afișat „$2” înlocuieşte titlul afișat anterior, „$1”.",
+	"invalid-indicator-name": "Eroare: Parametrul nume al indicatorilor de stare a paginii nu trebuie să fie gol.",
 	"version": "Versiune",
 	"version-extensions": "Extensii instalate",
 	"version-skins": "Aspecte instalate",
diff --git a/languages/i18n/ru.json b/languages/i18n/ru.json
index 7c68f08bc9..918a46f909 100644
--- a/languages/i18n/ru.json
+++ b/languages/i18n/ru.json
@@ -715,6 +715,8 @@
 	"content-model-text": "обычный текст",
 	"content-model-javascript": "JavaScript",
 	"content-model-css": "CSS",
+	"duplicate-args-category": "Страницы, использующие повторяющиеся аргументы в вызовах шаблонов",
+	"duplicate-args-category-desc": "Страницы, содержащие вызовы шаблонов, использующие повторяющиеся аргументы, такие как {{foo|bar=1|bar=2}} или {{foo|bar|1=bar}}.",
 	"expensive-parserfunction-warning": "'''Внимание!''' Эта страница содержит слишком много вызовов ресурсоёмких функций.\n\nДолжно быть не более {{PLURAL:$2|$2 вызова|$2 вызовов|1=одного вызова}}, в то время как сейчас здесь $1 {{PLURAL:$1|вызов|вызовов|вызова}}.",
 	"expensive-parserfunction-category": "Страницы со слишком большим количеством вызовов ресурсоёмких функций",
 	"post-expand-template-inclusion-warning": "Предупреждение: суммарный размер включаемых шаблонов слишком велик.\nНекоторые шаблоны не будут включены.",
@@ -1000,7 +1002,7 @@
 	"gender-female": "Онa редактирует страницы вики",
 	"prefs-help-gender": "Установка этой настройки необязательна.\nПО использует это значение, чтобы обращаться к вам и упоминать вас в правильном грамматическом роде.\nЭта информация будет общедоступной.",
 	"email": "Электронная почта",
-	"prefs-help-realname": "Настоящее имя (необязательное поле).\nЕсли вы укажете его, то оно будет использовано для того, чтобы показать, кем была внесена правка страницы.",
+	"prefs-help-realname": "Вводить настоящее имя необязательно.\nЕсли вы заполните его, оно может быть использовано для указания авторства ваших работ.",
 	"prefs-help-email": "Адрес электронной почты указывать необязательно, но он будет необходим в том случае, если вы забудете пароль.",
 	"prefs-help-email-others": "Он также позволит другим участникам связаться с вами по электронной почте с помощью ссылки на вашей персональной странице или на вашей странице обсуждения. При этом ваш адрес электронной почты не будет никому раскрыт.",
 	"prefs-help-email-required": "Необходимо указать адрес электронной почты.",
@@ -2297,6 +2299,7 @@
 	"tooltip-feed-atom": "Трансляция в Atom для этой страницы",
 	"tooltip-t-contributions": "Список страниц, которые изменял этот участник",
 	"tooltip-t-emailuser": "Отправить письмо этому участнику",
+	"tooltip-t-info": "Подробнее об этой странице",
 	"tooltip-t-upload": "Загрузить файлы",
 	"tooltip-t-specialpages": "Список служебных страниц",
 	"tooltip-t-print": "Версия этой страницы для печати",
@@ -2985,6 +2988,7 @@
 	"unknown_extension_tag": "Неизвестный тег расширения «$1»",
 	"duplicate-defaultsort": "Внимание. Ключ сортировки по умолчанию «$2» переопределяет прежний ключ сортировки по умолчанию «$1».",
 	"duplicate-displaytitle": "Внимание: Отображаемое название «$2» переопределяет ранее заданное отображаемое название «$1».",
+	"invalid-indicator-name": "Ошибка: Атрибут name индикаторов состояния страницы не должен быть пустым.",
 	"version": "Версия",
 	"version-extensions": "Установленные расширения",
 	"version-skins": "Установленные темы оформления",
diff --git a/languages/i18n/rup.json b/languages/i18n/rup.json
index daff7f8526..3969358291 100644
--- a/languages/i18n/rup.json
+++ b/languages/i18n/rup.json
@@ -168,6 +168,10 @@
 	"view-foreign": "Vedz la $1",
 	"edit": "Alâxire",
 	"edit-local": "Alâxeaști descrierea localâ",
+	"create": "Prindiri",
+	"create-local": "Adavgâ descrierea localâ",
+	"editthispage": "Alâxeaști aestâ frândzâ",
+	"create-this-page": "Adari aestâ frândzâ",
 	"delete": "Așcirḑire",
 	"deletethispage": "Așteardzi frândza",
 	"undeletethispage": "Aflâ frundza aștearsâ",
@@ -198,6 +202,7 @@
 	"otherlanguages": "Pi alanti limbi",
 	"redirectedfrom": "(yinitâ di la $1)",
 	"redirectpagesub": "Frândzâ di redirecționari",
+	"redirectto": "Purtari la:",
 	"lastmodifiedat": "Aestâ frândzâ fu alâxitâ di-tu soni pi $1, la $2.",
 	"viewcount": "Aestâ frândzâ fu mutritâ di {{PLURAL:$1|mași unâ oarâ|$1 ori}}.",
 	"protectedpage": "Frândzâ protejatâ",
@@ -256,6 +261,9 @@
 	"thisisdeleted": "Vedz icâ adu napoea $1?",
 	"viewdeleted": "Vedz $1?",
 	"restorelink": "Vedz {{PLURAL:$1|unâ alâxiri aștearsâ|$1 (di) alâxiri aștearsi}}",
+	"feedlinks": "Feed:",
+	"feed-invalid": "Turlii di feed invalidâ",
+	"feed-unavailable": "Nu suntu disponibili fluxuri web.",
 	"site-rss-feed": "$1 Abonari RSS",
 	"site-atom-feed": "$1 Abonari Atomu",
 	"page-rss-feed": "„$1” Abonari RSS",
@@ -274,16 +282,44 @@
 	"nstab-help": "Agiutoru",
 	"nstab-category": "Categorie",
 	"nosuchaction": "Aeastâ acțiuni nu easti",
+	"nosuchspecialpage": "Aestâ frândzâ maxusâ (specialâ) nu ari aoați",
+	"error": "Eroari (alatus)",
+	"databaseerror": "Alatus la baza di dati",
+	"databaseerror-text": "Apâru unu alatusu la interogarea bazâľei di dati. Aestâ poati s-hibâ trâ ațea câ ari unâ problemâ di software.",
+	"databaseerror-textcl": "Apâru unu alatusu la interogarea bazâľei di dati.",
+	"databaseerror-query": "Interogari: $1",
+	"databaseerror-function": "Funcție: $1",
 	"databaseerror-error": "Eroari (alutusu): $1",
+	"laggedslavemode": "Sacănu!: S-poati ca frândza s-nu aibâ actualizărili di-tu soni.",
 	"readonly": "Baza di dati easti blocatâ (ncľisâ) la nyrâpseari",
+	"missingarticle-rev": "(versiuniľea#: $1)",
+	"missingarticle-diff": "(Dif: $1, $2)",
+	"badtitle": "Titlu alatusu",
 	"viewsource": "Vez-u textu",
+	"viewsource-title": "Vedz ivurlu trâ $1",
+	"ns-specialprotected": "Frâdzâli maxusi (speciali) nu potu s-hibâ alâxiti.",
+	"exception-nologin": "Nu hii ligatu",
+	"exception-nologin-text": "Leagâ-ti ca sâ poț sâ u vedz aestâ frândzâ i acțiuni.",
+	"exception-nologin-text-manual": "Vâ pâlâcârsimu sâ $1 ca s-puteț s-u videț frândza i acțiunea aestâ.",
+	"virus-badscanner": "Configurațiľe alatusitâ: scaneru di virus nicunuscutu: \"$1\"",
+	"welcomeuser": "Ghini viniș, $1!",
+	"welcomecreation-msg": "Contulu (isape) a tău fu adratu.\nPoț s-lu alâxești [[Special:Preferences|Prutimisirli]] a tali ma câ vrei.",
 	"yourname": "Numa di utilizatoru:",
 	"userlogin-yourname": "Numa di utilizatoru:",
 	"userlogin-yourname-ph": "Bagâ-u numa a ta di utilizatoru",
 	"createacct-another-username-ph": "Bagâ-u numa di utilizatoru",
 	"yourpassword": "Zboru cľeae:",
+	"userlogin-yourpassword": "Zboarâ acrifo (parolâ)",
+	"userlogin-yourpassword-ph": "Bagâ-u parola (zboru acrifo)",
+	"createacct-yourpassword-ph": "Bagâ-u parola (zboru acrifo)",
 	"yourpasswordagain": "Bagâ-u cľeae diznou:",
+	"createacct-yourpasswordagain": "Apuchiruseaști zborlu mistico",
+	"createacct-yourpasswordagain-ph": "Bagâ-u parola diz-nou",
 	"remembermypassword": "Țâni minti ligâtura a mea pi browserlu aestu (cheari dupu $1 {{PLURAL:$1|dzuuâ|dzâli}})",
+	"userlogin-remembermypassword": "Pâstreadzâ ligarea",
+	"userlogin-signwithsecure": "Ufiliseaști unâ conexiuni sigurâ",
+	"yourdomainname": "Domeniulu a tău:",
+	"password-change-forbidden": "Nu poț s-li alâxești zboarâli mistico pi aestu wiki.",
 	"login": "Leagâ-ti",
 	"nav-login-createaccount": "Leagâ-ti / Fă contu (isape)",
 	"userlogin": "Leagâ-ti / Fă contu (isape)",
@@ -292,10 +328,14 @@
 	"userlogout": "Dizleagâ-ti",
 	"notloggedin": "Nu hii ligatu",
 	"userlogin-noaccount": "N-ai nicâ contu (isape)?",
+	"userlogin-joinproject": "Bagâ-ti la {{SITENAME}}",
 	"nologin": "N-ai nicâ contu (isape)? $1.",
 	"nologinlink": "Fă unu utilizatoru a tău tora",
 	"createaccount": "Fă contu (isape)",
+	"gotaccount": "Ai nicâ contu (isape)? $1.",
 	"gotaccountlink": "Leagâ-ti",
+	"userlogin-resetlink": "U agârșii parola i numa di utilizatoru?",
+	"userlogin-resetpassword-link": "U agârșii parola?",
 	"createacct-emailrequired": "Adresâ di carti electronicâ",
 	"createacct-emailoptional": "Adresâ di carti electronicâ (opționalu)",
 	"createacct-email-ph": "Bagâ-u adresa a ta di carti electronicâ",
@@ -344,7 +384,6 @@
 	"newpages-username": "Numa di utilizatoru:",
 	"move": "Mutari",
 	"movethispage": "Mutâ frândza aestâ",
-	"booksources-go": "Du-ti",
 	"allpagessubmit": "Du-ti",
 	"watchlist": "Frândzâ avinati",
 	"mywatchlist": "Frândzâ avinati",
diff --git a/languages/i18n/si.json b/languages/i18n/si.json
index 2b74c9bd0b..03daa7d042 100644
--- a/languages/i18n/si.json
+++ b/languages/i18n/si.json
@@ -903,7 +903,7 @@
 	"gender-female": "ස්ත්‍රී",
 	"prefs-help-gender": "මෙම සංස්කරණය අත්‍යවශ්‍ය නැත: මෘදුකාංග විසින් නිවැරැදි ආමන්ත්‍රනය සඳහා භාවිතා කෙරෙයි.\nමෙම තොරතුර ප්‍රජාවට විවෘතය.",
 	"email": "විද්‍යුත් තැපෑල",
-	"prefs-help-realname": "සැබෑ නාමය හෙළි කිරීම වෛකල්පිකයි.\nඔබ විසින් එය හෙළි කල හොත්, ඔබගේ කෘතීන් සඳහා ඔබහට කතෘ-බුහුමන් පිරිනැමීමට එය භාවිතා කරනු ඇත.",
+	"prefs-help-realname": "සැබෑ නාමය හෙළි කිරීම අත්‍යවශ්‍ය නැත.\nඔබ විසින් එය හෙළි කල හොත්, ඔබගේ කෘතීන් සඳහා ඔබහට කතෘබුහුමන් පිරිනැමීමට එය භාවිතා කරනු ඇත.",
 	"prefs-help-email": "විද්‍යුත් තැපැල් ලිපිනය අත්‍යාවශ්‍ය නොවේ, එහෙත් ඔබගේ මුර පදය අමතක වූ විටෙක එය යලි සැකසීමට නම් විද්‍යුත් ලිපිනයක් දී තිබිය යුතුය.",
 	"prefs-help-email-others": "ඔබගේ පරිශීලක හෝ පරිශීලක සාකච්ඡා පිටුවෙහි සබැඳියක් ඔස්සේ විද්‍යුත් තැපෑල මගින් අනෙක් අයට ඔබව සම්බන්ධ කර ගැනීම පිණිස තේරිමක් සිදු කල හැක.\nඅනෙකුත් පරිශීලකයන් ඔබව අමතන විට ඔබගේ විද්‍යුත් තැපැල් ලිපිනය හෙලිදරවු නොකෙරේ.",
 	"prefs-help-email-required": "විද්‍යුත්-ලිපිනය අවශ්‍යයි.",
diff --git a/languages/i18n/sk.json b/languages/i18n/sk.json
index 18d96fd325..3413be8d52 100644
--- a/languages/i18n/sk.json
+++ b/languages/i18n/sk.json
@@ -1152,7 +1152,7 @@
 	"diff": "rozdiel",
 	"hist": "história",
 	"hide": "Skryť",
-	"show": "zobraziť",
+	"show": "Zobraziť",
 	"minoreditletter": "d",
 	"newpageletter": "N",
 	"boteditletter": "b",
@@ -2791,6 +2791,7 @@
 	"watchlistedit-clear-submit": "Vyprázdniť zoznam sledovaných stránok (natrvalo!)",
 	"watchlistedit-clear-done": "Váš zoznam sledovaných stránok bol vyprázdnený.",
 	"watchlistedit-clear-removed": "{{PLURAL:$1|Bol odstránený jeden názov|Boli odstránené $1 názvy|Bolo odstránených $1 názvov}}:",
+	"watchlisttools-clear": "Vyprázdniť zoznam sledovaných stránok",
 	"watchlisttools-view": "Zobraziť súvisiace zmeny",
 	"watchlisttools-edit": "Zobraziť a upraviť zoznam sledovaných stránok",
 	"watchlisttools-raw": "Upraviť nespracovaný zoznam sledovaných stránok",
diff --git a/languages/i18n/sl.json b/languages/i18n/sl.json
index 021497e534..7f0e337791 100644
--- a/languages/i18n/sl.json
+++ b/languages/i18n/sl.json
@@ -655,6 +655,8 @@
 	"content-model-text": "golo besedilo",
 	"content-model-javascript": "JavaScript",
 	"content-model-css": "CSS",
+	"duplicate-args-category": "Strani s podvojenimi argumenti v klicih predlog",
+	"duplicate-args-category-desc": "Stran vsebuje klice predlog, ki vsebujejo dvojnike argumentov, kot sta {{foo|bar=1|bar=2}} ali {{foo|bar|1=baz}}.",
 	"expensive-parserfunction-warning": "'''Opozorilo:''' Ta stran vsebuje preveč klicev funkcije razčlenjevalnika kode.\n\nStran naj bi vsebovala manj kot $2 {{PLURAL:$2|klic|klica|klice|klicev}}, trenutno {{PLURAL:$1|je v uporabi $1 klic|sta v uporabi $1 klica|so v uporabi $1 klici|je v uporabi $1 klicev}}.",
 	"expensive-parserfunction-category": "Strani s prevelikim številom klicev na funkcijo razčlenjevalnika kode",
 	"post-expand-template-inclusion-warning": "'''Opozorilo:''' Velikost vključenih predlog je prevelika.\nNekatere predloge ne bodo prikazane.",
@@ -2844,6 +2846,7 @@
 	"unknown_extension_tag": "Neznana razširitvena etiketa »$1«",
 	"duplicate-defaultsort": "'''Opozorilo:''' Privzeti ključ razvrščanja »$2« prepiše prejšnji privzeti ključ razvrščanja »$1«.",
 	"duplicate-displaytitle": "Opozorilo: Prikazni naslov »$2« prepiše prejšnji prikazni naslov »$1«.",
+	"invalid-indicator-name": "Napaka: Atribut name indikatorjev stanja strani ne sme biti prazen.",
 	"version": "Različica",
 	"version-extensions": "Nameščene razširitve",
 	"version-skins": "Nameščene kože",
diff --git a/languages/i18n/sv.json b/languages/i18n/sv.json
index 208a535457..e172f5c765 100644
--- a/languages/i18n/sv.json
+++ b/languages/i18n/sv.json
@@ -704,6 +704,8 @@
 	"content-model-text": "oformaterad text",
 	"content-model-javascript": "JavaScript",
 	"content-model-css": "CSS",
+	"duplicate-args-category": "Sidor som använder upprepade argument i mallanrop",
+	"duplicate-args-category-desc": "Sidan innehåller mallanrop som använder repeterade argument, så som {{foo|bar=1|bar=2}} eller {{foo|bar|1=baz}}.",
 	"expensive-parserfunction-warning": "Varning: Denna sida innehåller för många anrop av resurskrävande parserfunktioner.\n\nAntalet anrop får vara högst $2, nu görs {{PLURAL:$1|$1 anrop}}",
 	"expensive-parserfunction-category": "Sidor med för många resurskrävande parserfunktioner",
 	"post-expand-template-inclusion-warning": "Varning: Den här sidan innehåller för mycket mallinklusioner.\nNågra av mallarna kommer inte att inkluderas.",
@@ -990,7 +992,7 @@
 	"gender-female": "Hon redigerar wikisidor",
 	"prefs-help-gender": "Denna inställning är valfri.\nProgramvaran använder detta värde för att adressera dig till andra med rätt genus. Denna information kommer att vara offentlig.",
 	"email": "E-post",
-	"prefs-help-realname": "Riktigt namn behöver inte anges.\nOm du väljer att ange ditt riktiga namn, kommer det att användas för att tillskriva dig ditt arbete.",
+	"prefs-help-realname": "Riktigt namn behöver inte anges.\nOm angivet, kan det komma att användas för att tillskriva dig ditt arbete.",
 	"prefs-help-email": "Att ange e-postadress är valfritt, men gör det möjligt att få ditt lösenord mejlat till dig om du glömmer det.",
 	"prefs-help-email-others": "Du kan också välja att låta andra kontakta dig via e-post genom en länk på din användar- eller diskussionssida. Din e-postadress avslöjas inte när andra användare kontaktar dig.",
 	"prefs-help-email-required": "E-postadress måste anges.",
@@ -2283,6 +2285,7 @@
 	"tooltip-feed-atom": "Atom-flöde för den här sidan",
 	"tooltip-t-contributions": "En lista över bidrag från den här användaren",
 	"tooltip-t-emailuser": "Skicka e-post till den här användaren",
+	"tooltip-t-info": "Mer information om denna sida",
 	"tooltip-t-upload": "Ladda upp filer",
 	"tooltip-t-specialpages": "Lista över alla specialsidor",
 	"tooltip-t-print": "Utskriftvänlig version av den här sidan",
diff --git a/languages/i18n/ta.json b/languages/i18n/ta.json
index af54d9c9fd..35f5519e9d 100644
--- a/languages/i18n/ta.json
+++ b/languages/i18n/ta.json
@@ -2033,6 +2033,7 @@
 	"tooltip-feed-atom": "இப்பக்கத்துக்கான அடொம் ஓடை கிடையாது",
 	"tooltip-t-contributions": "இப்பயனரின்  பங்களிப்புக்களின் பட்டியலைப் பார்",
 	"tooltip-t-emailuser": "இப் பயனருக்கு மின்னஞ்சல் செய்",
+	"tooltip-t-info": "இப்பக்கத்தைப்பற்றி மேலதிக விபரம்",
 	"tooltip-t-upload": "கோப்புகளைப் பதிவேற்றுக",
 	"tooltip-t-specialpages": "அனைத்துச் சிறப்புப் பக்கங்களின் பட்டியல்",
 	"tooltip-t-print": "இப்பக்கத்தின் அச்சுக்குகந்தப் பதிப்பு",
diff --git a/languages/i18n/uk.json b/languages/i18n/uk.json
index 8ef59cb7f4..095f931686 100644
--- a/languages/i18n/uk.json
+++ b/languages/i18n/uk.json
@@ -703,6 +703,8 @@
 	"content-model-text": "звичайний текст",
 	"content-model-javascript": "JavaScript",
 	"content-model-css": "CSS",
+	"duplicate-args-category": "Сторінки, що включають шаблони з дублікатним визначенням аргументу",
+	"duplicate-args-category-desc": "Тут перелічено сторінки, що містять дублікатне визначення аргументу при включенні шаблону, приміром, {{foo|bar=1|bar=2}} або {{foo|bar|1=baz}}.",
 	"expensive-parserfunction-warning": "'''Увага:''' Ця сторінка містить дуже багато викликів ресурсомістких функцій.\n\nКількість викликів не повинна перевищувати $2, зараз потрібно зробити $1 {{PLURAL:$1|виклик|виклики|викликів}}.",
 	"expensive-parserfunction-category": "Сторінки з дуже великою кількістю викликів ресурсомістких функцій",
 	"post-expand-template-inclusion-warning": "'''Увага:''' розмір шаблонів для включення занадто великий.\nДеякі шаблони не буде включено.",
@@ -990,7 +992,7 @@
 	"gender-female": "Жіноча",
 	"prefs-help-gender": "Задання цього параметру - необов'язкове. Застосовується рушієм у тих звертаннях до користувача, які залежать від статі.\nЦя інформація загальнодоступна.",
 	"email": "Електронна пошта",
-	"prefs-help-realname": "Справжнє ім'я необов'язково вказувати.\nЯкщо ви його зазначите, то воно буде використовуватися, щоб показати, хто редагував сторінку.",
+	"prefs-help-realname": "Справжнє ім'я вказувати необов'язково.\nЯкщо ви його зазначите, то саме з ним може бути пов'язаний увесь ваш доробок.",
 	"prefs-help-email": "Адреса електронної пошти не є обов'язковою, але необхідна для скидання пароля, якщо ви його забудете.",
 	"prefs-help-email-others": "Також вона дозволить іншим користувачам зв'язатися з вами через вашу особисту сторінку без необхідності розкриття вашої електронної адреси.",
 	"prefs-help-email-required": "Потрібно зазначити адресу електронної пошти.",
@@ -2096,7 +2098,7 @@
 	"move-page": "Перейменування сторінки «$1»",
 	"move-page-legend": "Перейменування сторінки",
 	"movepagetext": "Скориставшись формою нижче, ви можете перейменувати сторінку, одночасно перемістивши на нове місце і журнал її редагувань.\nСтара назва стане перенаправленням на нову назву.\nВи можете автоматично оновити перенаправлення на стару назву.\nЯкщо ви цього не зробите, будь ласка, перевірте наявність [[Special:DoubleRedirects|подвійних]] чи [[Special:BrokenRedirects|розірваних]] перенаправлень.\nВи відповідаєте за те, щоб посилання і надалі вказували туди, куди припускалося.\n\nЗверніть увагу, що сторінка '''не''' буде перейменована, якщо сторінка з новою назвою вже існує, окрім випадків, коли остання порожня або є перенаправленням, а журнал її редагувань порожній.\nЦе означає, що ви можете повернути сторінці стару назву, якщо ви перейменували її помилково, але ви не можете затерти існуючу сторінку.\n\n'''ПОПЕРЕДЖЕННЯ!'''\nЦя дія може стати причиною серйозних та неочікуваних змін популярних сторінок.\nБудь ласка, перед продовженням переконайтесь, що ви розумієте всі можливі наслідки.",
-	"movepagetext-noredirectfixer": "Ця форма дозволяє перейменувати сторінку з одночасним переміщенням її журналу змін.\nСтара назва стане перенаправленням на нову.\nБудь ласка, не забудьте виправити [[Special:DoubleRedirects|подвійні]] і [[Special:BrokenRedirects|розірвані перенаправлення]].\nВи відповідаєте за те, щоб посилання і далі вказували туди, куди треба.\n\nЗверніть увагу, що сторінка '''не буде''' перейменована, якщо сторінка з новою назвою вже існує, крім випадків, коли вона є перенаправленням або порожня та не має історії редагувань.\nЦе означає, що Ви можете перейменувати сторінку назад, якщо Ви допустилися помилки, і при цьому не зможете випадково перезаписати наявну сторінку.\n\n'''Попередження!'''\nПерейменування може призвести до масштабних і несподіваних змін для ''популярних'' сторінок.\nТому перед перейменуванням упевніться, що Ви оцінили можливі наслідки.",
+	"movepagetext-noredirectfixer": "Ця форма дозволяє перейменувати сторінку з одночасним переміщенням її журналу змін.\nСтара назва стане перенаправленням на нову.\nБудь ласка, не забудьте виправити [[Special:DoubleRedirects|подвійні]] та [[Special:BrokenRedirects|розірвані перенаправлення]].\nВи відповідаєте за те, щоб посилання і далі вказували туди, куди треба.\n\nЗверніть увагу, що сторінка '''не буде''' перейменована, якщо сторінка з новою назвою вже існує, крім випадків, коли вона є перенаправленням або порожня та не має історії редагувань.\nЦе означає, що Ви можете перейменувати сторінку назад, якщо Ви допустилися помилки, і при цьому не зможете випадково перезаписати наявну сторінку.\n\n'''Попередження!'''\nПерейменування може призвести до масштабних і несподіваних змін для ''популярних'' сторінок.\nТому перед перейменуванням упевніться, що Ви оцінили можливі наслідки.",
 	"movepagetalktext": "Приєднана сторінка обговорення також буде автоматично перейменована, '''окрім таких випадків:'''\n* Непорожня сторінка обговорення з такою назвою вже існує або\n* Ви не поставили галочку в полі нижче.\n\nУ цих випадках ви будете змушені перейменувати чи об'єднати сторінки вручну в разі необхідності",
 	"movearticle": "Перейменувати сторінку",
 	"moveuserpage-warning": "'''Увага:''' Ви збираєтеся перейменувати сторінку користувача. Будь ласка, зверніть увагу, що  буде перейменовано тільки сторінку, але користувача '''не''' буде перейменовано.",
@@ -3038,6 +3040,7 @@
 	"unknown_extension_tag": "Невідомий тег доповнення «$1»",
 	"duplicate-defaultsort": "Увага. Ключ сортування «$2» перекриває попередній ключ сортування «$1».",
 	"duplicate-displaytitle": "Увага: Відображений заголовок \"$2\" заміщує раніше відображений заголовок \"$1\".",
+	"invalid-indicator-name": "Помилка: Сторінка індикатора стану name атрибута не може бути пуста.",
 	"version": "Версія MediaWiki",
 	"version-extensions": "Установлені розширення",
 	"version-skins": "Встановлені теми оформлення",
diff --git a/languages/i18n/uz.json b/languages/i18n/uz.json
index e08c621c68..0e22ebe90a 100644
--- a/languages/i18n/uz.json
+++ b/languages/i18n/uz.json
@@ -348,6 +348,7 @@
 	"gotaccountlink": "Kirish",
 	"userlogin-resetlink": "Kirish maʻlumotlaringiz esdan chiqdimi?",
 	"userlogin-resetpassword-link": "Unutib qoʻydingizmi?",
+	"userlogin-helplink2": "Kirish uchun yordam",
 	"userlogin-loggedin": "Siz {{GENDER:$1|$1}} nomi bilan kirgansiz.\nBoshqa hisob raqami orqali kirish uchun quyidagi formadan foydalaning.",
 	"userlogin-createanother": "Boshqa hisob yaratish",
 	"createacct-emailrequired": "Elektron pochta manzilingiz",
@@ -385,6 +386,7 @@
 	"login-abort-generic": "Tizimga kirishga mufavvaqiyatsiz urinish",
 	"loginlanguagelabel": "Til: $1",
 	"pt-login": "Kirish",
+	"pt-login-button": "Kirish",
 	"pt-createaccount": "Hisob yaratish",
 	"pt-userlogout": "Chiqish",
 	"changepassword": "Maxfiy soʻzni oʻzgartirish",
@@ -617,7 +619,7 @@
 	"recentchangescount": "Sukut boʻyicha koʻrsatiladigan tahrirlar soni:",
 	"prefs-help-recentchangescount": "Yangi oʻzgarishlar, sahifalar tarixi va qaydlar uchun",
 	"prefs-help-watchlist-token2": "Bu kuzatuv roʻyxatingizning veb-kanali uchun maxfiy kalit kodi.\nBu kodni biladigan har kim sizning kuzatuv roʻyxatingizni koʻrishi mumkin, shuning uchun boshqalarga uni oshkor qilmang. [[Special:ResetTokens|Tokenni yangilash]].",
-	"savedprefs": "Sizning moslamalaringiz saqlandi.",
+	"savedprefs": "Sizning moslamalaringiz saqlandi",
 	"timezonelegend": "Vaqt mintaqangiz:",
 	"localtime": "Mahalliy vaqt:",
 	"timezoneuseserverdefault": "Server moslamalaridan foydalanish ($1)",
diff --git a/languages/i18n/yi.json b/languages/i18n/yi.json
index c8799e2325..b1a8c0b1a7 100644
--- a/languages/i18n/yi.json
+++ b/languages/i18n/yi.json
@@ -941,7 +941,7 @@
 	"gender-female": "זי רעדאקטירט וויקי בלעטער",
 	"prefs-help-gender": "שטעלן דעם פרעפֿערענץ איז אפציאנאַל.\nדאס ווייכוואַרג באניצט זיין ווערט אײַך צו אַדרעסירן און דערמאנען צו אנדערע מיטן געהעריגן מין פֿארעם. \nדי אינפֿארמאַציע ווערט ידוע צו אַלעמען.",
 	"email": "ע-פאסט",
-	"prefs-help-realname": "* עכטער נאמען (אפציאנאל): אויב וועט איר אויסוועלן צוצישטעלן דאס, וועט גענוצט ווערן צו געבן אטריביאציע צו אייער ארבייט.",
+	"prefs-help-realname": "עכטער נאמען איז אפציאנאל.\nווען אנגעגעבן, וועט ער גענוצט ווערן צו געבן אטריבוציע פאר אייער ארבעט.",
 	"prefs-help-email": "ע-פאסט אַדרעס איז ברירהדיק, אבער עס דערמעגליכט אז מען קען אייך שיקן א ניי פאסווארט טאמער איר פֿארגעסט דאָס אַלטע.",
 	"prefs-help-email-others": "איר קענט אויך אויסקלייבן צו לאזן אנדערע פֿארבינדן מיט אייך דורך ע־פאסט דורך א לינק אויף אייער באניצער אדער שמועס בלאט.\nמען וועט נישט אנטפלעקן אייער ע־פאסט אדרעס ווען אנדערע פֿארבינדן זיך מיט אייך.",
 	"prefs-help-email-required": "בליצפאסט אדרעס באדארפט.",
diff --git a/languages/i18n/zh-hans.json b/languages/i18n/zh-hans.json
index 408d650787..9e3848df74 100644
--- a/languages/i18n/zh-hans.json
+++ b/languages/i18n/zh-hans.json
@@ -727,6 +727,8 @@
 	"content-model-text": "纯文本",
 	"content-model-javascript": "JavaScript",
 	"content-model-css": "CSS",
+	"duplicate-args-category": "页面的模板调用中使用重复参数",
+	"duplicate-args-category-desc": "页面包含使用重复参数的模板调用,例如{{foo|bar=1|bar=2}}或{{foo|bar|1=baz}}。",
 	"expensive-parserfunction-warning": "警告:这个页面有太多高昂的语法功能调用。\n\n它应该少过$2次呼叫,现在有$1次呼叫。",
 	"expensive-parserfunction-category": "页面中有太多耗费的语法功能呼叫",
 	"post-expand-template-inclusion-warning": "'''警告:'''包含模板大小过大。\n一些模板将不会包含。",
@@ -1012,7 +1014,7 @@
 	"gender-female": "她",
 	"prefs-help-gender": "该设置为可选项。软件根据该值在称呼您及对他人提及您时使用适当的语法性别。该信息会被公开。",
 	"email": "电子邮件",
-	"prefs-help-realname": "真实姓名是选填项目。如果你选择提供它,它将会用于贡献署名。",
+	"prefs-help-realname": "真实姓名是选填项目。如果提供,它可能用于署名您的贡献。",
 	"prefs-help-email": "电子邮件地址是选填项,但是当你忘记你的密码要重置密码时,需要该信息。",
 	"prefs-help-email-others": "您也可以选择让其他用户通过您的用户或讨论页面上的链接用电子邮件联系您。其他用户联系您时您的电子邮件地址不会显示。",
 	"prefs-help-email-required": "电子邮件地址是必填项目。",
@@ -2948,6 +2950,7 @@
 	"unknown_extension_tag": "未知扩展标签“$1”",
 	"duplicate-defaultsort": "'''警告:'''默认排序关键词“$2”覆盖了之前的默认排序关键词“$1”。",
 	"duplicate-displaytitle": "警告:显示的标题“$2”重写了此前显示的标题“$1”。",
+	"invalid-indicator-name": "错误:页面状态指示器的name属性必须不为空。",
 	"version": "版本",
 	"version-extensions": "安装的扩展程序",
 	"version-skins": "已安装皮肤",
diff --git a/languages/i18n/zh-hant.json b/languages/i18n/zh-hant.json
index 0fc3378530..7c59b32116 100644
--- a/languages/i18n/zh-hant.json
+++ b/languages/i18n/zh-hant.json
@@ -61,7 +61,7 @@
 			"EagerLin"
 		]
 	},
-	"tog-underline": "連結顯示底線:",
+	"tog-underline": "底線標示連結:",
 	"tog-hideminor": "隱藏近期變更以來的小編輯",
 	"tog-hidepatrolled": "隱藏近期變更中巡查過的編輯",
 	"tog-newpageshidepatrolled": "隱藏新頁面清單中巡查過的頁面",
@@ -702,6 +702,8 @@
 	"content-model-text": "純文字",
 	"content-model-javascript": "JavaScript",
 	"content-model-css": "CSS",
+	"duplicate-args-category": "樣版呼叫時使用重複的參數的頁面",
+	"duplicate-args-category-desc": "該頁面包含重複使用參數的樣版呼叫,如 {{foo|bar=1|bar=2}} 或 {{foo|bar|1=baz}}。",
 	"expensive-parserfunction-warning": "警告:此頁面使用了太多消耗系統資源的解析函數。\n\n使用次數應小於 $2 次,但目前使用了 $1 次。",
 	"expensive-parserfunction-category": "使用了太多消耗系統資源的分析函數的頁面",
 	"post-expand-template-inclusion-warning": "警告:引用樣板後大小超出限制。\n部份樣版內容將不會被使用。",
@@ -895,7 +897,7 @@
 	"searchall": "全部",
 	"showingresults": "以下顯示從第 $2 筆開始,共 {{PLURAL:$1|1 筆結果|$1 筆結果}}:",
 	"showingresultsinrange": "以下顯示從第 $2 筆至第 $3 筆中的 {{PLURAL:$1|1 筆結果|$1 筆結果}}:",
-	"search-showingresults": "{{PLURAL:$4|$3 的 $1 筆結果|$3 的 $1 - $2 筆結果}}",
+	"search-showingresults": "{{PLURAL:$4|第 $1 筆結果,共 $3 筆|第 $1 - $2 筆結果,共 $3 筆}}",
 	"search-nonefound": "無符合查詢條件的結果。",
 	"powersearch-legend": "進階搜尋",
 	"powersearch-ns": "搜尋以下命名空間:",
@@ -987,7 +989,7 @@
 	"gender-female": "她編輯了 Wiki 頁面",
 	"prefs-help-gender": "此偏好設定為選填欄位。\n系統會使用您選擇的方式稱呼您,對他人提及您時也會使用適當語法稱呼。\n此項資訊會被公開。",
 	"email": "電子郵件",
-	"prefs-help-realname": "真實姓名為選填欄位。\n若您提供真實姓名,它會用於使用者貢獻署名。",
+	"prefs-help-realname": "真實姓名為選填欄位。\n若提供,真實姓名可能會用來作為您的作品的署名。",
 	"prefs-help-email": "電子郵件位址為選填欄位。\n但在重設密碼時會使用,而您很有可能會忘記密。",
 	"prefs-help-email-others": "您亦可以選擇讓其他使用者用電子郵件與您聯繫,透過您的使用者或對話頁面上方的連結。\n您的電子郵件位址不會實際告知給其他要聯絡您的使用者。",
 	"prefs-help-email-required": "電子郵件地址是必填項目。",
@@ -1567,7 +1569,7 @@
 	"mostlinkedtemplates": "被引用最多的頁面",
 	"mostcategories": "最多分類的頁面",
 	"mostimages": "被連結最多的檔案",
-	"mostinterwikis": "最多 Interwiki 連結的頁面",
+	"mostinterwikis": "最多網際 Wiki 連結的頁面",
 	"mostrevisions": "最多修訂的頁面",
 	"prefixindex": "所有頁面與字首",
 	"prefixindex-namespace": "所有含字首的頁面 ($1 命名空間)",
@@ -1614,6 +1616,8 @@
 	"pager-older-n": "較舊 $1 筆",
 	"suppress": "監督",
 	"querypage-disabled": "此特殊頁面因考量效能問題已被停用。",
+	"apihelp": "API 說明",
+	"apihelp-no-such-module": "查無模組 \"$1\"。",
 	"booksources": "圖書資源",
 	"booksources-search-legend": "尋找圖書資源",
 	"booksources-isbn": "國際標準書號:",
@@ -1814,7 +1818,7 @@
 	"revertpage-nouser": "已還隱藏使用者的編輯為最後 {{GENDER:$1|[[User:$1|$1]]}} 修訂的版本",
 	"rollback-success": "已還原 $1 做的編輯;\n更變回最後由 $2 修訂的版本。",
 	"sessionfailure-title": "連線階段失敗",
-	"sessionfailure": "似乎您的登入會話有問題;\n為了防止會話劫持,這個操作已經被取消。\n請返回先前的頁面,重新載入該頁面,然後重試。",
+	"sessionfailure": "您的登入連線階段似乎有問題,\n為了預防連線階段受到劫持攻擊,此動作已經被取消。\n請返回上一頁,重新讀取該頁面再試一次。",
 	"protectlogpage": "保護日誌",
 	"protectlogtext": "以下為變更頁面保護的清單。\n請參考 [[Special:ProtectedPages|受保護頁面清單]] 檢視目前受保護頁面。",
 	"protectedarticle": "已保護 \"[[$1]]\"",
@@ -1926,7 +1930,7 @@
 	"month": "截止月份:",
 	"year": "截止年份:",
 	"sp-contributions-newbies": "只顯示新帳號的貢獻",
-	"sp-contributions-newbies-sub": "新手",
+	"sp-contributions-newbies-sub": "新帳號的貢獻",
 	"sp-contributions-newbies-title": "新帳號的使用者貢獻",
 	"sp-contributions-blocklog": "封鎖記錄",
 	"sp-contributions-suppresslog": "已禁止顯示的使用者貢獻",
@@ -1936,7 +1940,7 @@
 	"sp-contributions-talk": "對話",
 	"sp-contributions-userrights": "使用者權限管理",
 	"sp-contributions-blocked-notice": "此使用者目前已被封鎖。\n以下為最近的封鎖紀錄以供參考:",
-	"sp-contributions-blocked-notice-anon": "此 IP 位址目前已被封鎖。\n以下為最近的封鎖紀錄以供參考:",
+	"sp-contributions-blocked-notice-anon": "此 IP 位址目前已被封鎖。\n以下為最近的封鎖記錄以供參考:",
 	"sp-contributions-search": "搜尋貢獻",
 	"sp-contributions-username": "IP 位址或使用者名稱:",
 	"sp-contributions-toponly": "只顯示最新修訂的編輯",
@@ -2249,6 +2253,7 @@
 	"tooltip-pt-mycontris": "您的貢獻清單",
 	"tooltip-pt-login": "儘管非必要,仍建議您登入。",
 	"tooltip-pt-logout": "登出",
+	"tooltip-pt-createaccount": "我們會鼓勵您建立一個帳號並且登入,即使這不是必要的動作。",
 	"tooltip-ca-talk": "有關頁面內容的討論",
 	"tooltip-ca-edit": "您可以編輯此頁,請在儲存之前先預覽。",
 	"tooltip-ca-addsection": "開始一個新章節",
@@ -2278,6 +2283,7 @@
 	"tooltip-feed-atom": "訂閱此頁面的 Atom feed",
 	"tooltip-t-contributions": "此使用者的貢獻清單",
 	"tooltip-t-emailuser": "傳送電子郵件給這個使用者",
+	"tooltip-t-info": "更多關於此頁面的資訊",
 	"tooltip-t-upload": "上傳檔案",
 	"tooltip-t-specialpages": "全部特殊頁面的清單",
 	"tooltip-t-print": "此頁面的可列印版本",
diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php
index d62cd4c836..a2c1873d00 100644
--- a/languages/messages/MessagesEn.php
+++ b/languages/messages/MessagesEn.php
@@ -240,7 +240,6 @@ $magicWords = array(
 	'numberofusers'           => array( 1, 'NUMBEROFUSERS' ),
 	'numberofactiveusers'     => array( 1, 'NUMBEROFACTIVEUSERS' ),
 	'numberofedits'           => array( 1, 'NUMBEROFEDITS' ),
-	'numberofviews'           => array( 1, 'NUMBEROFVIEWS' ),
 	'pagename'                => array( 1, 'PAGENAME' ),
 	'pagenamee'               => array( 1, 'PAGENAMEE' ),
 	'namespace'               => array( 1, 'NAMESPACE' ),
diff --git a/languages/messages/MessagesSes.php b/languages/messages/MessagesSes.php
new file mode 100644
index 0000000000..9d9e009998
--- /dev/null
+++ b/languages/messages/MessagesSes.php
@@ -0,0 +1,10 @@
+getMessage()}\n" . $e->getTraceAsString() . "\n";
+		$__val = eval( $__line . ";" );
+	} catch ( Exception $__e ) {
+		echo "Caught exception " . get_class( $__e ) .
+			": {$__e->getMessage()}\n" . $__e->getTraceAsString() . "\n";
 		continue;
 	}
-	if ( wfIsHHVM() || is_null( $val ) ) {
+	if ( wfIsHHVM() || is_null( $__val ) ) {
 		echo "\n";
-	} elseif ( is_string( $val ) || is_numeric( $val ) ) {
-		echo "$val\n";
+	} elseif ( is_string( $__val ) || is_numeric( $__val ) ) {
+		echo "$__val\n";
 	} else {
-		var_dump( $val );
+		var_dump( $__val );
 	}
 }
 
diff --git a/maintenance/initSiteStats.php b/maintenance/initSiteStats.php
index 49e0e9d71e..cac33ecc49 100644
--- a/maintenance/initSiteStats.php
+++ b/maintenance/initSiteStats.php
@@ -34,11 +34,7 @@ class InitSiteStats extends Maintenance {
 	public function __construct() {
 		parent::__construct();
 		$this->mDescription = "Re-initialise the site statistics tables";
-		$this->addOption(
-			'update',
-			'Update the existing statistics (preserves the ss_total_views field)'
-		);
-		$this->addOption( 'noviews', "Don't update the page view counter" );
+		$this->addOption( 'update', 'Update the existing statistics' );
 		$this->addOption( 'active', 'Also update active users count' );
 		$this->addOption( 'use-master', 'Count using the master database' );
 	}
@@ -63,12 +59,6 @@ class InitSiteStats extends Maintenance {
 		$image = $counter->files();
 		$this->output( "{$image}\n" );
 
-		if ( !$this->hasOption( 'noviews' ) ) {
-			$this->output( "Counting total page views..." );
-			$views = $counter->views();
-			$this->output( "{$views}\n" );
-		}
-
 		if ( $this->hasOption( 'update' ) ) {
 			$this->output( "\nUpdating site statistics..." );
 			$counter->refresh();
diff --git a/maintenance/showSiteStats.php b/maintenance/showSiteStats.php
index 374a66e92d..370d14eba0 100644
--- a/maintenance/showSiteStats.php
+++ b/maintenance/showSiteStats.php
@@ -44,7 +44,6 @@ class ShowSiteStats extends Maintenance {
 
 	public function execute() {
 		$fields = array(
-			'ss_total_views' => 'Total views',
 			'ss_total_edits' => 'Total edits',
 			'ss_good_articles' => 'Number of articles',
 			'ss_total_pages' => 'Total pages',
diff --git a/maintenance/updateSpecialPages.php b/maintenance/updateSpecialPages.php
index 61642828c9..d67ef6bb1a 100644
--- a/maintenance/updateSpecialPages.php
+++ b/maintenance/updateSpecialPages.php
@@ -81,16 +81,16 @@ class UpdateSpecialPages extends Maintenance {
 			if ( !$this->hasOption( 'only' ) || $this->getOption( 'only' ) == $queryPage->getName() ) {
 				$this->output( sprintf( '%-30s [QueryPage] ', $special ) );
 				if ( $queryPage->isExpensive() ) {
-					$t1 = explode( ' ', microtime() );
+					$t1 = microtime( true );
 					# Do the query
 					$num = $queryPage->recache( $limit === null ? $wgQueryCacheLimit : $limit );
-					$t2 = explode( ' ', microtime() );
+					$t2 = microtime( true );
 					if ( $num === false ) {
 						$this->output( "FAILED: database error\n" );
 					} else {
 						$this->output( "got $num rows in " );
 
-						$elapsed = ( $t2[0] - $t1[0] ) + ( $t2[1] - $t1[1] );
+						$elapsed = $t2 - $t1;
 						$hours = intval( $elapsed / 3600 );
 						$minutes = intval( $elapsed % 3600 / 60 );
 						$seconds = $elapsed - $hours * 3600 - $minutes * 60;
@@ -139,12 +139,12 @@ class UpdateSpecialPages extends Maintenance {
 					continue;
 				}
 				$this->output( sprintf( '%-30s [callback] ', $special ) );
-				$t1 = explode( ' ', microtime() );
+				$t1 = microtime( true );
 				call_user_func( $call, $dbw );
-				$t2 = explode( ' ', microtime() );
+				$t2 = microtime( true );
 
 				$this->output( "completed in " );
-				$elapsed = ( $t2[0] - $t1[0] ) + ( $t2[1] - $t1[1] );
+				$elapsed = $t2 - $t1;
 				$hours = intval( $elapsed / 3600 );
 				$minutes = intval( $elapsed % 3600 / 60 );
 				$seconds = $elapsed - $hours * 3600 - $minutes * 60;
diff --git a/resources/Resources.php b/resources/Resources.php
index acc937e2e7..ca90efa8dc 100644
--- a/resources/Resources.php
+++ b/resources/Resources.php
@@ -1595,6 +1595,8 @@ return array(
 			'ooui-outline-control-move-up',
 			'ooui-outline-control-remove',
 			'ooui-toolbar-more',
+			'ooui-toolgroup-collapse',
+			'ooui-toolgroup-expand',
 			'ooui-dialog-message-accept',
 			'ooui-dialog-message-reject',
 			'ooui-dialog-process-dismiss',
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/add.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/add.png
deleted file mode 100644
index 730d1029a4..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/icons/add.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/advanced.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/advanced.png
deleted file mode 100644
index 514ff1dbad..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/icons/advanced.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/alert.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/alert.png
deleted file mode 100644
index e98a14a947..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/icons/alert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/arched-arrow-ltr.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/arched-arrow-ltr.png
deleted file mode 100644
index 88db108921..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/icons/arched-arrow-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/arched-arrow-rtl.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/arched-arrow-rtl.png
deleted file mode 100644
index 0afcbfa558..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/icons/arched-arrow-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/check.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/check.png
deleted file mode 100644
index 9a2c9dbff0..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/icons/check.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/clear.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/clear.png
deleted file mode 100644
index 51a33ff801..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/icons/clear.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/close.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/close.png
deleted file mode 100644
index 4eedfbceb3..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/icons/close.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/code.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/code.png
deleted file mode 100644
index ee58c9a723..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/icons/code.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/collapse.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/collapse.png
deleted file mode 100644
index 353ac79803..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/icons/collapse.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/comment.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/comment.png
deleted file mode 100644
index 265a3e4135..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/icons/comment.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/expand.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/expand.png
deleted file mode 100644
index 9073d243c9..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/icons/expand.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/help.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/help.png
deleted file mode 100644
index b80df009be..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/icons/help.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/info.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/info.png
deleted file mode 100644
index eb0fb46888..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/icons/info.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/link.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/link.png
deleted file mode 100644
index 2a087a4bef..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/icons/link.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/menu.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/menu.png
deleted file mode 100644
index 0a781199fc..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/icons/menu.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/move-ltr.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/move-ltr.png
deleted file mode 100644
index fc4cd39088..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/icons/move-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/move-rtl.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/move-rtl.png
deleted file mode 100644
index dbce05ecb9..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/icons/move-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/picture.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/picture.png
deleted file mode 100644
index 2043424844..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/icons/picture.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/remove.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/remove.png
deleted file mode 100644
index 9dc34b8af5..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/icons/remove.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/search.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/search.png
deleted file mode 100644
index 39d3ab8c50..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/icons/search.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/settings.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/settings.png
deleted file mode 100644
index dd2706b4af..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/icons/settings.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/tag.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/tag.png
deleted file mode 100644
index 8e100fcbd4..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/icons/tag.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/icons/window.png b/resources/lib/oojs-ui/dist/themes/apex/images/icons/window.png
deleted file mode 100644
index db726a1914..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/icons/window.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/indicators/alert.png b/resources/lib/oojs-ui/dist/themes/apex/images/indicators/alert.png
deleted file mode 100644
index 5bf082785f..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/indicators/alert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-down.png b/resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-down.png
deleted file mode 100644
index 65747259cd..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-down.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-ltr.png b/resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-ltr.png
deleted file mode 100644
index 7c84397c11..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-rtl.png b/resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-rtl.png
deleted file mode 100644
index 5bf90642a4..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-up.png b/resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-up.png
deleted file mode 100644
index 1a05ade6da..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/indicators/arrow-up.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/indicators/required.png b/resources/lib/oojs-ui/dist/themes/apex/images/indicators/required.png
deleted file mode 100644
index 45eb03b64f..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/indicators/required.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/apex/images/textures/transparency.png b/resources/lib/oojs-ui/dist/themes/apex/images/textures/transparency.png
deleted file mode 100644
index 1843f27d2f..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/apex/images/textures/transparency.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/add-constructive.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/add-constructive.png
deleted file mode 100644
index 53d644107c..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/add-constructive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/add-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/add-invert.png
deleted file mode 100644
index d6144e3dcb..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/add-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/add.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/add.png
deleted file mode 100644
index 730d1029a4..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/add.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/advanced-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/advanced-invert.png
deleted file mode 100644
index e074515227..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/advanced-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/advanced.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/advanced.png
deleted file mode 100644
index 514ff1dbad..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/advanced.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/alert-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/alert-invert.png
deleted file mode 100644
index 5440113f77..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/alert-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/alert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/alert.png
deleted file mode 100644
index e98a14a947..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/alert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-ltr-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-ltr-invert.png
deleted file mode 100644
index 8a0714054c..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-ltr.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-ltr.png
deleted file mode 100644
index 88db108921..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-rtl-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-rtl-invert.png
deleted file mode 100644
index c6cbec19b3..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-rtl.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-rtl.png
deleted file mode 100644
index 0afcbfa558..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/arched-arrow-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/check-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/check-invert.png
deleted file mode 100644
index 1ff6790902..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/check-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/check-primary.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/check-primary.png
deleted file mode 100644
index 7566598f8f..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/check-primary.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/check.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/check.png
deleted file mode 100644
index 9a2c9dbff0..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/check.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/clear-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/clear-invert.png
deleted file mode 100644
index 5668e1275b..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/clear-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/clear.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/clear.png
deleted file mode 100644
index 51a33ff801..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/clear.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/close-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/close-invert.png
deleted file mode 100644
index 7b76ffe7df..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/close-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/close.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/close.png
deleted file mode 100644
index 4eedfbceb3..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/close.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/code-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/code-invert.png
deleted file mode 100644
index 23c598355b..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/code-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/code.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/code.png
deleted file mode 100644
index ee58c9a723..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/code.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/collapse-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/collapse-invert.png
deleted file mode 100644
index a9d0d33bb0..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/collapse-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/collapse.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/collapse.png
deleted file mode 100644
index 353ac79803..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/collapse.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/comment-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/comment-invert.png
deleted file mode 100644
index 0ed3528e5d..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/comment-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/comment.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/comment.png
deleted file mode 100644
index 265a3e4135..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/comment.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/expand-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/expand-invert.png
deleted file mode 100644
index 05f7138ba4..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/expand-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/expand.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/expand.png
deleted file mode 100644
index 9073d243c9..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/expand.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/help-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/help-invert.png
deleted file mode 100644
index 185c1a2766..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/help-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/help.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/help.png
deleted file mode 100644
index b80df009be..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/help.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/info-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/info-invert.png
deleted file mode 100644
index 83b00a27ba..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/info-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/info.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/info.png
deleted file mode 100644
index eb0fb46888..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/info.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/link-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/link-invert.png
deleted file mode 100644
index d92045985f..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/link-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/link.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/link.png
deleted file mode 100644
index 2a087a4bef..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/link.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/menu-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/menu-invert.png
deleted file mode 100644
index 0400c192d2..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/menu-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/menu.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/menu.png
deleted file mode 100644
index 0a781199fc..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/menu.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-ltr-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-ltr-invert.png
deleted file mode 100644
index 7c9bdc1c75..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-ltr.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-ltr.png
deleted file mode 100644
index fc4cd39088..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-rtl-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-rtl-invert.png
deleted file mode 100644
index e97d37b9d6..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-rtl.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-rtl.png
deleted file mode 100644
index dbce05ecb9..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/move-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/picture-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/picture-invert.png
deleted file mode 100644
index d6dc62c49e..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/picture-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/picture.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/picture.png
deleted file mode 100644
index 2043424844..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/picture.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/remove-destructive.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/remove-destructive.png
deleted file mode 100644
index 8b6799f094..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/remove-destructive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/remove-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/remove-invert.png
deleted file mode 100644
index 3343de8b1f..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/remove-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/remove.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/remove.png
deleted file mode 100644
index 9dc34b8af5..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/remove.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/search-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/search-invert.png
deleted file mode 100644
index 3e15dafc05..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/search-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/search.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/search.png
deleted file mode 100644
index 39d3ab8c50..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/search.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/settings-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/settings-invert.png
deleted file mode 100644
index 17b4379c4f..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/settings-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/settings.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/settings.png
deleted file mode 100644
index dd2706b4af..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/settings.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/tag-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/tag-invert.png
deleted file mode 100644
index c23342932a..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/tag-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/tag.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/tag.png
deleted file mode 100644
index 8e100fcbd4..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/tag.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/window-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/window-invert.png
deleted file mode 100644
index 1c6ed1f3ef..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/window-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/window.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/window.png
deleted file mode 100644
index db726a1914..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/icons/window.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/alert-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/alert-invert.png
deleted file mode 100644
index 28c8704c26..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/alert-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/alert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/alert.png
deleted file mode 100644
index 5bf082785f..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/alert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-down-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-down-invert.png
deleted file mode 100644
index 226eb5c308..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-down-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-down.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-down.png
deleted file mode 100644
index 9a418c9622..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-down.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-ltr-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-ltr-invert.png
deleted file mode 100644
index a34849523e..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-ltr.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-ltr.png
deleted file mode 100644
index bfed7d2624..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-rtl-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-rtl-invert.png
deleted file mode 100644
index 5080ea5bff..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-rtl.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-rtl.png
deleted file mode 100644
index 06398090f2..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-up-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-up-invert.png
deleted file mode 100644
index 0474926752..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-up-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-up.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-up.png
deleted file mode 100644
index ac9f0b5351..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/arrow-up.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/required-invert.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/required-invert.png
deleted file mode 100644
index 614c6e86a4..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/required-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/required.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/required.png
deleted file mode 100644
index 45eb03b64f..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/indicators/required.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/mediawiki/images/textures/transparency.png b/resources/lib/oojs-ui/dist/themes/mediawiki/images/textures/transparency.png
deleted file mode 100644
index 1843f27d2f..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/mediawiki/images/textures/transparency.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/minerva/images/icons/check-invert.png b/resources/lib/oojs-ui/dist/themes/minerva/images/icons/check-invert.png
deleted file mode 100644
index 9be50a627e..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/minerva/images/icons/check-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/dist/themes/minerva/images/icons/check.png b/resources/lib/oojs-ui/dist/themes/minerva/images/icons/check.png
deleted file mode 100644
index 654a034534..0000000000
Binary files a/resources/lib/oojs-ui/dist/themes/minerva/images/icons/check.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/i18n/de.json b/resources/lib/oojs-ui/i18n/de.json
index 546689b9e0..50d93eadc0 100644
--- a/resources/lib/oojs-ui/i18n/de.json
+++ b/resources/lib/oojs-ui/i18n/de.json
@@ -17,6 +17,8 @@
 	"ooui-outline-control-move-up": "Element nach oben verschieben",
 	"ooui-outline-control-remove": "Element entfernen",
 	"ooui-toolbar-more": "Mehr",
+	"ooui-toolgroup-expand": "Mehr",
+	"ooui-toolgroup-collapse": "Weniger",
 	"ooui-dialog-message-accept": "Okay",
 	"ooui-dialog-message-reject": "Abbrechen",
 	"ooui-dialog-process-error": "Etwas ist schief gelaufen",
diff --git a/resources/lib/oojs-ui/i18n/en.json b/resources/lib/oojs-ui/i18n/en.json
index 9e99440c5f..d1abd47c0e 100644
--- a/resources/lib/oojs-ui/i18n/en.json
+++ b/resources/lib/oojs-ui/i18n/en.json
@@ -20,6 +20,8 @@
 	"ooui-outline-control-move-up": "Move item up",
 	"ooui-outline-control-remove": "Remove item",
 	"ooui-toolbar-more": "More",
+	"ooui-toolgroup-expand": "More",
+	"ooui-toolgroup-collapse": "Fewer",
 	"ooui-dialog-message-accept": "OK",
 	"ooui-dialog-message-reject": "Cancel",
 	"ooui-dialog-process-error": "Something went wrong",
diff --git a/resources/lib/oojs-ui/i18n/lb.json b/resources/lib/oojs-ui/i18n/lb.json
index 1cbcb8adb9..270bae4695 100644
--- a/resources/lib/oojs-ui/i18n/lb.json
+++ b/resources/lib/oojs-ui/i18n/lb.json
@@ -14,6 +14,8 @@
 	"ooui-outline-control-move-up": "Element erop réckelen",
 	"ooui-outline-control-remove": "Element ewechhuelen",
 	"ooui-toolbar-more": "Méi",
+	"ooui-toolgroup-expand": "Méi",
+	"ooui-toolgroup-collapse": "Manner",
 	"ooui-dialog-message-accept": "OK",
 	"ooui-dialog-message-reject": "Ofbriechen",
 	"ooui-dialog-process-error": "Et ass eppes schif gaang",
diff --git a/resources/lib/oojs-ui/i18n/mk.json b/resources/lib/oojs-ui/i18n/mk.json
index d628034b4b..32856e80d2 100644
--- a/resources/lib/oojs-ui/i18n/mk.json
+++ b/resources/lib/oojs-ui/i18n/mk.json
@@ -10,6 +10,8 @@
 	"ooui-outline-control-move-up": "Помести нагоре",
 	"ooui-outline-control-remove": "Отстрани ставка",
 	"ooui-toolbar-more": "Повеќе",
+	"ooui-toolgroup-expand": "Повеќе",
+	"ooui-toolgroup-collapse": "Помалку",
 	"ooui-dialog-message-accept": "ОК",
 	"ooui-dialog-message-reject": "Откажи",
 	"ooui-dialog-process-error": "Нешто не е во ред",
diff --git a/resources/lib/oojs-ui/i18n/qqq.json b/resources/lib/oojs-ui/i18n/qqq.json
index 9b3bb6053c..b94207781e 100644
--- a/resources/lib/oojs-ui/i18n/qqq.json
+++ b/resources/lib/oojs-ui/i18n/qqq.json
@@ -24,6 +24,8 @@
 	"ooui-outline-control-move-up": "Tool tip for a button that moves items in a list up one place",
 	"ooui-outline-control-remove": "Tool tip for a button that removes items from a list.\n{{Identical|Remove item}}",
 	"ooui-toolbar-more": "Label for the toolbar group that contains a list of all other available tools.\n{{Identical|More}}",
+	"ooui-toolgroup-expand": "Label for the fake tool that expands the full list of tools in a toolbar group\n{{Identical|More}}",
+	"ooui-toolgroup-collapse": "Label for the fake tool that collapses the full list of tools in a toolbar group\n{{Identical|Fewer}}",
 	"ooui-dialog-message-accept": "Default label for the accept button of a message dialog\n{{Identical|OK}}",
 	"ooui-dialog-message-reject": "Default label for the reject button of a message dialog\n{{Identical|Cancel}}",
 	"ooui-dialog-process-error": "Title for process dialog error description",
diff --git a/resources/lib/oojs-ui/i18n/ru.json b/resources/lib/oojs-ui/i18n/ru.json
index efd106275d..649a9377ea 100644
--- a/resources/lib/oojs-ui/i18n/ru.json
+++ b/resources/lib/oojs-ui/i18n/ru.json
@@ -22,6 +22,8 @@
 	"ooui-outline-control-move-up": "Переместить элемент вверх",
 	"ooui-outline-control-remove": "Удалить пункт",
 	"ooui-toolbar-more": "Ещё",
+	"ooui-toolgroup-expand": "Больше",
+	"ooui-toolgroup-collapse": "Меньше",
 	"ooui-dialog-message-accept": "ОК",
 	"ooui-dialog-message-reject": "Отмена",
 	"ooui-dialog-process-error": "Что-то пошло не так",
diff --git a/resources/lib/oojs-ui/i18n/sk.json b/resources/lib/oojs-ui/i18n/sk.json
index 07d9828692..c8246da97f 100644
--- a/resources/lib/oojs-ui/i18n/sk.json
+++ b/resources/lib/oojs-ui/i18n/sk.json
@@ -5,8 +5,8 @@
 			"Teslaton"
 		]
 	},
-	"ooui-dialog-action-close": "Zatvoriť",
 	"ooui-outline-control-move-down": "Posunúť položku nadol",
 	"ooui-outline-control-move-up": "Posunúť položku nahor",
+	"ooui-outline-control-remove": "Odstrániť položku",
 	"ooui-toolbar-more": "Viac"
 }
diff --git a/resources/lib/oojs-ui/i18n/zh-hans.json b/resources/lib/oojs-ui/i18n/zh-hans.json
index 02bdafad6a..fa86ea7062 100644
--- a/resources/lib/oojs-ui/i18n/zh-hans.json
+++ b/resources/lib/oojs-ui/i18n/zh-hans.json
@@ -23,6 +23,8 @@
 	"ooui-outline-control-move-up": "上移项",
 	"ooui-outline-control-remove": "删除项",
 	"ooui-toolbar-more": "更多",
+	"ooui-toolgroup-expand": "更多",
+	"ooui-toolgroup-collapse": "更少",
 	"ooui-dialog-message-accept": "确定",
 	"ooui-dialog-message-reject": "取消",
 	"ooui-dialog-process-error": "发生一些错误",
diff --git a/resources/lib/oojs-ui/i18n/zh-hant.json b/resources/lib/oojs-ui/i18n/zh-hant.json
index cde5ffe743..4b5d065d70 100644
--- a/resources/lib/oojs-ui/i18n/zh-hant.json
+++ b/resources/lib/oojs-ui/i18n/zh-hant.json
@@ -20,6 +20,7 @@
 	"ooui-outline-control-move-up": "項目上移",
 	"ooui-outline-control-remove": "移除項目",
 	"ooui-toolbar-more": "更多",
+	"ooui-toolgroup-expand": "更多",
 	"ooui-dialog-message-accept": "確定",
 	"ooui-dialog-message-reject": "取消",
 	"ooui-dialog-process-error": "發生不明錯誤",
diff --git a/resources/lib/oojs-ui/oojs-ui-apex.css b/resources/lib/oojs-ui/oojs-ui-apex.css
index 08b1d0e65e..30f4861c94 100644
--- a/resources/lib/oojs-ui/oojs-ui-apex.css
+++ b/resources/lib/oojs-ui/oojs-ui-apex.css
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (1829141230)
+ * OOjs UI v0.1.0-pre (db065e5a9f)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-10-15T22:50:09Z
+ * Date: 2014-10-20T14:47:55Z
  */
 /* @noflip */
 .oo-ui-rtl {
@@ -144,6 +144,7 @@
 	border-color: #aaaaaa;
 	outline: none;
 }
+.oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
 	line-height: 1.9em;
 }
@@ -430,6 +431,7 @@
 	z-index: 4;
 }
 .oo-ui-popupTool .oo-ui-popupWidget {
+	/* @noflip */
 	margin-left: 1.25em;
 	font-size: 0.8em;
 }
@@ -1099,6 +1101,8 @@
 }
 .oo-ui-popupWidget {
 	position: absolute;
+	/* @noflip */
+	left: 0;
 }
 .oo-ui-popupWidget-popup {
 	position: relative;
@@ -1113,6 +1117,8 @@
 	display: block;
 	position: absolute;
 	top: 0;
+	/* @noflip */
+	left: 0;
 	background-repeat: no-repeat;
 }
 .oo-ui-popupWidget-head {
@@ -1603,6 +1609,7 @@
 .oo-ui-window-inner-overlay {
 	position: absolute;
 	top: 0;
+	/* @noflip */
 	left: 0;
 }
 .oo-ui-window-isolated,
diff --git a/resources/lib/oojs-ui/oojs-ui-apex.js b/resources/lib/oojs-ui/oojs-ui-apex.js
index 11b03f68a9..2e4bb784d9 100644
--- a/resources/lib/oojs-ui/oojs-ui-apex.js
+++ b/resources/lib/oojs-ui/oojs-ui-apex.js
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (1829141230)
+ * OOjs UI v0.1.0-pre (db065e5a9f)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-10-15T22:49:59Z
+ * Date: 2014-10-20T14:47:45Z
  */
 /* Instantiation */
 
diff --git a/resources/lib/oojs-ui/oojs-ui-apex.rtl.css b/resources/lib/oojs-ui/oojs-ui-apex.rtl.css
deleted file mode 100644
index 7dd7b61b0f..0000000000
--- a/resources/lib/oojs-ui/oojs-ui-apex.rtl.css
+++ /dev/null
@@ -1,1929 +0,0 @@
-/*!
- * OOjs UI v0.1.0
- * https://www.mediawiki.org/wiki/OOjs_UI
- *
- * Copyright 2011–2014 OOjs Team and other contributors.
- * Released under the MIT license
- * http://oojs.mit-license.org
- *
- * Date: 2014-09-11T19:39:50Z
- */
-/*
- * Blank theme mixins.
- *
- * Base styles invoke these mixins at the end of their definitions. Override these mixins to add
- * additional rules to the base styles.
- */
-/*
- * Base styles.
- *
- * Themes should include this file after defining their variables and mixins.
- */
-/* @noflip */
-.oo-ui-rtl {
-  direction: rtl;
-}
-/* @noflip */
-.oo-ui-ltr {
-  direction: ltr;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button {
-  cursor: pointer;
-  display: inline-block;
-  vertical-align: middle;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  display: none;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-  display: none;
-}
-.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
-  cursor: default;
-}
-.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  display: inline-block;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-buttonElement-frameless {
-  display: inline-block;
-  position: relative;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-  display: inline-block;
-  vertical-align: top;
-  text-align: center;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-  cursor: default;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button {
-  color: #333;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  margin-right: 0;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-  margin-left: -0.75em;
-}
-.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  opacity: 0.8;
-  width: 1.9em;
-  height: 1.9em;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  /* Don't animate opacities for now, causes wiggling in Chrome (bug 63020) */
-  /*.oo-ui-transition(opacity 200ms);*/
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-iconElement-icon,
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-iconElement-icon {
-  opacity: 1;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
-  color: #000;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #333;
-  margin-right: 0.25em;
-}
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #087ecc;
-}
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #76ab36;
-}
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #d45353;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #ccc;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-  margin: 0.1em 0;
-  padding: 0.2em 0.8em;
-  border-radius: 0.3em;
-  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
-  border: 1px #c9c9c9 solid;
-  -webkit-transition: border-color 100ms ease-in-out;
-  -moz-transition: border-color 100ms ease-in-out;
-  -ms-transition: border-color 100ms ease-in-out;
-  -o-transition: border-color 100ms ease-in-out;
-  transition: border-color 100ms ease-in-out;
-  background: #eeeeee;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
-  background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: linear-gradient(top, #ffffff 0%, #dddddd 100%);
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
-  border-color: #aaa;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  line-height: 1.9em;
-}
-.oo-ui-buttonElement-framed.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-  box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
-  color: black;
-  border-color: #c9c9c9;
-  background: #eeeeee;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #dddddd 0%, #ffffff 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  margin-right: -0.5em;
-  margin-left: -0.5em;
-}
-.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  margin-right: -0.5em;
-  margin-left: 0.3em;
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button {
-  border: solid 1px #a6cee1;
-  background: #cde7f4;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
-  background-image: -webkit-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-  background-image: -moz-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-  background-image: -ms-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-  background-image: -o-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-  background-image: linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus {
-  border-color: #9dc2d4;
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-  border: solid 1px #a6cee1;
-  background: #cde7f4;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
-  background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
-  border: solid 1px #b8d892;
-  background: #daf0be;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f0fbe1', endColorstr='#c3e59a');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f0fbe1), color-stop(100%, #c3e59a));
-  background-image: -webkit-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-  background-image: -moz-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-  background-image: -ms-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-  background-image: -o-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-  background-image: linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
-  border-color: #adcb89;
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-  border: solid 1px #b8d892;
-  background: #daf0be;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#c3e59a', endColorstr='#f0fbe1');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #c3e59a), color-stop(100%, #f0fbe1));
-  background-image: -webkit-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-  background-image: -moz-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-  background-image: -ms-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-  background-image: -o-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-  background-image: linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
-  color: #d45353;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-  opacity: 0.5;
-  box-shadow: none;
-  color: #333;
-  background: #eee;
-  border-color: #ccc;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button:focus,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:focus,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:focus {
-  border-color: #ccc;
-  box-shadow: none;
-}
-.oo-ui-clippableElement-clippable {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
-  overflow-y: hidden;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-  width: 100%;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
-  padding: 2em;
-}
-.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 3em;
-  overflow-y: auto;
-}
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-  position: absolute;
-  bottom: 0;
-  right: 0;
-  left: 0;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-  padding: 1.5em;
-}
-.oo-ui-bookletLayout-outlinePanel {
-  border-left: solid 1px #ddd;
-}
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-  box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-fieldLayout {
-  margin-bottom: 1em;
-}
-.oo-ui-fieldLayout:before,
-.oo-ui-fieldLayout:after {
-  content: " ";
-  display: table;
-}
-.oo-ui-fieldLayout:after {
-  clear: both;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-  display: block;
-  float: right;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-  display: block;
-  float: right;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-  text-align: left;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
-  display: inline-block;
-}
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
-  z-index: 1;
-}
-.oo-ui-fieldLayout:last-child {
-  margin-bottom: 0;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-  padding-top: 0.5em;
-  margin-left: 5%;
-  width: 35%;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-  width: 60%;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
-  padding: 0.75em 0.5em 0.5em 0.5em;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-  padding: 0.5em 0;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
-  padding: 0.5em 0;
-}
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  margin-top: 0.25em;
-}
-.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
-  color: #ccc;
-}
-.oo-ui-fieldsetLayout {
-  position: relative;
-  margin: 0;
-  padding: 0;
-  border: none;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-  display: block;
-  position: absolute;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
-  display: inline-block;
-}
-.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
-  margin-top: 2em;
-}
-.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
-  font-size: 1.5em;
-  margin-bottom: 0.5em;
-  padding: 0.25em 0;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
-  padding-right: 1.75em;
-  line-height: 1.33em;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-  right: 0;
-  top: 0.25em;
-  width: 2em;
-  height: 2em;
-}
-.oo-ui-gridLayout {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 0;
-}
-.oo-ui-panelLayout {
-  position: relative;
-}
-.oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-.oo-ui-panelLayout-expanded {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 0;
-}
-.oo-ui-panelLayout-padded {
-  padding: 1.25em;
-}
-.oo-ui-stackLayout > .oo-ui-panelLayout {
-  display: none;
-}
-.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
-  display: block;
-  position: relative;
-}
-.oo-ui-popupTool .oo-ui-popupWidget-popup,
-.oo-ui-popupTool .oo-ui-popupWidget-anchor {
-  z-index: 4;
-}
-.oo-ui-popupTool .oo-ui-popupWidget {
-  margin-right: 1.25em;
-  font-size: 0.8em;
-}
-.oo-ui-toolGroup {
-  display: inline-block;
-  vertical-align: middle;
-  margin: 0.3em;
-  border-radius: 0.25em;
-  border: solid 1px transparent;
-  -webkit-transition: border-color 300ms ease-in-out;
-  -moz-transition: border-color 300ms ease-in-out;
-  -ms-transition: border-color 300ms ease-in-out;
-  -o-transition: border-color 300ms ease-in-out;
-  transition: border-color 300ms ease-in-out;
-}
-.oo-ui-toolGroup-empty {
-  display: none;
-}
-.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-toolGroup.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
-  color: #000;
-}
-.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
-.oo-ui-barToolGroup > .oo-ui-labelElement-label {
-  display: none;
-}
-.oo-ui-barToolGroup .oo-ui-tool {
-  display: inline-block;
-  position: relative;
-  vertical-align: top;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link {
-  display: block;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  display: block;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  display: none;
-}
-.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-.oo-ui-barToolGroup .oo-ui-tool-title,
-.oo-ui-barToolGroup .oo-ui-tool-accel {
-  display: none;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
-  cursor: pointer;
-}
-.oo-ui-barToolGroup .oo-ui-tool {
-  margin: -1px -1px -1px 0;
-  border: solid 1px transparent;
-}
-.oo-ui-barToolGroup .oo-ui-tool:first-child {
-  border-top-right-radius: 0.25em;
-  border-bottom-right-radius: 0.25em;
-}
-.oo-ui-barToolGroup .oo-ui-tool:last-child {
-  margin-left: -1px;
-  border-top-left-radius: 0.25em;
-  border-bottom-left-radius: 0.25em;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link {
-  height: 1.5em;
-  padding: 0.25em;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  height: 1.5em;
-  width: 1.5em;
-  opacity: 0.8;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled {
-  border-color: rgba(0, 0, 0, 0.2);
-  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
-  background: #f8fbfd;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
-  border-right-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 0.8;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 1;
-}
-.oo-ui-barToolGroup.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-popupToolGroup {
-  position: relative;
-  height: 2em;
-  min-width: 2.5em;
-}
-.oo-ui-popupToolGroup-handle {
-  display: block;
-  cursor: pointer;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-  position: absolute;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
-  cursor: default;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-  display: none;
-  position: absolute;
-  z-index: 4;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
-  background-repeat: no-repeat;
-  background-position: center center;
-}
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
-  display: block;
-}
-.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
-  right: 0;
-}
-.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
-  left: 0;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-accel {
-  display: none;
-}
-.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
-  min-width: 3.5em;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-  top: 0;
-  width: 2em;
-  height: 2em;
-  opacity: 0.8;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
-  left: 0;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-  right: 0.25em;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-  line-height: 2.6em;
-  font-size: 0.8em;
-  margin: 0 1em;
-}
-.oo-ui-popupToolGroup-header {
-  line-height: 2.6em;
-  font-size: 0.8em;
-  margin: 0 0.6em;
-  font-weight: bold;
-}
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled {
-  border-bottom-right-radius: 0;
-  border-bottom-left-radius: 0;
-  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
-  background: #f8fbfd;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-}
-.oo-ui-popupToolGroup.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-  margin-right: 3em;
-}
-.oo-ui-popupToolGroup.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-  margin-left: 2.25em;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-  top: 2em;
-  margin: 0 -1px;
-  border: solid 1px #ccc;
-  background-color: white;
-  box-shadow: 0 0.25em 1em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  height: 2em;
-  width: 2em;
-  margin-left: 0.25em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  line-height: 2em;
-  font-size: 0.8em;
-}
-.oo-ui-listToolGroup .oo-ui-tool {
-  display: inline-block;
-  width: 100%;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-  display: block;
-  cursor: pointer;
-  white-space: nowrap;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
-  padding: 0.25em;
-}
-.oo-ui-listToolGroup.oo-ui-popupToolGroup-active {
-  border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-listToolGroup .oo-ui-tool {
-  border: solid 1px transparent;
-  margin: -1px 0;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-  padding-left: 0.5em;
-}
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
-  border-color: rgba(0, 0, 0, 0.1);
-  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
-  background: #f8fbfd;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-}
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
-  border-top-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 0.8;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 1;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
-  color: #ccc;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-listToolGroup.oo-ui-widget-disabled {
-  color: #ccc;
-}
-.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
-.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-menuToolGroup {
-  border-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-menuToolGroup .oo-ui-tool {
-  display: block;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-  display: block;
-  cursor: pointer;
-  white-space: nowrap;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  background-image: none;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
-  background-image: /* @embed */ url(images/icons/check.svg);
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
-  min-width: 8em;
-}
-.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
-  padding: 0.25em 0 0.25em 0;
-}
-.oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
-  border-color: rgba(0, 0, 0, 0.25);
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-  padding: 0 0.25em 0 1em;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
-  background-color: #e1f3ff;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
-  color: #ccc;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-menuToolGroup.oo-ui-widget-disabled {
-  color: #ccc;
-  border-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
-.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-toolbar {
-  clear: both;
-}
-.oo-ui-toolbar-bar {
-  line-height: 1em;
-}
-.oo-ui-toolbar-actions {
-  float: left;
-}
-.oo-ui-toolbar-tools {
-  display: inline;
-}
-.oo-ui-toolbar-tools,
-.oo-ui-toolbar-actions,
-.oo-ui-toolbar-shadow {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-toolbar-actions .oo-ui-popupWidget {
-  -webkit-touch-callout: default;
-  -webkit-user-select: all;
-  -moz-user-select: all;
-  -ms-user-select: all;
-  user-select: all;
-}
-.oo-ui-toolbar-shadow {
-  background-position: right top;
-  background-repeat: repeat-x;
-  position: absolute;
-  width: 100%;
-  pointer-events: none;
-}
-.oo-ui-toolbar-bar {
-  border-bottom: solid 1px #ccc;
-  background: #f8fbfd;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#f1f7fb');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f1f7fb));
-  background-image: -webkit-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-  background-image: -moz-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-  background-image: -ms-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-  background-image: -o-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-  background-image: linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-}
-.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
-  border: none;
-  background: none;
-}
-.oo-ui-toolbar-shadow {
-  background-image: /* @embed */ url(images/toolbar-shadow.png);
-  bottom: -9px;
-  height: 9px;
-  opacity: 0.125;
-  -webkit-transition: opacity 500ms ease-in-out;
-  -moz-transition: opacity 500ms ease-in-out;
-  -ms-transition: opacity 500ms ease-in-out;
-  -o-transition: opacity 500ms ease-in-out;
-  transition: opacity 500ms ease-in-out;
-}
-.oo-ui-optionWidget {
-  position: relative;
-  display: block;
-  cursor: pointer;
-  padding: 0.5em 3em 0.5em 2em;
-  border: none;
-}
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-  cursor: default;
-}
-.oo-ui-optionWidget .oo-ui-labelElement-label {
-  display: block;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-.oo-ui-optionWidget-highlighted {
-  background-color: #e1f3ff;
-}
-.oo-ui-optionWidget .oo-ui-labelElement-label {
-  line-height: 1.5em;
-}
-.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected {
-  background-color: #a7dcff;
-}
-.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
-  background-color: #a7dcff;
-}
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-  color: #ccc;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-  position: absolute;
-  background-repeat: no-repeat;
-  background-position: center center;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-  top: 50%;
-  width: 2em;
-  height: 2em;
-  margin-top: -1em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
-  right: 0.5em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-  left: 0.5em;
-}
-.oo-ui-buttonSelectWidget {
-  display: inline-block;
-  white-space: nowrap;
-  border-radius: 0.3em;
-}
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-  border-radius: 0;
-  margin-right: -1px;
-}
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
-  border-bottom-right-radius: 0.3em;
-  border-top-right-radius: 0.3em;
-  margin-right: 0;
-}
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
-  border-bottom-left-radius: 0.3em;
-  border-top-left-radius: 0.3em;
-}
-.oo-ui-buttonOptionWidget {
-  display: inline-block;
-  padding: 0;
-  background-color: transparent;
-}
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-  position: relative;
-}
-.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  position: static;
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-  height: 1.9em;
-}
-.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  height: 1.9em;
-  margin-top: 0;
-}
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
-  background-color: transparent;
-}
-.oo-ui-labelWidget {
-  display: inline-block;
-  padding: 0.5em 0;
-}
-.oo-ui-iconWidget {
-  display: inline-block;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-  line-height: 2.5em;
-  height: 1.9em;
-  width: 1.9em;
-  opacity: 0.8;
-}
-.oo-ui-iconWidget.oo-ui-widget-disabled {
-  opacity: 0.2;
-}
-.oo-ui-indicatorWidget {
-  display: inline-block;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-  line-height: 2.5em;
-  height: 1.9em;
-  width: 1.9em;
-  opacity: 0.8;
-}
-.oo-ui-indicatorWidget.oo-ui-widget-disabled {
-  opacity: 0.2;
-}
-.oo-ui-buttonWidget {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-buttonGroupWidget {
-  display: inline-block;
-  white-space: nowrap;
-  border-radius: 0.3em;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-  border-radius: 0;
-  margin-bottom: -1px;
-  margin-right: -1px;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
-  border-bottom-right-radius: 0.3em;
-  border-top-right-radius: 0.3em;
-  margin-right: 0;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
-  border-bottom-left-radius: 0.3em;
-  border-top-left-radius: 0.3em;
-}
-.oo-ui-toggleSwitchWidget {
-  position: relative;
-  display: inline-block;
-  vertical-align: middle;
-  overflow: hidden;
-  cursor: pointer;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  -webkit-transform: translateZ(0px);
-  -moz-transform: translateZ(0px);
-  -ms-transform: translateZ(0px);
-  -o-transform: translateZ(0px);
-  transform: translateZ(0px);
-  height: 2em;
-  width: 4em;
-  border-radius: 1em;
-  box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
-  border: solid 1px #ccc;
-  background: #eeeeee;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #dddddd 0%, #ffffff 100%);
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-  cursor: default;
-}
-.oo-ui-toggleSwitchWidget-grip {
-  position: absolute;
-  display: block;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  right: 0;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-  display: none;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-  opacity: 0.5;
-}
-.oo-ui-toggleSwitchWidget-grip {
-  top: 0.25em;
-  right: 0.25em;
-  width: 1.5em;
-  height: 1.5em;
-  margin-top: -1px;
-  border-radius: 1em;
-  box-shadow: 0 0.1em 0.25em rgba(0, 0, 0, 0.1);
-  border: 1px #c9c9c9 solid;
-  -webkit-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-  -moz-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-  -ms-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-  -o-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-  transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-  background: #eeeeee;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
-  background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: linear-gradient(top, #ffffff 0%, #dddddd 100%);
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover,
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip {
-  border-color: #aaa;
-}
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-  border-radius: 1em;
-  box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
-  -webkit-transition: opacity 200ms ease-in-out;
-  -moz-transition: opacity 200ms ease-in-out;
-  -ms-transition: opacity 200ms ease-in-out;
-  -o-transition: opacity 200ms ease-in-out;
-  transition: opacity 200ms ease-in-out;
-  background: #cde7f4;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
-  background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-}
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
-  opacity: 1;
-}
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
-  right: 2.25em;
-  margin-right: -2px;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-  display: block;
-  opacity: 0;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
-  right: 0.25em;
-  margin-right: 0;
-}
-.oo-ui-popupWidget-popup {
-  position: absolute;
-  overflow: hidden;
-  z-index: 1;
-}
-.oo-ui-popupWidget-anchor {
-  display: none;
-  z-index: 1;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
-  display: block;
-  position: absolute;
-  background-repeat: no-repeat;
-}
-.oo-ui-popupWidget-head {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-  float: left;
-}
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
-  float: right;
-  cursor: default;
-}
-.oo-ui-popupWidget-body {
-  clear: both;
-  overflow: hidden;
-}
-.oo-ui-popupWidget-popup {
-  border: solid 1px #ccc;
-  border-radius: 0.25em;
-  background-color: #fff;
-  box-shadow: 0 0.15em 0.5em 0 rgba(0, 0, 0, 0.2);
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
-  margin-top: 7px;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
-  width: 15px;
-  height: 8px;
-  margin-right: -7px;
-  background-image: /* @embed */ url(images/anchor.svg);
-}
-.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
-  -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
-  -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
-  -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
-  -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
-  transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
-}
-.oo-ui-popupWidget-head {
-  height: 2.5em;
-}
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-  margin: 0.25em;
-}
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
-  margin: 0.75em 1em;
-}
-.oo-ui-popupWidget-body {
-  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-popupWidget-body-padded {
-  padding: 0 1em;
-}
-.oo-ui-popupButtonWidget {
-  position: relative;
-}
-.oo-ui-popupButtonWidget .oo-ui-popupWidget {
-  position: absolute;
-  right: 1em;
-  cursor: auto;
-}
-.oo-ui-textInputWidget {
-  position: relative;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  width: 20em;
-}
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-  display: inline-block;
-  width: 100%;
-  resize: none;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
-  position: absolute;
-  top: 0;
-  height: 100%;
-  background-repeat: no-repeat;
-  cursor: pointer;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
-  right: 0;
-}
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
-  left: 0;
-}
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-  padding: 0.5em;
-  font-size: 1em;
-  font-family: sans-serif;
-  background-color: #fff;
-  border: solid 1px #ccc;
-  box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
-  border-radius: 0.25em;
-  -webkit-transition: border-color 200ms, box-shadow 200ms;
-  -moz-transition: border-color 200ms, box-shadow 200ms;
-  -ms-transition: border-color 200ms, box-shadow 200ms;
-  -o-transition: border-color 200ms, box-shadow 200ms;
-  transition: border-color 200ms, box-shadow 200ms;
-}
-.oo-ui-textInputWidget-decorated input,
-.oo-ui-textInputWidget-decorated textarea {
-  padding-right: 2em;
-}
-.oo-ui-textInputWidget-icon {
-  width: 2em;
-}
-.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
-  outline: none;
-  border-color: #a7dcff;
-  box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
-}
-.oo-ui-textInputWidget input[readonly],
-.oo-ui-textInputWidget textarea[readonly] {
-  color: #777;
-  text-shadow: 0 1px 1px #fff;
-}
-.oo-ui-textInputWidget-pending input,
-.oo-ui-textInputWidget-pending textarea {
-  background-color: transparent;
-}
-.oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
-  color: #ccc;
-  text-shadow: 0 1px 1px #fff;
-  border-color: #ddd;
-  background-color: #f3f3f3;
-}
-.oo-ui-textInputWidget .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget .oo-ui-indicatorElement-indicator {
-  opacity: 0.8;
-}
-.oo-ui-textInputWidget.oo-ui-iconElement input,
-.oo-ui-textInputWidget.oo-ui-iconElement textarea {
-  padding-right: 2em;
-}
-.oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-  width: 2em;
-  background-position: left center;
-}
-.oo-ui-textInputWidget.oo-ui-indicatorElement input,
-.oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
-  padding-left: 1.5em;
-}
-.oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  width: 1.5em;
-  background-position: right center;
-}
-.oo-ui-menuWidget {
-  position: absolute;
-  background: #fff;
-  margin-top: -1px;
-  border: solid 1px #ccc;
-  border-radius: 0 0 0.25em 0.25em;
-  box-shadow: 0 0.15em 1em 0 rgba(0, 0, 0, 0.2);
-}
-.oo-ui-menuWidget input {
-  position: absolute;
-  width: 0;
-  height: 0;
-  overflow: hidden;
-  opacity: 0;
-}
-.oo-ui-menuItemWidget {
-  position: relative;
-}
-.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
-  display: none;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-  background-color: transparent;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
-  display: block;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-  background-color: transparent;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted,
-.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
-  background-color: #e1f3ff;
-}
-.oo-ui-menuSectionItemWidget {
-  cursor: default;
-  padding: 0.33em 0.75em;
-  color: #888;
-}
-.oo-ui-inlineMenuWidget {
-  position: relative;
-  display: inline-block;
-  margin: 0.25em 0;
-  min-width: 20em;
-}
-.oo-ui-inlineMenuWidget-handle {
-  width: 100%;
-  display: inline-block;
-  cursor: pointer;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
-  position: absolute;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
-  z-index: 1;
-  width: 100%;
-}
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
-  cursor: default;
-}
-.oo-ui-inlineMenuWidget-handle {
-  height: 2.5em;
-  border: solid 1px rgba(0, 0, 0, 0.1);
-  border-radius: 0.25em;
-}
-.oo-ui-inlineMenuWidget-handle:hover {
-  border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
-  left: 0;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
-  right: 0.25em;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
-  line-height: 2.5em;
-  margin: 0 0.5em;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
-  top: 0;
-  width: 2.5em;
-  height: 2.5em;
-  opacity: 0.8;
-}
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
-  color: #ccc;
-  text-shadow: 0 1px 1px #fff;
-  border-color: #ddd;
-  background-color: #f3f3f3;
-}
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
-  opacity: 0.2;
-}
-.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
-  margin-right: 3em;
-}
-.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
-  margin-left: 2em;
-}
-.oo-ui-outlineItemWidget {
-  position: relative;
-  cursor: pointer;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  font-size: 1.1em;
-  padding: 0.75em;
-}
-.oo-ui-outlineItemWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
-  padding-left: 1.5em;
-}
-.oo-ui-outlineItemWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  opacity: 0.5;
-}
-.oo-ui-outlineItemWidget-level-0 {
-  padding-right: 3.5em;
-}
-.oo-ui-outlineItemWidget-level-0 .oo-ui-iconElement-icon {
-  right: 1em;
-}
-.oo-ui-outlineItemWidget-level-1 {
-  padding-right: 5em;
-}
-.oo-ui-outlineItemWidget-level-1 .oo-ui-iconElement-icon {
-  right: 2.5em;
-}
-.oo-ui-outlineItemWidget-level-2 {
-  padding-right: 6.5em;
-}
-.oo-ui-outlineItemWidget-level-2 .oo-ui-iconElement-icon {
-  right: 4em;
-}
-.oo-ui-selectWidget-depressed .oo-ui-outlineItemWidget.oo-ui-optionWidget-selected {
-  background-color: #a7dcff;
-  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
-}
-.oo-ui-outlineItemWidget.oo-ui-flaggedElement-important {
-  font-weight: bold;
-}
-.oo-ui-outlineItemWidget.oo-ui-flaggedElement-placeholder {
-  font-style: italic;
-}
-.oo-ui-outlineItemWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
-  opacity: 0.5;
-}
-.oo-ui-outlineItemWidget.oo-ui-flaggedElement-empty .oo-ui-labelElement-label {
-  color: #777;
-}
-.oo-ui-outlineControlsWidget {
-  height: 3em;
-  background-color: #fff;
-}
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-  float: right;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
-  float: right;
-  background-position: left center;
-  background-repeat: no-repeat;
-}
-.oo-ui-outlineControlsWidget-items {
-  float: right;
-}
-.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
-  float: right;
-}
-.oo-ui-outlineControlsWidget-movers {
-  float: left;
-}
-.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
-  float: left;
-}
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-  height: 2em;
-  margin: 0.5em;
-  padding: 0;
-}
-.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
-  width: 1.5em;
-  height: 2em;
-  margin: 0.5em 0.5em 0.5em 0;
-  opacity: 0.2;
-}
-.oo-ui-outlineControlsWidget-items {
-  margin-right: 0;
-}
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
-  z-index: 1;
-  min-width: 20em;
-}
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget-handle {
-  border: solid 1px rgba(0, 0, 0, 0.1);
-  border-radius: 0.25em;
-}
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget-handle:hover {
-  border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget.oo-ui-widget-disabled .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator,
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget-empty .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  cursor: default;
-  opacity: 0.2;
-}
-.oo-ui-searchWidget-query {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-}
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-  width: 100%;
-}
-.oo-ui-searchWidget-results {
-  position: absolute;
-  bottom: 0;
-  right: 0;
-  left: 0;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-.oo-ui-searchWidget-query {
-  height: 4em;
-  padding: 0 1em;
-  box-shadow: 0 0 0.5em rgba(0, 0, 0, 0.2);
-}
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-  margin: 0.75em 0;
-}
-.oo-ui-searchWidget-results {
-  top: 4em;
-  padding: 1em;
-  line-height: 0;
-}
-.oo-ui-window {
-  line-height: 1em;
-  /* Content div takes focus when opened, so hide outline */
-}
-.oo-ui-window-frame {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-window-frame > iframe {
-  width: 100%;
-  height: 100%;
-  margin: 0;
-  padding: 0;
-}
-.oo-ui-window-content:focus {
-  outline: none;
-}
-.oo-ui-window-head,
-.oo-ui-window-foot {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-window-body {
-  margin: 0;
-  padding: 0;
-  background: none;
-}
-.oo-ui-window-overlay {
-  position: absolute;
-  top: 0;
-  right: 0;
-}
-.oo-ui-window-isolated {
-  background-color: transparent;
-  background-image: none;
-  font-family: sans-serif;
-  font-size: 0.8em;
-}
-.oo-ui-dialog-content > .oo-ui-window-head,
-.oo-ui-dialog-content > .oo-ui-window-body,
-.oo-ui-dialog-content > .oo-ui-window-foot {
-  position: absolute;
-  right: 0;
-  left: 0;
-  overflow: hidden;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-dialog-content > .oo-ui-window-head {
-  z-index: 1;
-  top: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-body {
-  z-index: 2;
-  top: 0;
-  bottom: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-foot {
-  z-index: 1;
-  bottom: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-overlay {
-  z-index: 3;
-}
-.oo-ui-dialog-content > .oo-ui-window-body {
-  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-messageDialog-actions-horizontal {
-  display: table;
-  table-layout: fixed;
-  width: 100%;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-  display: table-cell;
-  width: 1%;
-}
-.oo-ui-messageDialog-actions-vertical {
-  display: block;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-  display: block;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget {
-  position: relative;
-  text-align: center;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
-  display: block;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
-  position: relative;
-  top: auto;
-  bottom: auto;
-  display: inline;
-  white-space: nowrap;
-}
-.oo-ui-messageDialog-content .oo-ui-window-body {
-  box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
-}
-.oo-ui-messageDialog-title,
-.oo-ui-messageDialog-message {
-  display: block;
-  text-align: center;
-  padding-top: 0.5em;
-}
-.oo-ui-messageDialog-title {
-  font-size: 1.5em;
-  line-height: 1em;
-  color: #000;
-}
-.oo-ui-messageDialog-message {
-  font-size: 0.9em;
-  line-height: 1.25em;
-  color: #666;
-}
-.oo-ui-messageDialog-message-verbose {
-  font-size: 1.1em;
-  line-height: 1.5em;
-  text-align: right;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-  border-left: solid 1px #e5e5e5;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
-  border-left-width: 0;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-  border-bottom: solid 1px #e5e5e5;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
-  border-bottom-width: 0;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
-  text-align: center;
-  line-height: 3.4em;
-  padding: 0 2em;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
-  background-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
-  background-color: rgba(8, 126, 204, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
-  background-color: rgba(8, 126, 204, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
-  font-weight: bold;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
-  background-color: rgba(118, 171, 54, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
-  background-color: rgba(118, 171, 54, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
-  background-color: rgba(212, 83, 83, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
-  background-color: rgba(212, 83, 83, 0.1);
-}
-.oo-ui-processDialog-location {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-.oo-ui-processDialog-title {
-  display: inline;
-  padding: 0;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
-  white-space: nowrap;
-}
-.oo-ui-processDialog-actions-safe,
-.oo-ui-processDialog-actions-primary {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-}
-.oo-ui-processDialog-actions-safe {
-  right: 0;
-}
-.oo-ui-processDialog-actions-primary {
-  left: 0;
-}
-.oo-ui-processDialog-errors {
-  display: none;
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 0;
-  z-index: 2;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-.oo-ui-processDialog-content .oo-ui-window-head {
-  height: 3.4em;
-}
-.oo-ui-processDialog-content .oo-ui-window-body {
-  top: 3.4em;
-  box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
-}
-.oo-ui-processDialog-navigation {
-  position: relative;
-  height: 3.4em;
-  padding: 0 1em;
-}
-.oo-ui-processDialog-location {
-  padding: 0.75em 0;
-  height: 1.9em;
-  cursor: default;
-  text-align: center;
-}
-.oo-ui-processDialog-title {
-  font-weight: bold;
-  line-height: 1.9em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonElement-button {
-  padding-top: 0.75em;
-  padding-bottom: 0.75em;
-  min-width: 1.9em;
-  min-height: 1.9em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labelElement-label {
-  line-height: 1.9em;
-  padding: 0 1em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconElement-icon {
-  position: absolute;
-  margin-top: -0.125em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-  margin: 0.75em 0.75em 0.75em 0;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-  padding: 0;
-  vertical-align: middle;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:hover {
-  background-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:active {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-  margin: 0.75em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-  /* Adjust for border so text aligns with title */
-  margin: -1px;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
-  background-color: rgba(8, 126, 204, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
-  background-color: rgba(8, 126, 204, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
-  font-weight: bold;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
-  background-color: rgba(118, 171, 54, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
-  background-color: rgba(118, 171, 54, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
-  background-color: rgba(212, 83, 83, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
-  background-color: rgba(212, 83, 83, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-  right: 0.5em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
-  padding-right: 2.25em;
-}
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-  left: 0.5em;
-}
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
-  padding-left: 2.25em;
-}
-.oo-ui-processDialog > .oo-ui-window-frame {
-  min-height: 5em;
-}
-.oo-ui-processDialog-errors {
-  background-color: rgba(255, 255, 255, 0.9);
-  padding: 3em 3em 1.5em 3em;
-  text-align: center;
-}
-.oo-ui-processDialog-errors .oo-ui-buttonWidget {
-  margin: 2em 1em 2em 1em;
-}
-.oo-ui-processDialog-errors-title {
-  font-size: 1.5em;
-  color: #000;
-  margin-bottom: 2em;
-}
-.oo-ui-processDialog-error {
-  text-align: right;
-  margin: 1em;
-  padding: 1em;
-  border: solid 1px #ff9e9e;
-  background-color: #fff7f7;
-  border-radius: 0.25em;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-  position: fixed;
-  width: 0;
-  height: 0;
-  overflow: hidden;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
-  width: auto;
-  height: auto;
-  top: 0;
-  left: 0;
-  bottom: 0;
-  right: 0;
-  padding: 1em;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
-  position: fixed;
-  left: 0;
-  right: 0;
-  margin: auto;
-  overflow: hidden;
-  max-width: 100%;
-  max-height: 100%;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
-  width: 100%;
-  height: 100%;
-}
-.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
-  width: 100%;
-  height: 100%;
-  top: 0;
-  bottom: 0;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-  background-color: rgba(255, 255, 255, 0.5);
-  opacity: 0;
-  -webkit-transition: opacity 250ms ease-in-out;
-  -moz-transition: opacity 250ms ease-in-out;
-  -ms-transition: opacity 250ms ease-in-out;
-  -o-transition: opacity 250ms ease-in-out;
-  transition: opacity 250ms ease-in-out;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
-  top: 1em;
-  bottom: 1em;
-  background-color: #fff;
-  -webkit-transform: scale(0.5);
-  -moz-transform: scale(0.5);
-  -ms-transform: scale(0.5);
-  -o-transform: scale(0.5);
-  transform: scale(0.5);
-  -webkit-transition: all 250ms ease-in-out;
-  -moz-transition: all 250ms ease-in-out;
-  -ms-transition: all 250ms ease-in-out;
-  -o-transition: all 250ms ease-in-out;
-  transition: all 250ms ease-in-out;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
-  opacity: 1;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
-  -webkit-transform: scale(1);
-  -moz-transform: scale(1);
-  -ms-transform: scale(1);
-  -o-transform: scale(1);
-  transform: scale(1);
-}
-.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
-  border: solid 1px #ccc;
-  border-radius: 0.5em;
-  box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
-}
diff --git a/resources/lib/oojs-ui/oojs-ui-apex.svg.css b/resources/lib/oojs-ui/oojs-ui-apex.svg.css
index 4805acab4c..b93c30c64d 100644
--- a/resources/lib/oojs-ui/oojs-ui-apex.svg.css
+++ b/resources/lib/oojs-ui/oojs-ui-apex.svg.css
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (1829141230)
+ * OOjs UI v0.1.0-pre (db065e5a9f)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-10-15T22:50:09Z
+ * Date: 2014-10-20T14:47:55Z
  */
 /* @noflip */
 .oo-ui-rtl {
@@ -144,6 +144,7 @@
 	border-color: #aaaaaa;
 	outline: none;
 }
+.oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
 	line-height: 1.9em;
 }
@@ -430,6 +431,7 @@
 	z-index: 4;
 }
 .oo-ui-popupTool .oo-ui-popupWidget {
+	/* @noflip */
 	margin-left: 1.25em;
 	font-size: 0.8em;
 }
@@ -1099,6 +1101,8 @@
 }
 .oo-ui-popupWidget {
 	position: absolute;
+	/* @noflip */
+	left: 0;
 }
 .oo-ui-popupWidget-popup {
 	position: relative;
@@ -1113,6 +1117,8 @@
 	display: block;
 	position: absolute;
 	top: 0;
+	/* @noflip */
+	left: 0;
 	background-repeat: no-repeat;
 }
 .oo-ui-popupWidget-head {
@@ -1603,6 +1609,7 @@
 .oo-ui-window-inner-overlay {
 	position: absolute;
 	top: 0;
+	/* @noflip */
 	left: 0;
 }
 .oo-ui-window-isolated,
diff --git a/resources/lib/oojs-ui/oojs-ui-apex.svg.rtl.css b/resources/lib/oojs-ui/oojs-ui-apex.svg.rtl.css
deleted file mode 100644
index 4ea3271084..0000000000
--- a/resources/lib/oojs-ui/oojs-ui-apex.svg.rtl.css
+++ /dev/null
@@ -1,2079 +0,0 @@
-/*!
- * OOjs UI v0.1.0
- * https://www.mediawiki.org/wiki/OOjs_UI
- *
- * Copyright 2011–2014 OOjs Team and other contributors.
- * Released under the MIT license
- * http://oojs.mit-license.org
- *
- * Date: 2014-09-24T23:21:42Z
- */
-/* @noflip */
-.oo-ui-rtl {
-  direction: rtl;
-}
-/* @noflip */
-.oo-ui-ltr {
-  direction: ltr;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button {
-  cursor: pointer;
-  display: inline-block;
-  vertical-align: middle;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  display: none;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-  display: none;
-}
-.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
-  cursor: default;
-}
-.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  display: inline-block;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-buttonElement-frameless {
-  display: inline-block;
-  position: relative;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-  display: inline-block;
-  vertical-align: top;
-  text-align: center;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-  cursor: default;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button {
-  color: #333;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  margin-right: 0;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-  margin-left: -0.75em;
-}
-.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  opacity: 0.8;
-  width: 1.9em;
-  height: 1.9em;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  /* Don't animate opacities for now, causes wiggling in Chrome (bug 63020) */
-  /*.oo-ui-transition(opacity 200ms);*/
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-iconElement-icon,
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-iconElement-icon {
-  opacity: 1;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
-  color: #000;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #333;
-  margin-right: 0.25em;
-}
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #087ecc;
-}
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #76ab36;
-}
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #d45353;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #ccc;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-  margin: 0.1em 0;
-  padding: 0.2em 0.8em;
-  border-radius: 0.3em;
-  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
-  border: 1px #c9c9c9 solid;
-  -webkit-transition: border-color 100ms ease-in-out;
-  -moz-transition: border-color 100ms ease-in-out;
-  -ms-transition: border-color 100ms ease-in-out;
-  -o-transition: border-color 100ms ease-in-out;
-  transition: border-color 100ms ease-in-out;
-  background: #eeeeee;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
-  background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: linear-gradient(top, #ffffff 0%, #dddddd 100%);
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
-  border-color: #aaa;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  line-height: 1.9em;
-}
-.oo-ui-buttonElement-framed.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-  box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
-  color: black;
-  border-color: #c9c9c9;
-  background: #eeeeee;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #dddddd 0%, #ffffff 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  margin-right: -0.5em;
-  margin-left: -0.5em;
-}
-.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  margin-right: -0.5em;
-  margin-left: 0.3em;
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button {
-  border: solid 1px #a6cee1;
-  background: #cde7f4;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
-  background-image: -webkit-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-  background-image: -moz-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-  background-image: -ms-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-  background-image: -o-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-  background-image: linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus {
-  border-color: #9dc2d4;
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-  border: solid 1px #a6cee1;
-  background: #cde7f4;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
-  background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
-  border: solid 1px #b8d892;
-  background: #daf0be;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f0fbe1', endColorstr='#c3e59a');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f0fbe1), color-stop(100%, #c3e59a));
-  background-image: -webkit-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-  background-image: -moz-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-  background-image: -ms-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-  background-image: -o-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-  background-image: linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
-  border-color: #adcb89;
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-  border: solid 1px #b8d892;
-  background: #daf0be;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#c3e59a', endColorstr='#f0fbe1');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #c3e59a), color-stop(100%, #f0fbe1));
-  background-image: -webkit-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-  background-image: -moz-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-  background-image: -ms-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-  background-image: -o-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-  background-image: linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
-  color: #d45353;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-  opacity: 0.5;
-  box-shadow: none;
-  color: #333;
-  background: #eee;
-  border-color: #ccc;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button:focus,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:focus,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:focus {
-  border-color: #ccc;
-  box-shadow: none;
-}
-.oo-ui-clippableElement-clippable {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
-  overflow-y: hidden;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-  width: 100%;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
-  padding: 2em;
-}
-.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 3em;
-  overflow-y: auto;
-}
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-  position: absolute;
-  bottom: 0;
-  right: 0;
-  left: 0;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-  padding: 1.5em;
-}
-.oo-ui-bookletLayout-outlinePanel {
-  border-left: solid 1px #ddd;
-}
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-  box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-fieldLayout {
-  margin-bottom: 1em;
-}
-.oo-ui-fieldLayout:before,
-.oo-ui-fieldLayout:after {
-  content: " ";
-  display: table;
-}
-.oo-ui-fieldLayout:after {
-  clear: both;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-  display: block;
-  float: right;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-  display: block;
-  float: right;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-  text-align: left;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
-  display: inline-block;
-}
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
-  z-index: 1;
-}
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
-  float: left;
-}
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
-  padding: 0.5em 0.75em;
-}
-.oo-ui-fieldLayout:last-child {
-  margin-bottom: 0;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-  padding-top: 0.5em;
-  margin-left: 5%;
-  width: 35%;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-  width: 60%;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
-  padding: 0.75em 0.5em 0.5em 0.5em;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-  padding: 0.5em 0;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
-  padding: 0.5em 0;
-}
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  margin-top: 0.25em;
-}
-.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
-  color: #ccc;
-}
-.oo-ui-fieldsetLayout {
-  position: relative;
-  margin: 0;
-  padding: 0;
-  border: none;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-  display: block;
-  position: absolute;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
-  display: inline-block;
-}
-.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
-  margin-top: 2em;
-}
-.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
-  font-size: 1.5em;
-  margin-bottom: 0.5em;
-  padding: 0.25em 0;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
-  padding-right: 1.75em;
-  line-height: 1.33em;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-  right: 0;
-  top: 0.25em;
-  width: 2em;
-  height: 2em;
-}
-.oo-ui-gridLayout {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 0;
-}
-.oo-ui-panelLayout {
-  position: relative;
-}
-.oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-.oo-ui-panelLayout-expanded {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 0;
-}
-.oo-ui-panelLayout-padded {
-  padding: 1.25em;
-}
-.oo-ui-stackLayout > .oo-ui-panelLayout {
-  display: none;
-}
-.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
-  display: block;
-  position: relative;
-}
-.oo-ui-popupTool .oo-ui-popupWidget-popup,
-.oo-ui-popupTool .oo-ui-popupWidget-anchor {
-  z-index: 4;
-}
-.oo-ui-popupTool .oo-ui-popupWidget {
-  margin-right: 1.25em;
-  font-size: 0.8em;
-}
-.oo-ui-toolGroup {
-  display: inline-block;
-  vertical-align: middle;
-  margin: 0.3em;
-  border-radius: 0.25em;
-  border: solid 1px transparent;
-  -webkit-transition: border-color 300ms ease-in-out;
-  -moz-transition: border-color 300ms ease-in-out;
-  -ms-transition: border-color 300ms ease-in-out;
-  -o-transition: border-color 300ms ease-in-out;
-  transition: border-color 300ms ease-in-out;
-}
-.oo-ui-toolGroup-empty {
-  display: none;
-}
-.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-toolGroup.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
-  color: #000;
-}
-.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
-.oo-ui-barToolGroup > .oo-ui-labelElement-label {
-  display: none;
-}
-.oo-ui-barToolGroup .oo-ui-tool {
-  display: inline-block;
-  position: relative;
-  vertical-align: top;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link {
-  display: block;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  display: block;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  display: none;
-}
-.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-.oo-ui-barToolGroup .oo-ui-tool-title,
-.oo-ui-barToolGroup .oo-ui-tool-accel {
-  display: none;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
-  cursor: pointer;
-}
-.oo-ui-barToolGroup .oo-ui-tool {
-  margin: -1px -1px -1px 0;
-  border: solid 1px transparent;
-}
-.oo-ui-barToolGroup .oo-ui-tool:first-child {
-  border-top-right-radius: 0.25em;
-  border-bottom-right-radius: 0.25em;
-}
-.oo-ui-barToolGroup .oo-ui-tool:last-child {
-  margin-left: -1px;
-  border-top-left-radius: 0.25em;
-  border-bottom-left-radius: 0.25em;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link {
-  height: 1.5em;
-  padding: 0.25em;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  height: 1.5em;
-  width: 1.5em;
-  opacity: 0.8;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled {
-  border-color: rgba(0, 0, 0, 0.2);
-  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
-  background: #f8fbfd;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
-  border-right-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 0.8;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 1;
-}
-.oo-ui-barToolGroup.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-popupToolGroup {
-  position: relative;
-  height: 2em;
-  min-width: 2.5em;
-}
-.oo-ui-popupToolGroup-handle {
-  display: block;
-  cursor: pointer;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-  position: absolute;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
-  cursor: default;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-  display: none;
-  position: absolute;
-  z-index: 4;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
-  background-repeat: no-repeat;
-  background-position: center center;
-}
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
-  display: block;
-}
-.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
-  right: 0;
-}
-.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
-  left: 0;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-accel {
-  display: none;
-}
-.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
-  min-width: 3.5em;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-  top: 0;
-  width: 2em;
-  height: 2em;
-  opacity: 0.8;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
-  left: 0;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-  right: 0.25em;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-  line-height: 2.6em;
-  font-size: 0.8em;
-  margin: 0 1em;
-}
-.oo-ui-popupToolGroup-header {
-  line-height: 2.6em;
-  font-size: 0.8em;
-  margin: 0 0.6em;
-  font-weight: bold;
-}
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled {
-  border-bottom-right-radius: 0;
-  border-bottom-left-radius: 0;
-  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
-  background: #f8fbfd;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-}
-.oo-ui-popupToolGroup.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-  margin-right: 3em;
-}
-.oo-ui-popupToolGroup.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-  margin-left: 2.25em;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-  top: 2em;
-  margin: 0 -1px;
-  border: solid 1px #ccc;
-  background-color: white;
-  box-shadow: 0 0.25em 1em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  height: 2em;
-  width: 2em;
-  margin-left: 0.25em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  line-height: 2em;
-  font-size: 0.8em;
-}
-.oo-ui-listToolGroup .oo-ui-tool {
-  display: inline-block;
-  width: 100%;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-  display: block;
-  cursor: pointer;
-  white-space: nowrap;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
-  padding: 0.25em;
-}
-.oo-ui-listToolGroup.oo-ui-popupToolGroup-active {
-  border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-listToolGroup .oo-ui-tool {
-  border: solid 1px transparent;
-  margin: -1px 0;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-  padding-left: 0.5em;
-}
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
-  border-color: rgba(0, 0, 0, 0.1);
-  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
-  background: #f8fbfd;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-}
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
-  border-top-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 0.8;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 1;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
-  color: #ccc;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-listToolGroup.oo-ui-widget-disabled {
-  color: #ccc;
-}
-.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
-.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-menuToolGroup {
-  border-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-menuToolGroup .oo-ui-tool {
-  display: block;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-  display: block;
-  cursor: pointer;
-  white-space: nowrap;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
-  min-width: 8em;
-}
-.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
-  padding: 0.25em 0 0.25em 0;
-}
-.oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
-  border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
-  border-color: rgba(0, 0, 0, 0.25);
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-  padding: 0 0.25em 0 1em;
-  display: block;
-  cursor: pointer;
-  white-space: nowrap;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  background-image: none;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
-  background-image: /* @embed */ url(themes/apex/images/icons/check.svg);
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
-  background-color: #e1f3ff;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
-  color: #ccc;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-menuToolGroup.oo-ui-widget-disabled {
-  color: #ccc;
-  border-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
-.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-toolbar {
-  clear: both;
-}
-.oo-ui-toolbar-bar {
-  line-height: 1em;
-}
-.oo-ui-toolbar-actions {
-  float: left;
-}
-.oo-ui-toolbar-tools {
-  display: inline;
-}
-.oo-ui-toolbar-tools,
-.oo-ui-toolbar-actions,
-.oo-ui-toolbar-shadow {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-toolbar-actions .oo-ui-popupWidget {
-  -webkit-touch-callout: default;
-  -webkit-user-select: all;
-  -moz-user-select: all;
-  -ms-user-select: all;
-  user-select: all;
-}
-.oo-ui-toolbar-shadow {
-  background-position: right top;
-  background-repeat: repeat-x;
-  position: absolute;
-  width: 100%;
-  pointer-events: none;
-}
-.oo-ui-toolbar-bar {
-  border-bottom: solid 1px #ccc;
-  background: #f8fbfd;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#f1f7fb');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f1f7fb));
-  background-image: -webkit-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-  background-image: -moz-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-  background-image: -ms-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-  background-image: -o-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-  background-image: linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-}
-.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
-  border: none;
-  background: none;
-}
-.oo-ui-toolbar-shadow {
-  /* @embed */
-  background-image: /* @embed */ url(themes/apex/images/toolbar-shadow.png);
-  bottom: -9px;
-  height: 9px;
-  opacity: 0.125;
-  -webkit-transition: opacity 500ms ease-in-out;
-  -moz-transition: opacity 500ms ease-in-out;
-  -ms-transition: opacity 500ms ease-in-out;
-  -o-transition: opacity 500ms ease-in-out;
-  transition: opacity 500ms ease-in-out;
-}
-.oo-ui-optionWidget {
-  position: relative;
-  display: block;
-  cursor: pointer;
-  padding: 0.5em 3em 0.5em 2em;
-  border: none;
-}
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-  cursor: default;
-}
-.oo-ui-optionWidget .oo-ui-labelElement-label {
-  display: block;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-.oo-ui-optionWidget-highlighted {
-  background-color: #e1f3ff;
-}
-.oo-ui-optionWidget .oo-ui-labelElement-label {
-  line-height: 1.5em;
-}
-.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected {
-  background-color: #a7dcff;
-}
-.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
-  background-color: #a7dcff;
-}
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-  color: #ccc;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-  position: absolute;
-  background-repeat: no-repeat;
-  background-position: center center;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-  top: 50%;
-  width: 2em;
-  height: 2em;
-  margin-top: -1em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
-  right: 0.5em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-  left: 0.5em;
-}
-.oo-ui-buttonSelectWidget {
-  display: inline-block;
-  white-space: nowrap;
-  border-radius: 0.3em;
-}
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-  border-radius: 0;
-  margin-right: -1px;
-}
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
-  border-bottom-right-radius: 0.3em;
-  border-top-right-radius: 0.3em;
-  margin-right: 0;
-}
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
-  border-bottom-left-radius: 0.3em;
-  border-top-left-radius: 0.3em;
-}
-.oo-ui-buttonOptionWidget {
-  display: inline-block;
-  padding: 0;
-  background-color: transparent;
-}
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-  position: relative;
-}
-.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  position: static;
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-  height: 1.9em;
-}
-.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  height: 1.9em;
-  margin-top: 0;
-}
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
-  background-color: transparent;
-}
-.oo-ui-labelWidget {
-  display: inline-block;
-  padding: 0.5em 0;
-}
-.oo-ui-iconWidget {
-  display: inline-block;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-  line-height: 2.5em;
-  height: 1.9em;
-  width: 1.9em;
-  opacity: 0.8;
-}
-.oo-ui-iconWidget.oo-ui-widget-disabled {
-  opacity: 0.2;
-}
-.oo-ui-indicatorWidget {
-  display: inline-block;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-  line-height: 2.5em;
-  height: 1.9em;
-  width: 1.9em;
-  opacity: 0.8;
-}
-.oo-ui-indicatorWidget.oo-ui-widget-disabled {
-  opacity: 0.2;
-}
-.oo-ui-buttonWidget {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-buttonGroupWidget {
-  display: inline-block;
-  white-space: nowrap;
-  border-radius: 0.3em;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-  border-radius: 0;
-  margin-bottom: -1px;
-  margin-right: -1px;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
-  border-bottom-right-radius: 0.3em;
-  border-top-right-radius: 0.3em;
-  margin-right: 0;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
-  border-bottom-left-radius: 0.3em;
-  border-top-left-radius: 0.3em;
-}
-.oo-ui-toggleSwitchWidget {
-  position: relative;
-  display: inline-block;
-  vertical-align: middle;
-  overflow: hidden;
-  cursor: pointer;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  -webkit-transform: translateZ(0px);
-  -moz-transform: translateZ(0px);
-  -ms-transform: translateZ(0px);
-  -o-transform: translateZ(0px);
-  transform: translateZ(0px);
-  height: 2em;
-  width: 4em;
-  border-radius: 1em;
-  box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
-  border: solid 1px #ccc;
-  background: #eeeeee;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-  background-image: linear-gradient(top, #dddddd 0%, #ffffff 100%);
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-  cursor: default;
-}
-.oo-ui-toggleSwitchWidget-grip {
-  position: absolute;
-  display: block;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  right: 0;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-  display: none;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-  opacity: 0.5;
-}
-.oo-ui-toggleSwitchWidget-grip {
-  top: 0.25em;
-  right: 0.25em;
-  width: 1.5em;
-  height: 1.5em;
-  margin-top: -1px;
-  border-radius: 1em;
-  box-shadow: 0 0.1em 0.25em rgba(0, 0, 0, 0.1);
-  border: 1px #c9c9c9 solid;
-  -webkit-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-  -moz-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-  -ms-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-  -o-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-  transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-  background: #eeeeee;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
-  background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-  background-image: linear-gradient(top, #ffffff 0%, #dddddd 100%);
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover,
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip {
-  border-color: #aaa;
-}
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-  border-radius: 1em;
-  box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
-  -webkit-transition: opacity 200ms ease-in-out;
-  -moz-transition: opacity 200ms ease-in-out;
-  -ms-transition: opacity 200ms ease-in-out;
-  -o-transition: opacity 200ms ease-in-out;
-  transition: opacity 200ms ease-in-out;
-  background: #cde7f4;
-  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
-  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
-  background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-  background-image: linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-}
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
-  opacity: 1;
-}
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
-  right: 2.25em;
-  margin-right: -2px;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-  display: block;
-  opacity: 0;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
-  right: 0.25em;
-  margin-right: 0;
-}
-.oo-ui-actionWidget.oo-ui-pendingElement-pending {
-  background-image: /* @embed */ url(images/textures/pending.gif);
-}
-.oo-ui-popupWidget-popup {
-  position: absolute;
-  overflow: hidden;
-  z-index: 1;
-}
-.oo-ui-popupWidget-anchor {
-  display: none;
-  z-index: 1;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
-  display: block;
-  position: absolute;
-  background-repeat: no-repeat;
-}
-.oo-ui-popupWidget-head {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-  float: left;
-}
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
-  float: right;
-  cursor: default;
-}
-.oo-ui-popupWidget-body {
-  clear: both;
-  overflow: hidden;
-}
-.oo-ui-popupWidget-popup {
-  border: solid 1px #ccc;
-  border-radius: 0.25em;
-  background-color: #fff;
-  box-shadow: 0 0.15em 0.5em 0 rgba(0, 0, 0, 0.2);
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
-  margin-top: 7px;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
-  content: "";
-  position: absolute;
-  width: 0;
-  height: 0;
-  border-style: solid;
-  border-color: transparent;
-  border-top: 0;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
-  bottom: -8px;
-  right: 11px;
-  border-bottom-color: #aaa;
-  border-width: 7px;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
-  bottom: -8px;
-  right: 12px;
-  border-bottom-color: #fff;
-  border-width: 6px;
-}
-.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
-  -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
-  -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
-  -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
-  -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
-  transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
-}
-.oo-ui-popupWidget-head {
-  height: 2.5em;
-}
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-  margin: 0.25em;
-}
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
-  margin: 0.75em 1em;
-}
-.oo-ui-popupWidget-body {
-  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-popupWidget-body-padded {
-  padding: 0 1em;
-}
-.oo-ui-popupButtonWidget {
-  position: relative;
-}
-.oo-ui-popupButtonWidget .oo-ui-popupWidget {
-  position: absolute;
-  right: 1em;
-  cursor: auto;
-}
-.oo-ui-popupButtonWidget > .oo-ui-popupWidget {
-  margin-right: -1em;
-}
-.oo-ui-textInputWidget {
-  position: relative;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  width: 20em;
-}
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-  display: inline-block;
-  width: 100%;
-  resize: none;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-  background-image: /* @embed */ url(images/textures/pending.gif);
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
-  position: absolute;
-  top: 0;
-  height: 100%;
-  background-repeat: no-repeat;
-  cursor: pointer;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
-  right: 0;
-}
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
-  left: 0;
-}
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-  padding: 0.5em;
-  font-size: 1em;
-  font-family: sans-serif;
-  background-color: #fff;
-  border: solid 1px #ccc;
-  box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
-  border-radius: 0.25em;
-  -webkit-transition: border-color 200ms, box-shadow 200ms;
-  -moz-transition: border-color 200ms, box-shadow 200ms;
-  -ms-transition: border-color 200ms, box-shadow 200ms;
-  -o-transition: border-color 200ms, box-shadow 200ms;
-  transition: border-color 200ms, box-shadow 200ms;
-}
-.oo-ui-textInputWidget-decorated input,
-.oo-ui-textInputWidget-decorated textarea {
-  padding-right: 2em;
-}
-.oo-ui-textInputWidget-icon {
-  width: 2em;
-}
-.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
-  outline: none;
-  border-color: #a7dcff;
-  box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
-}
-.oo-ui-textInputWidget input[readonly],
-.oo-ui-textInputWidget textarea[readonly] {
-  color: #777;
-  text-shadow: 0 1px 1px #fff;
-}
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-  background-color: transparent;
-}
-.oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
-  color: #ccc;
-  text-shadow: 0 1px 1px #fff;
-  border-color: #ddd;
-  background-color: #f3f3f3;
-}
-.oo-ui-textInputWidget .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget .oo-ui-indicatorElement-indicator {
-  opacity: 0.8;
-}
-.oo-ui-textInputWidget.oo-ui-iconElement input,
-.oo-ui-textInputWidget.oo-ui-iconElement textarea {
-  padding-right: 2em;
-}
-.oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-  width: 2em;
-  background-position: left center;
-}
-.oo-ui-textInputWidget.oo-ui-indicatorElement input,
-.oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
-  padding-left: 1.5em;
-}
-.oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  width: 1.5em;
-  background-position: right center;
-}
-.oo-ui-menuWidget {
-  position: absolute;
-  background: #fff;
-  margin-top: -1px;
-  border: solid 1px #ccc;
-  border-radius: 0 0 0.25em 0.25em;
-  box-shadow: 0 0.15em 1em 0 rgba(0, 0, 0, 0.2);
-}
-.oo-ui-menuWidget input {
-  position: absolute;
-  width: 0;
-  height: 0;
-  overflow: hidden;
-  opacity: 0;
-}
-.oo-ui-menuItemWidget {
-  position: relative;
-}
-.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
-  display: none;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-  background-color: transparent;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
-  display: block;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-  background-color: transparent;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted,
-.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
-  background-color: #e1f3ff;
-}
-.oo-ui-menuSectionItemWidget {
-  cursor: default;
-  padding: 0.33em 0.75em;
-  color: #888;
-}
-.oo-ui-inlineMenuWidget {
-  position: relative;
-  display: inline-block;
-  margin: 0.25em 0;
-  min-width: 20em;
-}
-.oo-ui-inlineMenuWidget-handle {
-  width: 100%;
-  display: inline-block;
-  cursor: pointer;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
-  position: absolute;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
-  z-index: 1;
-  width: 100%;
-}
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
-  cursor: default;
-}
-.oo-ui-inlineMenuWidget-handle {
-  height: 2.5em;
-  border: solid 1px rgba(0, 0, 0, 0.1);
-  border-radius: 0.25em;
-}
-.oo-ui-inlineMenuWidget-handle:hover {
-  border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
-  left: 0;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
-  right: 0.25em;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
-  line-height: 2.5em;
-  margin: 0 0.5em;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
-  top: 0;
-  width: 2.5em;
-  height: 2.5em;
-  opacity: 0.8;
-}
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
-  color: #ccc;
-  text-shadow: 0 1px 1px #fff;
-  border-color: #ddd;
-  background-color: #f3f3f3;
-}
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
-  opacity: 0.2;
-}
-.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
-  margin-right: 3em;
-}
-.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
-  margin-left: 2em;
-}
-.oo-ui-outlineItemWidget {
-  position: relative;
-  cursor: pointer;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  font-size: 1.1em;
-  padding: 0.75em;
-}
-.oo-ui-outlineItemWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
-  padding-left: 1.5em;
-}
-.oo-ui-outlineItemWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  opacity: 0.5;
-}
-.oo-ui-outlineItemWidget-level-0 {
-  padding-right: 3.5em;
-}
-.oo-ui-outlineItemWidget-level-0 .oo-ui-iconElement-icon {
-  right: 1em;
-}
-.oo-ui-outlineItemWidget-level-1 {
-  padding-right: 5em;
-}
-.oo-ui-outlineItemWidget-level-1 .oo-ui-iconElement-icon {
-  right: 2.5em;
-}
-.oo-ui-outlineItemWidget-level-2 {
-  padding-right: 6.5em;
-}
-.oo-ui-outlineItemWidget-level-2 .oo-ui-iconElement-icon {
-  right: 4em;
-}
-.oo-ui-selectWidget-depressed .oo-ui-outlineItemWidget.oo-ui-optionWidget-selected {
-  background-color: #a7dcff;
-  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
-}
-.oo-ui-outlineItemWidget.oo-ui-flaggedElement-important {
-  font-weight: bold;
-}
-.oo-ui-outlineItemWidget.oo-ui-flaggedElement-placeholder {
-  font-style: italic;
-}
-.oo-ui-outlineItemWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
-  opacity: 0.5;
-}
-.oo-ui-outlineItemWidget.oo-ui-flaggedElement-empty .oo-ui-labelElement-label {
-  color: #777;
-}
-.oo-ui-outlineControlsWidget {
-  height: 3em;
-  background-color: #fff;
-}
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-  float: right;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
-  float: right;
-  background-position: left center;
-  background-repeat: no-repeat;
-}
-.oo-ui-outlineControlsWidget-items {
-  float: right;
-}
-.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
-  float: right;
-}
-.oo-ui-outlineControlsWidget-movers {
-  float: left;
-}
-.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
-  float: left;
-}
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-  height: 2em;
-  margin: 0.5em;
-  padding: 0;
-}
-.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
-  width: 1.5em;
-  height: 2em;
-  margin: 0.5em 0.5em 0.5em 0;
-  opacity: 0.2;
-}
-.oo-ui-outlineControlsWidget-items {
-  margin-right: 0;
-}
-.oo-ui-comboBoxWidget {
-  display: inline-block;
-  position: relative;
-  min-width: 20em;
-}
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
-  width: 100%;
-  z-index: 1;
-}
-.oo-ui-comboBoxWidget-handle {
-  border: solid 1px rgba(0, 0, 0, 0.1);
-  border-radius: 0.25em;
-}
-.oo-ui-comboBoxWidget-handle:hover {
-  border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-comboBoxWidget.oo-ui-widget-disabled .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator,
-.oo-ui-comboBoxWidget-empty .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  cursor: default;
-  opacity: 0.2;
-}
-.oo-ui-searchWidget-query {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-}
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-  width: 100%;
-}
-.oo-ui-searchWidget-results {
-  position: absolute;
-  bottom: 0;
-  right: 0;
-  left: 0;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-.oo-ui-searchWidget-query {
-  height: 4em;
-  padding: 0 1em;
-  box-shadow: 0 0 0.5em rgba(0, 0, 0, 0.2);
-}
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-  margin: 0.75em 0;
-}
-.oo-ui-searchWidget-results {
-  top: 4em;
-  padding: 1em;
-  line-height: 0;
-}
-.oo-ui-window {
-  line-height: 1em;
-}
-.oo-ui-window-frame {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-window-frame > iframe {
-  width: 100%;
-  height: 100%;
-  margin: 0;
-  padding: 0;
-}
-.oo-ui-window-content:focus {
-  outline: none;
-}
-.oo-ui-window-head,
-.oo-ui-window-foot {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-window-body {
-  margin: 0;
-  padding: 0;
-  background: none;
-}
-.oo-ui-window-overlay {
-  position: absolute;
-  top: 0;
-  right: 0;
-}
-.oo-ui-window-isolated {
-  background-color: transparent;
-  background-image: none;
-  font-family: sans-serif;
-  font-size: 0.8em;
-}
-.oo-ui-dialog-content > .oo-ui-window-head,
-.oo-ui-dialog-content > .oo-ui-window-body,
-.oo-ui-dialog-content > .oo-ui-window-foot {
-  position: absolute;
-  right: 0;
-  left: 0;
-  overflow: hidden;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-dialog-content > .oo-ui-window-head {
-  z-index: 1;
-  top: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-head.oo-ui-pendingElement-pending {
-  background-image: /* @embed */ url(images/textures/pending.gif);
-}
-.oo-ui-dialog-content > .oo-ui-window-body {
-  z-index: 2;
-  top: 0;
-  bottom: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-foot {
-  z-index: 1;
-  bottom: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-overlay {
-  z-index: 3;
-}
-.oo-ui-dialog-content > .oo-ui-window-body {
-  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-messageDialog-actions-horizontal {
-  display: table;
-  table-layout: fixed;
-  width: 100%;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-  display: table-cell;
-  width: 1%;
-}
-.oo-ui-messageDialog-actions-vertical {
-  display: block;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-  display: block;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget {
-  position: relative;
-  text-align: center;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
-  display: block;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
-  position: relative;
-  top: auto;
-  bottom: auto;
-  display: inline;
-  white-space: nowrap;
-}
-.oo-ui-messageDialog-content .oo-ui-window-body {
-  box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
-}
-.oo-ui-messageDialog-title,
-.oo-ui-messageDialog-message {
-  display: block;
-  text-align: center;
-  padding-top: 0.5em;
-}
-.oo-ui-messageDialog-title {
-  font-size: 1.5em;
-  line-height: 1em;
-  color: #000;
-}
-.oo-ui-messageDialog-message {
-  font-size: 0.9em;
-  line-height: 1.25em;
-  color: #666;
-}
-.oo-ui-messageDialog-message-verbose {
-  font-size: 1.1em;
-  line-height: 1.5em;
-  text-align: right;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-  border-left: solid 1px #e5e5e5;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
-  border-left-width: 0;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-  border-bottom: solid 1px #e5e5e5;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
-  border-bottom-width: 0;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
-  text-align: center;
-  line-height: 3.4em;
-  padding: 0 2em;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
-  background-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
-  background-color: rgba(8, 126, 204, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
-  background-color: rgba(8, 126, 204, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
-  font-weight: bold;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
-  background-color: rgba(118, 171, 54, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
-  background-color: rgba(118, 171, 54, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
-  background-color: rgba(212, 83, 83, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
-  background-color: rgba(212, 83, 83, 0.1);
-}
-.oo-ui-processDialog-location {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-.oo-ui-processDialog-title {
-  display: inline;
-  padding: 0;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
-  white-space: nowrap;
-}
-.oo-ui-processDialog-actions-safe,
-.oo-ui-processDialog-actions-primary {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-}
-.oo-ui-processDialog-actions-safe {
-  right: 0;
-}
-.oo-ui-processDialog-actions-primary {
-  left: 0;
-}
-.oo-ui-processDialog-errors {
-  display: none;
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 0;
-  z-index: 2;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-.oo-ui-processDialog-content .oo-ui-window-head {
-  height: 3.4em;
-}
-.oo-ui-processDialog-content .oo-ui-window-body {
-  top: 3.4em;
-  box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
-}
-.oo-ui-processDialog-navigation {
-  position: relative;
-  height: 3.4em;
-  padding: 0 1em;
-}
-.oo-ui-processDialog-location {
-  padding: 0.75em 0;
-  height: 1.9em;
-  cursor: default;
-  text-align: center;
-}
-.oo-ui-processDialog-title {
-  font-weight: bold;
-  line-height: 1.9em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonElement-button {
-  padding-top: 0.75em;
-  padding-bottom: 0.75em;
-  min-width: 1.9em;
-  min-height: 1.9em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labelElement-label {
-  line-height: 1.9em;
-  padding: 0 1em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconElement-icon {
-  position: absolute;
-  margin-top: -0.125em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-  margin: 0.75em 0.75em 0.75em 0;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-  padding: 0;
-  vertical-align: middle;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:hover {
-  background-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:active {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-  margin: 0.75em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-  /* Adjust for border so text aligns with title */
-  margin: -1px;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
-  background-color: rgba(8, 126, 204, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
-  background-color: rgba(8, 126, 204, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
-  font-weight: bold;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
-  background-color: rgba(118, 171, 54, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
-  background-color: rgba(118, 171, 54, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
-  background-color: rgba(212, 83, 83, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
-  background-color: rgba(212, 83, 83, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-  right: 0.5em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
-  padding-right: 2.25em;
-}
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-  left: 0.5em;
-}
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
-  padding-left: 2.25em;
-}
-.oo-ui-processDialog > .oo-ui-window-frame {
-  min-height: 5em;
-}
-.oo-ui-processDialog-errors {
-  background-color: rgba(255, 255, 255, 0.9);
-  padding: 3em 3em 1.5em 3em;
-  text-align: center;
-}
-.oo-ui-processDialog-errors .oo-ui-buttonWidget {
-  margin: 2em 1em 2em 1em;
-}
-.oo-ui-processDialog-errors-title {
-  font-size: 1.5em;
-  color: #000;
-  margin-bottom: 2em;
-}
-.oo-ui-processDialog-error {
-  text-align: right;
-  margin: 1em;
-  padding: 1em;
-  border: solid 1px #ff9e9e;
-  background-color: #fff7f7;
-  border-radius: 0.25em;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-  position: fixed;
-  width: 0;
-  height: 0;
-  overflow: hidden;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
-  width: auto;
-  height: auto;
-  top: 0;
-  left: 0;
-  bottom: 0;
-  right: 0;
-  padding: 1em;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
-  position: absolute;
-  left: 0;
-  right: 0;
-  margin: auto;
-  overflow: hidden;
-  max-width: 100%;
-  max-height: 100%;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
-  width: 100%;
-  height: 100%;
-}
-.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
-  width: 100%;
-  height: 100%;
-  top: 0;
-  bottom: 0;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-  background-color: rgba(255, 255, 255, 0.5);
-  opacity: 0;
-  -webkit-transition: opacity 250ms ease-in-out;
-  -moz-transition: opacity 250ms ease-in-out;
-  -ms-transition: opacity 250ms ease-in-out;
-  -o-transition: opacity 250ms ease-in-out;
-  transition: opacity 250ms ease-in-out;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
-  top: 1em;
-  bottom: 1em;
-  background-color: #fff;
-  -webkit-transform: scale(0.5);
-  -moz-transform: scale(0.5);
-  -ms-transform: scale(0.5);
-  -o-transform: scale(0.5);
-  transform: scale(0.5);
-  -webkit-transition: all 250ms ease-in-out;
-  -moz-transition: all 250ms ease-in-out;
-  -ms-transition: all 250ms ease-in-out;
-  -o-transition: all 250ms ease-in-out;
-  transition: all 250ms ease-in-out;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
-  opacity: 1;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
-  -webkit-transform: scale(1);
-  -moz-transform: scale(1);
-  -ms-transform: scale(1);
-  -o-transform: scale(1);
-  transform: scale(1);
-}
-.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
-  border: solid 1px #ccc;
-  border-radius: 0.5em;
-  box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
-}
-
-.oo-ui-icon-add {
-  background-image: /* @embed */ url(themes/apex/images/icons/add.svg);
-}
-.oo-ui-icon-advanced {
-  background-image: /* @embed */ url(themes/apex/images/icons/advanced.svg);
-}
-.oo-ui-icon-alert {
-  background-image: /* @embed */ url(themes/apex/images/icons/alert.svg);
-}
-.oo-ui-icon-check {
-  background-image: /* @embed */ url(themes/apex/images/icons/check.svg);
-}
-.oo-ui-icon-clear {
-  background-image: /* @embed */ url(themes/apex/images/icons/clear.svg);
-}
-.oo-ui-icon-close {
-  background-image: /* @embed */ url(themes/apex/images/icons/close.svg);
-}
-.oo-ui-icon-code {
-  background-image: /* @embed */ url(themes/apex/images/icons/code.svg);
-}
-.oo-ui-icon-collapse {
-  background-image: /* @embed */ url(themes/apex/images/icons/collapse.svg);
-}
-.oo-ui-icon-comment {
-  background-image: /* @embed */ url(themes/apex/images/icons/comment.svg);
-}
-.oo-ui-icon-expand {
-  background-image: /* @embed */ url(themes/apex/images/icons/expand.svg);
-}
-.oo-ui-icon-help {
-  background-image: /* @embed */ url(themes/apex/images/icons/help.svg);
-}
-.oo-ui-icon-info {
-  background-image: /* @embed */ url(themes/apex/images/icons/info.svg);
-}
-.oo-ui-icon-link {
-  background-image: /* @embed */ url(themes/apex/images/icons/link.svg);
-}
-.oo-ui-icon-menu {
-  background-image: /* @embed */ url(themes/apex/images/icons/menu.svg);
-}
-.oo-ui-icon-next {
-  background-image: /* @embed */ url(themes/apex/images/icons/move-rtl.svg);
-}
-.oo-ui-icon-picture {
-  background-image: /* @embed */ url(themes/apex/images/icons/picture.svg);
-}
-.oo-ui-icon-previous {
-  background-image: /* @embed */ url(themes/apex/images/icons/move-ltr.svg);
-}
-.oo-ui-icon-redo {
-  background-image: /* @embed */ url(themes/apex/images/icons/arched-arrow-rtl.svg);
-}
-.oo-ui-icon-remove {
-  background-image: /* @embed */ url(themes/apex/images/icons/remove.svg);
-}
-.oo-ui-icon-search {
-  background-image: /* @embed */ url(themes/apex/images/icons/search.svg);
-}
-.oo-ui-icon-settings {
-  background-image: /* @embed */ url(themes/apex/images/icons/settings.svg);
-}
-.oo-ui-icon-tag {
-  background-image: /* @embed */ url(themes/apex/images/icons/tag.svg);
-}
-.oo-ui-icon-undo {
-  background-image: /* @embed */ url(themes/apex/images/icons/arched-arrow-ltr.svg);
-}
-.oo-ui-icon-window {
-  background-image: /* @embed */ url(themes/apex/images/icons/window.svg);
-}
-.oo-ui-indicator-alert {
-  background-image: /* @embed */ url(themes/apex/images/indicators/alert.svg);
-}
-.oo-ui-indicator-up {
-  background-image: /* @embed */ url(themes/apex/images/indicators/arrow-up.svg);
-}
-.oo-ui-indicator-down {
-  background-image: /* @embed */ url(themes/apex/images/indicators/arrow-down.svg);
-}
-.oo-ui-indicator-next {
-  background-image: /* @embed */ url(themes/apex/images/indicators/arrow-rtl.svg);
-}
-.oo-ui-indicator-previous {
-  background-image: /* @embed */ url(themes/apex/images/indicators/arrow-ltr.svg);
-}
-.oo-ui-indicator-required {
-  background-image: /* @embed */ url(themes/apex/images/indicators/required.svg);
-}
-.oo-ui-texture-pending {
-  background-image: /* @embed */ url(themes/apex/images/textures/pending.svg);
-}
-.oo-ui-texture-transparency {
-  background-image: /* @embed */ url(themes/apex/images/textures/transparency.svg);
-}
-@-webkit-keyframes oo-ui-animate-texture-pending {
-  from {
-    background-position: 100% 0%;
-  }
-  to {
-    background-position: 0% 0%;
-  }
-}
-@keyframes oo-ui-animate-pending {
-  from {
-    background-position: 100% 0%;
-  }
-  to {
-    background-position: 0% 0%;
-  }
-}
-.oo-ui-texture-pending {
-  background-position: 100% 0%;
-  -webkit-animation: oo-ui-animate-texture-pending 30s linear 0 infinite;
-  animation: oo-ui-animate-texture-pending 30s linear 0 infinite;
-}
diff --git a/resources/lib/oojs-ui/oojs-ui-mediawiki.css b/resources/lib/oojs-ui/oojs-ui-mediawiki.css
index 27b49c087b..9f57ea9161 100644
--- a/resources/lib/oojs-ui/oojs-ui-mediawiki.css
+++ b/resources/lib/oojs-ui/oojs-ui-mediawiki.css
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (1829141230)
+ * OOjs UI v0.1.0-pre (db065e5a9f)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-10-15T22:50:09Z
+ * Date: 2014-10-20T14:47:55Z
  */
 /* @noflip */
 .oo-ui-rtl {
@@ -154,6 +154,7 @@
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
 	outline: none;
 }
+.oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
 	line-height: 2.2em;
 }
@@ -417,6 +418,7 @@
 	z-index: 4;
 }
 .oo-ui-popupTool .oo-ui-popupWidget {
+	/* @noflip */
 	margin-left: 1.25em;
 	font-size: 0.8em;
 }
@@ -986,6 +988,8 @@
 }
 .oo-ui-popupWidget {
 	position: absolute;
+	/* @noflip */
+	left: 0;
 }
 .oo-ui-popupWidget-popup {
 	position: relative;
@@ -1000,6 +1004,8 @@
 	display: block;
 	position: absolute;
 	top: 0;
+	/* @noflip */
+	left: 0;
 	background-repeat: no-repeat;
 }
 .oo-ui-popupWidget-head {
@@ -1391,6 +1397,18 @@
 	overflow-x: hidden;
 	overflow-y: auto;
 }
+.oo-ui-searchWidget-query {
+	height: 2.4em;
+	top: 1px;
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget input {
+	border-width: 1px 0;
+}
+.oo-ui-searchWidget-results {
+	top: 2.2em;
+	bottom: 0.2em;
+	line-height: 0;
+}
 .oo-ui-window {
 	line-height: 1em;
 }
@@ -1425,6 +1443,7 @@
 .oo-ui-window-inner-overlay {
 	position: absolute;
 	top: 0;
+	/* @noflip */
 	left: 0;
 }
 .oo-ui-window-isolated,
diff --git a/resources/lib/oojs-ui/oojs-ui-mediawiki.js b/resources/lib/oojs-ui/oojs-ui-mediawiki.js
index 2ca1b48bcb..8da381e02c 100644
--- a/resources/lib/oojs-ui/oojs-ui-mediawiki.js
+++ b/resources/lib/oojs-ui/oojs-ui-mediawiki.js
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (1829141230)
+ * OOjs UI v0.1.0-pre (db065e5a9f)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-10-15T22:49:59Z
+ * Date: 2014-10-20T14:47:45Z
  */
 /**
  * @class
@@ -40,8 +40,8 @@ OO.ui.MediaWikiTheme.prototype.getElementClasses = function ( element ) {
 		// Parent method
 		classes = OO.ui.MediaWikiTheme.super.prototype.getElementClasses.call( this, element );
 
-	if ( element.isFramed && element.hasFlag ) {
-		if ( element.isFramed() ) {
+	if ( element.supports( [ 'isFramed', 'isDisabled', 'hasFlag' ] ) ) {
+		if ( element.isFramed() && !element.isDisabled() ) {
 			if (
 				element.hasFlag( 'primary' ) ||
 				element.hasFlag( 'constructive' ) ||
diff --git a/resources/lib/oojs-ui/oojs-ui-mediawiki.rtl.css b/resources/lib/oojs-ui/oojs-ui-mediawiki.rtl.css
deleted file mode 100644
index e2acb0f848..0000000000
--- a/resources/lib/oojs-ui/oojs-ui-mediawiki.rtl.css
+++ /dev/null
@@ -1,1997 +0,0 @@
-/*!
- * OOjs UI v0.1.0
- * https://www.mediawiki.org/wiki/OOjs_UI
- *
- * Copyright 2011–2014 OOjs Team and other contributors.
- * Released under the MIT license
- * http://oojs.mit-license.org
- *
- * Date: 2014-09-24T23:21:42Z
- */
-/* @noflip */
-.oo-ui-rtl {
-  direction: rtl;
-}
-/* @noflip */
-.oo-ui-ltr {
-  direction: ltr;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button {
-  cursor: pointer;
-  display: inline-block;
-  vertical-align: middle;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  display: none;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-  display: none;
-}
-.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
-  cursor: default;
-}
-.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  display: inline-block;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-buttonElement-frameless {
-  display: inline-block;
-  position: relative;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-  display: inline-block;
-  vertical-align: top;
-  text-align: center;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-  cursor: default;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button {
-  font-weight: bold;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  margin-right: 0;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-  margin-left: -0.75em;
-}
-.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  width: 2.2em;
-  height: 2.2em;
-}
-.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
-.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-  opacity: 0.2;
-}
-.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #ddd;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  margin-right: 0.25em;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #757575;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #444444;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
-  color: #598ad1;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #777777;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #015ccc;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
-  color: #00c697;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #777777;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #008c6d;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
-  color: #e81915;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #777777;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #a7170f;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-  margin: 0.1em 0;
-  padding: 0.3em 1.2em;
-  border-radius: 0.3em;
-  -webkit-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
-  -moz-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
-  -ms-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
-  -o-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
-  transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  line-height: 2.2em;
-}
-.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  margin-right: -0.5em;
-  margin-left: -0.5em;
-}
-.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  margin-right: -0.5em;
-  margin-left: 0.3em;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
-  color: #ddd;
-  background: #fff;
-  border: solid 1px #cdcdcd;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
-  color: #757575;
-  background-color: #fff;
-  border: solid 1px #cdcdcd;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
-  box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2), 0 0.1em 0 0 rgba(0, 0, 0, 0.2);
-  border-color: #aaa;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-  background-color: #d0d0d0;
-  border-color: #d0d0d0;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button {
-  text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
-  color: #fff;
-  background-color: #0274ff;
-  border-color: #0274ff;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus {
-  box-shadow: inset 0 -0.2em 0 0 #015ccc, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
-  border-bottom-color: #015ccc;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-  background-color: #015ccc;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
-  text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
-  color: #fff;
-  background-color: #00af89;
-  border-color: #00af89;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
-  box-shadow: inset 0 -0.2em 0 0 #008c6d, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
-  border-bottom-color: #008c6d;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-  background-color: #008c6d;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
-  text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
-  color: #fff;
-  background-color: #d11d13;
-  border-color: #d11d13;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
-  box-shadow: inset 0 -0.2em 0 0 #a7170f, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
-  border-bottom-color: #a7170f;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-  background-color: #a7170f;
-}
-.oo-ui-clippableElement-clippable {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
-  overflow-y: hidden;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-  width: 100%;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
-  padding: 2em;
-}
-.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 3em;
-  overflow-y: auto;
-}
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-  position: absolute;
-  bottom: 0;
-  right: 0;
-  left: 0;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-  padding: 1.5em;
-}
-.oo-ui-bookletLayout-outlinePanel {
-  border-left: solid 1px #ddd;
-}
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-  box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-fieldLayout {
-  margin-bottom: 1em;
-}
-.oo-ui-fieldLayout:before,
-.oo-ui-fieldLayout:after {
-  content: " ";
-  display: table;
-}
-.oo-ui-fieldLayout:after {
-  clear: both;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-  display: block;
-  float: right;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-  display: block;
-  float: right;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-  text-align: left;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
-  display: inline-block;
-}
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
-  z-index: 1;
-}
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
-  float: left;
-}
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
-  padding: 0.5em 0.75em;
-}
-.oo-ui-fieldLayout:last-child {
-  margin-bottom: 0;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-  padding-top: 0.5em;
-  margin-left: 5%;
-  width: 35%;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-  width: 60%;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
-  padding: 0.75em 0.5em 0.5em 0.5em;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-  padding: 0.5em 0;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
-  padding: 0.5em 0;
-}
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  margin-top: 0.25em;
-}
-.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
-  color: #ccc;
-}
-.oo-ui-fieldsetLayout {
-  position: relative;
-  margin: 0;
-  padding: 0;
-  border: none;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-  display: block;
-  position: absolute;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
-  display: inline-block;
-}
-.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
-  margin-top: 2em;
-}
-.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
-  font-size: 1.5em;
-  margin-bottom: 0.5em;
-  padding: 0.25em 0;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
-  padding-right: 1.75em;
-  line-height: 1.33em;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-  right: 0;
-  top: 0.25em;
-  width: 2em;
-  height: 2em;
-}
-.oo-ui-gridLayout {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 0;
-}
-.oo-ui-panelLayout {
-  position: relative;
-}
-.oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-.oo-ui-panelLayout-expanded {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 0;
-}
-.oo-ui-panelLayout-padded {
-  padding: 1.25em;
-}
-.oo-ui-stackLayout > .oo-ui-panelLayout {
-  display: none;
-}
-.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
-  display: block;
-  position: relative;
-}
-.oo-ui-popupTool .oo-ui-popupWidget-popup,
-.oo-ui-popupTool .oo-ui-popupWidget-anchor {
-  z-index: 4;
-}
-.oo-ui-popupTool .oo-ui-popupWidget {
-  margin-right: 1.25em;
-  font-size: 0.8em;
-}
-.oo-ui-toolGroup {
-  display: inline-block;
-  vertical-align: middle;
-  margin: 0.3em;
-}
-.oo-ui-toolGroup-empty {
-  display: none;
-}
-.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
-  color: #000;
-}
-.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
-.oo-ui-barToolGroup > .oo-ui-labelElement-label {
-  display: none;
-}
-.oo-ui-barToolGroup .oo-ui-tool {
-  display: inline-block;
-  position: relative;
-  vertical-align: top;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link {
-  display: block;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  display: block;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  display: none;
-}
-.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-.oo-ui-barToolGroup .oo-ui-tool-title,
-.oo-ui-barToolGroup .oo-ui-tool-accel {
-  display: none;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
-  cursor: pointer;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link {
-  height: 1.5em;
-  padding: 0.25em;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  height: 1.5em;
-  width: 1.5em;
-  opacity: 0.8;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled {
-  background-color: #eee;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 0.8;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 1;
-}
-.oo-ui-barToolGroup.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-popupToolGroup {
-  position: relative;
-  height: 2em;
-  min-width: 2.5em;
-}
-.oo-ui-popupToolGroup-handle {
-  display: block;
-  cursor: pointer;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-  position: absolute;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
-  cursor: default;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-  display: none;
-  position: absolute;
-  z-index: 4;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
-  background-repeat: no-repeat;
-  background-position: center center;
-}
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
-  display: block;
-}
-.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
-  right: 0;
-}
-.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
-  left: 0;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-accel {
-  display: none;
-}
-.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
-  min-width: 3.5em;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-  top: 0;
-  width: 2em;
-  height: 2em;
-  opacity: 0.8;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
-  left: 0;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-  right: 0.25em;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-  line-height: 2.6em;
-  font-size: 0.8em;
-  margin: 0 1em;
-}
-.oo-ui-popupToolGroup-header {
-  line-height: 2.6em;
-  font-size: 0.8em;
-  margin: 0 0.6em;
-  font-weight: bold;
-}
-.oo-ui-popupToolGroup.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-  margin-right: 3em;
-}
-.oo-ui-popupToolGroup.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-  margin-left: 2.25em;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-  top: 2em;
-  background-color: white;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  height: 2em;
-  width: 2em;
-  margin-left: 0.25em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  line-height: 2em;
-  font-size: 0.8em;
-}
-.oo-ui-listToolGroup .oo-ui-tool {
-  display: inline-block;
-  width: 100%;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-  display: block;
-  cursor: pointer;
-  white-space: nowrap;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-.oo-ui-listToolGroup .oo-ui-tool {
-  padding: 0 0.25em;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-  padding-left: 0.5em;
-}
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
-  background-color: #eee;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
-  color: #ccc;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-listToolGroup.oo-ui-widget-disabled {
-  color: #ccc;
-}
-.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
-.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
-  padding: 0.25em 0 0.25em 0;
-  border: 1px solid #aaa;
-  box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2), 0 0.1em 0 0 rgba(0, 0, 0, 0.2);
-}
-.oo-ui-menuToolGroup {
-  border: solid 1px #ccc;
-  border-radius: 0.1em;
-}
-.oo-ui-menuToolGroup .oo-ui-tool {
-  display: block;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-  display: block;
-  cursor: pointer;
-  white-space: nowrap;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
-  min-width: 8em;
-}
-.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
-  margin-right: -1px;
-  padding: 0.25em 0 0.25em 0;
-  border: 1px solid #aaa;
-  box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2), 0 0.1em 0 0 rgba(0, 0, 0, 0.2);
-}
-.oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
-  border-color: #aaa;
-}
-.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
-  border-color: #aaa;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-  padding: 0 0.25em 0 1em;
-  display: block;
-  cursor: pointer;
-  white-space: nowrap;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  background-image: none;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/check.svg);
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
-  background-color: #e1f3ff;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
-  color: #ccc;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-menuToolGroup.oo-ui-widget-disabled {
-  color: #ccc;
-  border-color: #ccc;
-}
-.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
-.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-toolbar {
-  clear: both;
-}
-.oo-ui-toolbar-bar {
-  line-height: 1em;
-}
-.oo-ui-toolbar-actions {
-  float: left;
-}
-.oo-ui-toolbar-tools {
-  display: inline;
-}
-.oo-ui-toolbar-tools,
-.oo-ui-toolbar-actions,
-.oo-ui-toolbar-shadow {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-toolbar-actions .oo-ui-popupWidget {
-  -webkit-touch-callout: default;
-  -webkit-user-select: all;
-  -moz-user-select: all;
-  -ms-user-select: all;
-  user-select: all;
-}
-.oo-ui-toolbar-shadow {
-  background-position: right top;
-  background-repeat: repeat-x;
-  position: absolute;
-  width: 100%;
-  pointer-events: none;
-}
-.oo-ui-toolbar-bar {
-  border-bottom: solid 1px #ccc;
-}
-.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
-  border: none;
-  background: none;
-}
-.oo-ui-toolbar-shadow {
-  display: none;
-}
-.oo-ui-selectWidget {
-  border-radius: 0.3em;
-}
-.oo-ui-selectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-  border-radius: 0;
-  margin-right: -1px;
-}
-.oo-ui-selectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
-  border-bottom-right-radius: 0.3em;
-  border-top-right-radius: 0.3em;
-  margin-right: 0;
-}
-.oo-ui-selectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
-  border-bottom-left-radius: 0.3em;
-  border-top-left-radius: 0.3em;
-}
-.oo-ui-optionWidget {
-  position: relative;
-  display: block;
-  cursor: pointer;
-  padding: 0.5em 3em 0.5em 2em;
-  border: none;
-}
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-  cursor: default;
-}
-.oo-ui-optionWidget .oo-ui-labelElement-label {
-  display: block;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-.oo-ui-optionWidget-highlighted {
-  background-color: #eee;
-}
-.oo-ui-optionWidget .oo-ui-labelElement-label {
-  line-height: 1.5em;
-}
-.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected {
-  background-color: #a7dcff;
-}
-.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
-  background-color: #a7dcff;
-}
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-  color: #ccc;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-  position: absolute;
-  background-repeat: no-repeat;
-  background-position: center center;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-  top: 50%;
-  width: 2em;
-  height: 2em;
-  margin-top: -1em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
-  right: 0.5em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-  left: 0.5em;
-}
-.oo-ui-buttonSelectWidget {
-  display: inline-block;
-  white-space: nowrap;
-  border-radius: 0.3em;
-}
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-  border-radius: 0;
-  margin-right: -1px;
-}
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
-  border-bottom-right-radius: 0.3em;
-  border-top-right-radius: 0.3em;
-  margin-right: 0;
-}
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
-  border-bottom-left-radius: 0.3em;
-  border-top-left-radius: 0.3em;
-}
-.oo-ui-buttonOptionWidget {
-  display: inline-block;
-  padding: 0;
-  background-color: transparent;
-}
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-  position: relative;
-}
-.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  position: static;
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-  height: 2.2em;
-}
-.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  height: 2.2em;
-  margin-top: 0;
-}
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
-  background-color: transparent;
-}
-.oo-ui-labelWidget {
-  display: inline-block;
-}
-.oo-ui-iconWidget {
-  display: inline-block;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-  line-height: 2.5em;
-  height: 2.2em;
-  width: 2.2em;
-}
-.oo-ui-iconWidget.oo-ui-widget-disabled {
-  opacity: 0.2;
-}
-.oo-ui-indicatorWidget {
-  display: inline-block;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-  line-height: 2.5em;
-  height: 2.2em;
-  width: 2.2em;
-}
-.oo-ui-indicatorWidget.oo-ui-widget-disabled {
-  opacity: 0.2;
-}
-.oo-ui-buttonWidget {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-buttonGroupWidget {
-  display: inline-block;
-  white-space: nowrap;
-  border-radius: 0.3em;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-  border-radius: 0;
-  margin-bottom: -1px;
-  margin-right: -1px;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
-  border-bottom-right-radius: 0.3em;
-  border-top-right-radius: 0.3em;
-  margin-right: 0;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
-  border-bottom-left-radius: 0.3em;
-  border-top-left-radius: 0.3em;
-}
-.oo-ui-toggleSwitchWidget {
-  position: relative;
-  display: inline-block;
-  vertical-align: middle;
-  overflow: hidden;
-  cursor: pointer;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  -webkit-transform: translateZ(0px);
-  -moz-transform: translateZ(0px);
-  -ms-transform: translateZ(0px);
-  -o-transform: translateZ(0px);
-  transform: translateZ(0px);
-  height: 2em;
-  width: 4em;
-  border-radius: 1em;
-  border: 1px #ddd solid;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-  cursor: default;
-}
-.oo-ui-toggleSwitchWidget-grip {
-  position: absolute;
-  display: block;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  right: 0;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-  display: none;
-}
-.oo-ui-toggleSwitchWidget-grip {
-  top: 0.25em;
-  right: 0.25em;
-  width: 1.5em;
-  height: 1.5em;
-  margin-top: -1px;
-  border-radius: 1em;
-  border: 1px #ddd solid;
-  background-color: #f7f7f7;
-  -webkit-transition: right 0.1s ease-in-out, margin-right 0.1s ease-in-out;
-  -moz-transition: right 0.1s ease-in-out, margin-right 0.1s ease-in-out;
-  -ms-transition: right 0.1s ease-in-out, margin-right 0.1s ease-in-out;
-  -o-transition: right 0.1s ease-in-out, margin-right 0.1s ease-in-out;
-  transition: right 0.1s ease-in-out, margin-right 0.1s ease-in-out;
-}
-.oo-ui-toggleSwitchWidget-glow {
-  border-radius: 1em;
-  background-color: #f7f7f7;
-  -webkit-transition: background-color 0.1s ease-in-out;
-  -moz-transition: background-color 0.1s ease-in-out;
-  -ms-transition: background-color 0.1s ease-in-out;
-  -o-transition: background-color 0.1s ease-in-out;
-  transition: background-color 0.1s ease-in-out;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
-  right: 2.25em;
-  margin-right: -2px;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-  display: block;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
-  right: 0.25em;
-  margin-right: 0;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled {
-  border: 1px #ccc solid;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover {
-  border-color: #aaa;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled .oo-ui-toggleSwitchWidget-grip {
-  background-color: #fff;
-  border-color: #aaa;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
-  background-color: #d0d0d0;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-  background-color: #fff;
-}
-.oo-ui-actionWidget.oo-ui-pendingElement-pending {
-  background-image: /* @embed */ url(images/textures/pending.gif);
-}
-.oo-ui-popupWidget-popup {
-  position: absolute;
-  overflow: hidden;
-  z-index: 1;
-}
-.oo-ui-popupWidget-anchor {
-  display: none;
-  z-index: 1;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
-  display: block;
-  position: absolute;
-  background-repeat: no-repeat;
-}
-.oo-ui-popupWidget-head {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-  float: left;
-}
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
-  float: right;
-  cursor: default;
-}
-.oo-ui-popupWidget-body {
-  clear: both;
-  overflow: hidden;
-}
-.oo-ui-popupWidget-popup {
-  border: solid 1px #aaa;
-  border-radius: 0.2em;
-  background-color: #fff;
-  box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
-  margin-top: 7px;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
-  content: "";
-  position: absolute;
-  width: 0;
-  height: 0;
-  border-style: solid;
-  border-color: transparent;
-  border-top: 0;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
-  bottom: -8px;
-  right: 11px;
-  border-bottom-color: #888;
-  border-width: 13px;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
-  bottom: -8px;
-  right: 12px;
-  border-bottom-color: #fff;
-  border-width: 12px;
-}
-.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
-  -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
-  -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
-  -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
-  -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
-  transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
-}
-.oo-ui-popupWidget-head {
-  height: 2.5em;
-}
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-  margin: 0.25em;
-}
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
-  margin: 0.75em 1em;
-}
-.oo-ui-popupWidget-body {
-  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-popupWidget-body-padded {
-  padding: 0 1em;
-}
-.oo-ui-popupButtonWidget {
-  position: relative;
-}
-.oo-ui-popupButtonWidget .oo-ui-popupWidget {
-  position: absolute;
-  right: 1em;
-  cursor: auto;
-}
-.oo-ui-popupButtonWidget > .oo-ui-popupWidget {
-  margin-right: -1em;
-}
-.oo-ui-textInputWidget {
-  position: relative;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  width: 20em;
-}
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-  display: inline-block;
-  width: 100%;
-  resize: none;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-  background-image: /* @embed */ url(images/textures/pending.gif);
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
-  position: absolute;
-  top: 0;
-  height: 100%;
-  background-repeat: no-repeat;
-  cursor: pointer;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
-  right: 0;
-}
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
-  left: 0;
-}
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-  padding: 0.5em 0.9em 0.5em 0.5em;
-  margin: 0;
-  font-size: 1em;
-  font-family: sans-serif;
-  background-color: #fff;
-  border: solid 1px #ccc;
-  box-shadow: inset 0 0 0 0 #0274FF;
-  border-radius: 0.1em;
-  -webkit-transition: box-shadow 0.1s;
-  -moz-transition: box-shadow 0.1s;
-  -ms-transition: box-shadow 0.1s;
-  -o-transition: box-shadow 0.1s;
-  transition: box-shadow 0.1s;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-textInputWidget-decorated input,
-.oo-ui-textInputWidget-decorated textarea {
-  padding-right: 2em;
-}
-.oo-ui-textInputWidget-icon {
-  width: 2em;
-}
-.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
-  outline: none;
-  border-color: #aaa;
-  box-shadow: inset 0.4em 0 0 0 #0274ff;
-}
-.oo-ui-textInputWidget input[readonly],
-.oo-ui-textInputWidget textarea[readonly] {
-  color: #777;
-  text-shadow: 0 1px 1px #fff;
-}
-.oo-ui-textInputWidget input[readonly]:focus,
-.oo-ui-textInputWidget textarea[readonly]:focus {
-  box-shadow: inset 0.4em 0 0 0 #ccc;
-}
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-  background-color: transparent;
-}
-.oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
-  color: #ccc;
-  text-shadow: 0 1px 1px #fff;
-  border-color: #ddd;
-  background-color: #f3f3f3;
-}
-.oo-ui-textInputWidget.oo-ui-iconElement input,
-.oo-ui-textInputWidget.oo-ui-iconElement textarea {
-  padding-right: 2.4em;
-}
-.oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-  right: 0.4em;
-  width: 2em;
-  height: 100%;
-  background-position: left center;
-}
-.oo-ui-textInputWidget.oo-ui-indicatorElement input,
-.oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
-  padding-left: 2.2em;
-}
-.oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  width: 1.6em;
-  height: 100%;
-  background-position: right center;
-}
-.oo-ui-menuWidget {
-  position: absolute;
-  background: #fff;
-  margin-top: -1px;
-  border: solid 1px #aaa;
-  border-radius: 0 0 0.1em 0.1em;
-  padding-bottom: 0.25em;
-  box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2), 0 0.1em 0 0 rgba(0, 0, 0, 0.2);
-}
-.oo-ui-menuWidget input {
-  position: absolute;
-  width: 0;
-  height: 0;
-  overflow: hidden;
-  opacity: 0;
-}
-.oo-ui-menuItemWidget {
-  position: relative;
-}
-.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
-  display: none;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-  background-color: transparent;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
-  display: block;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-  background-color: transparent;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted,
-.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
-  background-color: #eee;
-}
-.oo-ui-menuSectionItemWidget {
-  cursor: default;
-  padding: 0.33em 0.75em;
-  color: #888;
-}
-.oo-ui-inlineMenuWidget {
-  position: relative;
-  display: inline-block;
-  margin: 0.25em 0;
-  min-width: 20em;
-}
-.oo-ui-inlineMenuWidget-handle {
-  width: 100%;
-  display: inline-block;
-  cursor: pointer;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
-  position: absolute;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
-  z-index: 1;
-  width: 100%;
-}
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
-  cursor: default;
-}
-.oo-ui-inlineMenuWidget-handle {
-  height: 2.5em;
-  border: solid 1px #ccc;
-  border-radius: 0.1em;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
-  left: 0;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
-  right: 0.25em;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
-  line-height: 2.5em;
-  margin: 0 1em;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
-  top: 0;
-  width: 2.5em;
-  height: 2.5em;
-}
-.oo-ui-inlineMenuWidget:hover .oo-ui-inlineMenuWidget-handle {
-  border-color: #aaa;
-}
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
-  color: #ccc;
-  text-shadow: 0 1px 1px #fff;
-  border-color: #ddd;
-  background-color: #f3f3f3;
-}
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
-  opacity: 0.2;
-}
-.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
-  margin-right: 3em;
-}
-.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
-  margin-left: 2em;
-}
-.oo-ui-inlineMenuWidget .oo-ui-selectWidget {
-  border-top-color: #fff;
-}
-.oo-ui-outlineItemWidget {
-  position: relative;
-  cursor: pointer;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-  float: right;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
-  float: right;
-  background-position: left center;
-  background-repeat: no-repeat;
-}
-.oo-ui-outlineControlsWidget-items {
-  float: right;
-}
-.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
-  float: right;
-}
-.oo-ui-outlineControlsWidget-movers {
-  float: left;
-}
-.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
-  float: left;
-}
-.oo-ui-comboBoxWidget {
-  display: inline-block;
-  position: relative;
-}
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
-  width: 100%;
-  z-index: 1;
-}
-.oo-ui-comboBoxWidget .oo-ui-textInputWidget input,
-.oo-ui-comboBoxWidget .oo-ui-textInputWidget textarea {
-  height: 2.35em;
-}
-.oo-ui-comboBoxWidget .oo-ui-textInputWidget.oo-ui-indicatorElement {
-  padding-left: 2.2em;
-}
-.oo-ui-comboBoxWidget .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  width: 2.2em;
-  background-position: center center;
-  border: solid 1px #ccc;
-  border-right: none;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-searchWidget-query {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-}
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-  width: 100%;
-}
-.oo-ui-searchWidget-results {
-  position: absolute;
-  bottom: 0;
-  right: 0;
-  left: 0;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-.oo-ui-window {
-  line-height: 1em;
-}
-.oo-ui-window-frame {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-window-frame > iframe {
-  width: 100%;
-  height: 100%;
-  margin: 0;
-  padding: 0;
-}
-.oo-ui-window-content:focus {
-  outline: none;
-}
-.oo-ui-window-head,
-.oo-ui-window-foot {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-window-body {
-  margin: 0;
-  padding: 0;
-  background: none;
-}
-.oo-ui-window-overlay {
-  position: absolute;
-  top: 0;
-  right: 0;
-}
-.oo-ui-window-isolated {
-  background: transparent;
-  font-family: sans-serif;
-  font-size: 0.8em;
-}
-.oo-ui-dialog-content > .oo-ui-window-head,
-.oo-ui-dialog-content > .oo-ui-window-body,
-.oo-ui-dialog-content > .oo-ui-window-foot {
-  position: absolute;
-  right: 0;
-  left: 0;
-  overflow: hidden;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-dialog-content > .oo-ui-window-head {
-  z-index: 1;
-  top: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-head.oo-ui-pendingElement-pending {
-  background-image: /* @embed */ url(images/textures/pending.gif);
-}
-.oo-ui-dialog-content > .oo-ui-window-body {
-  z-index: 2;
-  top: 0;
-  bottom: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-foot {
-  z-index: 1;
-  bottom: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-overlay {
-  z-index: 3;
-}
-.oo-ui-dialog-content > .oo-ui-window-body {
-  box-shadow: 0 0 1px 0 #aaa;
-}
-.oo-ui-messageDialog-actions-horizontal {
-  display: table;
-  table-layout: fixed;
-  width: 100%;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-  display: table-cell;
-  width: 1%;
-}
-.oo-ui-messageDialog-actions-vertical {
-  display: block;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-  display: block;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget {
-  position: relative;
-  text-align: center;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
-  display: block;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
-  position: relative;
-  top: auto;
-  bottom: auto;
-  display: inline;
-  white-space: nowrap;
-}
-.oo-ui-messageDialog-title,
-.oo-ui-messageDialog-message {
-  display: block;
-  text-align: center;
-  padding-top: 0.5em;
-}
-.oo-ui-messageDialog-title {
-  font-size: 1.5em;
-  line-height: 1em;
-  color: #000;
-}
-.oo-ui-messageDialog-message {
-  font-size: 0.9em;
-  line-height: 1.25em;
-  color: #666;
-}
-.oo-ui-messageDialog-message-verbose {
-  font-size: 1.1em;
-  line-height: 1.5em;
-  text-align: right;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-  border-left: solid 1px #e5e5e5;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
-  border-left-width: 0;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-  border-bottom: solid 1px #e5e5e5;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
-  border-bottom-width: 0;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
-  text-align: center;
-  line-height: 3.4em;
-  padding: 0 2em;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
-  background-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
-  background-color: rgba(8, 126, 204, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
-  background-color: rgba(8, 126, 204, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
-  font-weight: bold;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
-  background-color: rgba(118, 171, 54, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
-  background-color: rgba(118, 171, 54, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
-  background-color: rgba(212, 83, 83, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
-  background-color: rgba(212, 83, 83, 0.1);
-}
-.oo-ui-processDialog-location {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-.oo-ui-processDialog-title {
-  display: inline;
-  padding: 0;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
-  white-space: nowrap;
-}
-.oo-ui-processDialog-actions-safe,
-.oo-ui-processDialog-actions-primary {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-}
-.oo-ui-processDialog-actions-safe {
-  right: 0;
-}
-.oo-ui-processDialog-actions-primary {
-  left: 0;
-}
-.oo-ui-processDialog-errors {
-  display: none;
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 0;
-  z-index: 2;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-.oo-ui-processDialog-content .oo-ui-window-head {
-  height: 3.4em;
-}
-.oo-ui-processDialog-content .oo-ui-window-body {
-  top: 3.4em;
-  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
-}
-.oo-ui-processDialog-navigation {
-  position: relative;
-  height: 3.4em;
-  padding: 0 1em;
-}
-.oo-ui-processDialog-location {
-  padding: 0.75em 0;
-  height: 1.9em;
-  cursor: default;
-  text-align: center;
-}
-.oo-ui-processDialog-title {
-  font-weight: bold;
-  line-height: 1.9em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonElement-button {
-  padding-top: 0.75em;
-  padding-bottom: 0.75em;
-  min-width: 1.9em;
-  min-height: 1.9em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labelElement-label {
-  line-height: 1.9em;
-  padding: 0 1em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconElement-icon {
-  position: absolute;
-  margin-top: -0.125em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-  margin: 0.75em 0.75em 0.75em 0;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-  padding: 0;
-  vertical-align: middle;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:hover {
-  background-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:active {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-  margin: 0.75em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-  /* Adjust for border so text aligns with title */
-  margin: -1px;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
-  background-color: rgba(8, 126, 204, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
-  background-color: rgba(8, 126, 204, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
-  font-weight: bold;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
-  background-color: rgba(118, 171, 54, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
-  background-color: rgba(118, 171, 54, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
-  background-color: rgba(212, 83, 83, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
-  background-color: rgba(212, 83, 83, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-  right: 0.5em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
-  padding-right: 2.25em;
-}
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-  left: 0.5em;
-}
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
-  padding-left: 2.25em;
-}
-.oo-ui-processDialog > .oo-ui-window-frame {
-  min-height: 5em;
-}
-.oo-ui-processDialog-errors {
-  background-color: rgba(255, 255, 255, 0.9);
-  padding: 3em 3em 1.5em 3em;
-  text-align: center;
-}
-.oo-ui-processDialog-errors .oo-ui-buttonWidget {
-  margin: 2em 1em 2em 1em;
-}
-.oo-ui-processDialog-errors-title {
-  font-size: 1.5em;
-  color: #000;
-  margin-bottom: 2em;
-}
-.oo-ui-processDialog-error {
-  text-align: right;
-  margin: 1em;
-  padding: 1em;
-  border: solid 1px #ff9e9e;
-  background-color: #fff7f7;
-  border-radius: 0.25em;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-  position: fixed;
-  width: 0;
-  height: 0;
-  overflow: hidden;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
-  width: auto;
-  height: auto;
-  top: 0;
-  left: 0;
-  bottom: 0;
-  right: 0;
-  padding: 1em;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
-  position: absolute;
-  left: 0;
-  right: 0;
-  margin: auto;
-  overflow: hidden;
-  max-width: 100%;
-  max-height: 100%;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
-  width: 100%;
-  height: 100%;
-}
-.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
-  width: 100%;
-  height: 100%;
-  top: 0;
-  bottom: 0;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-  background-color: rgba(255, 255, 255, 0.5);
-  opacity: 0;
-  -webkit-transition: opacity 250ms ease-in-out;
-  -moz-transition: opacity 250ms ease-in-out;
-  -ms-transition: opacity 250ms ease-in-out;
-  -o-transition: opacity 250ms ease-in-out;
-  transition: opacity 250ms ease-in-out;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
-  top: 1em;
-  bottom: 1em;
-  background-color: #fff;
-  -webkit-transform: scale(0.5);
-  -moz-transform: scale(0.5);
-  -ms-transform: scale(0.5);
-  -o-transform: scale(0.5);
-  transform: scale(0.5);
-  -webkit-transition: all 250ms ease-in-out;
-  -moz-transition: all 250ms ease-in-out;
-  -ms-transition: all 250ms ease-in-out;
-  -o-transition: all 250ms ease-in-out;
-  transition: all 250ms ease-in-out;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
-  opacity: 1;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
-  -webkit-transform: scale(1);
-  -moz-transform: scale(1);
-  -ms-transform: scale(1);
-  -o-transform: scale(1);
-  transform: scale(1);
-}
-.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
-  border: solid 1px #aaa;
-  border-radius: 0.2em;
-  box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
-}
-
-.oo-ui-icon-add {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/add.png);
-}
-.oo-ui-image-invert .oo-ui-icon-add,
-.oo-ui-image-invert.oo-ui-icon-add {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/add-invert.png);
-}
-.oo-ui-icon-advanced {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/advanced.png);
-}
-.oo-ui-image-invert .oo-ui-icon-advanced,
-.oo-ui-image-invert.oo-ui-icon-advanced {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/advanced-invert.png);
-}
-.oo-ui-icon-alert {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/alert.png);
-}
-.oo-ui-image-invert .oo-ui-icon-alert,
-.oo-ui-image-invert.oo-ui-icon-alert {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/alert-invert.png);
-}
-.oo-ui-icon-check {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/check.png);
-}
-.oo-ui-image-invert .oo-ui-icon-check,
-.oo-ui-image-invert.oo-ui-icon-check {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/check-invert.png);
-}
-.oo-ui-icon-clear {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/clear.png);
-}
-.oo-ui-image-invert .oo-ui-icon-clear,
-.oo-ui-image-invert.oo-ui-icon-clear {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/clear-invert.png);
-}
-.oo-ui-icon-close {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/close.png);
-}
-.oo-ui-image-invert .oo-ui-icon-close,
-.oo-ui-image-invert.oo-ui-icon-close {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/close-invert.png);
-}
-.oo-ui-icon-code {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/code.png);
-}
-.oo-ui-image-invert .oo-ui-icon-code,
-.oo-ui-image-invert.oo-ui-icon-code {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/code-invert.png);
-}
-.oo-ui-icon-collapse {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/collapse.png);
-}
-.oo-ui-image-invert .oo-ui-icon-collapse,
-.oo-ui-image-invert.oo-ui-icon-collapse {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/collapse-invert.png);
-}
-.oo-ui-icon-comment {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/comment.png);
-}
-.oo-ui-image-invert .oo-ui-icon-comment,
-.oo-ui-image-invert.oo-ui-icon-comment {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/comment-invert.png);
-}
-.oo-ui-icon-expand {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/expand.png);
-}
-.oo-ui-image-invert .oo-ui-icon-expand,
-.oo-ui-image-invert.oo-ui-icon-expand {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/expand-invert.png);
-}
-.oo-ui-icon-help {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/help.png);
-}
-.oo-ui-image-invert .oo-ui-icon-help,
-.oo-ui-image-invert.oo-ui-icon-help {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/help-invert.png);
-}
-.oo-ui-icon-info {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/info.png);
-}
-.oo-ui-image-invert .oo-ui-icon-info,
-.oo-ui-image-invert.oo-ui-icon-info {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/info-invert.png);
-}
-.oo-ui-icon-link {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/link.png);
-}
-.oo-ui-image-invert .oo-ui-icon-link,
-.oo-ui-image-invert.oo-ui-icon-link {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/link-invert.png);
-}
-.oo-ui-icon-menu {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/menu.png);
-}
-.oo-ui-image-invert .oo-ui-icon-menu,
-.oo-ui-image-invert.oo-ui-icon-menu {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/menu-invert.png);
-}
-.oo-ui-icon-next {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/move-rtl.png);
-}
-.oo-ui-image-invert .oo-ui-icon-next,
-.oo-ui-image-invert.oo-ui-icon-next {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/move-rtl-invert.png);
-}
-.oo-ui-icon-picture {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/picture.png);
-}
-.oo-ui-image-invert .oo-ui-icon-picture,
-.oo-ui-image-invert.oo-ui-icon-picture {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/picture-invert.png);
-}
-.oo-ui-icon-previous {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/move-ltr.png);
-}
-.oo-ui-image-invert .oo-ui-icon-previous,
-.oo-ui-image-invert.oo-ui-icon-previous {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/move-ltr-invert.png);
-}
-.oo-ui-icon-redo {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-rtl.png);
-}
-.oo-ui-image-invert .oo-ui-icon-redo,
-.oo-ui-image-invert.oo-ui-icon-redo {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-rtl-invert.png);
-}
-.oo-ui-icon-remove {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/remove.png);
-}
-.oo-ui-image-invert .oo-ui-icon-remove,
-.oo-ui-image-invert.oo-ui-icon-remove {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/remove-invert.png);
-}
-.oo-ui-icon-search {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/search.png);
-}
-.oo-ui-image-invert .oo-ui-icon-search,
-.oo-ui-image-invert.oo-ui-icon-search {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/search-invert.png);
-}
-.oo-ui-icon-settings {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/settings.png);
-}
-.oo-ui-image-invert .oo-ui-icon-settings,
-.oo-ui-image-invert.oo-ui-icon-settings {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/settings-invert.png);
-}
-.oo-ui-icon-tag {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/tag.png);
-}
-.oo-ui-image-invert .oo-ui-icon-tag,
-.oo-ui-image-invert.oo-ui-icon-tag {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/tag-invert.png);
-}
-.oo-ui-icon-undo {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-ltr.png);
-}
-.oo-ui-image-invert .oo-ui-icon-undo,
-.oo-ui-image-invert.oo-ui-icon-undo {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-ltr-invert.png);
-}
-.oo-ui-icon-window {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/window.png);
-}
-.oo-ui-image-invert .oo-ui-icon-window,
-.oo-ui-image-invert.oo-ui-icon-window {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/window-invert.png);
-}
-.oo-ui-indicator-alert {
-  background-image: /* @embed */ url(themes/mediawiki/images/indicators/alert.png);
-}
-.oo-ui-image-invert .oo-ui-indicator-alert,
-.oo-ui-image-invert.oo-ui-indicator-alert {
-  background-image: /* @embed */ url(themes/mediawiki/images/indicators/alert-invert.png);
-}
-.oo-ui-indicator-up {
-  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-up.png);
-}
-.oo-ui-image-invert .oo-ui-indicator-up,
-.oo-ui-image-invert.oo-ui-indicator-up {
-  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-up-invert.png);
-}
-.oo-ui-indicator-down {
-  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-down.png);
-}
-.oo-ui-image-invert .oo-ui-indicator-down,
-.oo-ui-image-invert.oo-ui-indicator-down {
-  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-down-invert.png);
-}
-.oo-ui-indicator-next {
-  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-rtl.png);
-}
-.oo-ui-image-invert .oo-ui-indicator-next,
-.oo-ui-image-invert.oo-ui-indicator-next {
-  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-rtl-invert.png);
-}
-.oo-ui-indicator-previous {
-  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-ltr.png);
-}
-.oo-ui-image-invert .oo-ui-indicator-previous,
-.oo-ui-image-invert.oo-ui-indicator-previous {
-  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-ltr-invert.png);
-}
-.oo-ui-indicator-required {
-  background-image: /* @embed */ url(themes/mediawiki/images/indicators/required.png);
-}
-.oo-ui-image-invert .oo-ui-indicator-required,
-.oo-ui-image-invert.oo-ui-indicator-required {
-  background-image: /* @embed */ url(themes/mediawiki/images/indicators/required-invert.png);
-}
-.oo-ui-texture-pending {
-  background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
-}
-.oo-ui-texture-transparency {
-  background-image: /* @embed */ url(themes/mediawiki/images/textures/transparency.png);
-}
-.oo-ui-image-invert .oo-ui-texture-transparency,
-.oo-ui-image-invert.oo-ui-texture-transparency {
-  background-image: /* @embed */ url(themes/mediawiki/images/textures/transparency-invert.png);
-}
diff --git a/resources/lib/oojs-ui/oojs-ui-mediawiki.svg.css b/resources/lib/oojs-ui/oojs-ui-mediawiki.svg.css
index 6fc365b113..08c2350ae4 100644
--- a/resources/lib/oojs-ui/oojs-ui-mediawiki.svg.css
+++ b/resources/lib/oojs-ui/oojs-ui-mediawiki.svg.css
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (1829141230)
+ * OOjs UI v0.1.0-pre (db065e5a9f)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-10-15T22:50:09Z
+ * Date: 2014-10-20T14:47:55Z
  */
 /* @noflip */
 .oo-ui-rtl {
@@ -154,6 +154,7 @@
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
 	outline: none;
 }
+.oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
 	line-height: 2.2em;
 }
@@ -417,6 +418,7 @@
 	z-index: 4;
 }
 .oo-ui-popupTool .oo-ui-popupWidget {
+	/* @noflip */
 	margin-left: 1.25em;
 	font-size: 0.8em;
 }
@@ -986,6 +988,8 @@
 }
 .oo-ui-popupWidget {
 	position: absolute;
+	/* @noflip */
+	left: 0;
 }
 .oo-ui-popupWidget-popup {
 	position: relative;
@@ -1000,6 +1004,8 @@
 	display: block;
 	position: absolute;
 	top: 0;
+	/* @noflip */
+	left: 0;
 	background-repeat: no-repeat;
 }
 .oo-ui-popupWidget-head {
@@ -1391,6 +1397,18 @@
 	overflow-x: hidden;
 	overflow-y: auto;
 }
+.oo-ui-searchWidget-query {
+	height: 2.4em;
+	top: 1px;
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget input {
+	border-width: 1px 0;
+}
+.oo-ui-searchWidget-results {
+	top: 2.2em;
+	bottom: 0.2em;
+	line-height: 0;
+}
 .oo-ui-window {
 	line-height: 1em;
 }
@@ -1425,6 +1443,7 @@
 .oo-ui-window-inner-overlay {
 	position: absolute;
 	top: 0;
+	/* @noflip */
 	left: 0;
 }
 .oo-ui-window-isolated,
diff --git a/resources/lib/oojs-ui/oojs-ui-mediawiki.svg.rtl.css b/resources/lib/oojs-ui/oojs-ui-mediawiki.svg.rtl.css
deleted file mode 100644
index 17d89ec025..0000000000
--- a/resources/lib/oojs-ui/oojs-ui-mediawiki.svg.rtl.css
+++ /dev/null
@@ -1,1997 +0,0 @@
-/*!
- * OOjs UI v0.1.0
- * https://www.mediawiki.org/wiki/OOjs_UI
- *
- * Copyright 2011–2014 OOjs Team and other contributors.
- * Released under the MIT license
- * http://oojs.mit-license.org
- *
- * Date: 2014-09-24T23:21:42Z
- */
-/* @noflip */
-.oo-ui-rtl {
-  direction: rtl;
-}
-/* @noflip */
-.oo-ui-ltr {
-  direction: ltr;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button {
-  cursor: pointer;
-  display: inline-block;
-  vertical-align: middle;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  display: none;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-  display: none;
-}
-.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
-  cursor: default;
-}
-.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  display: inline-block;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-buttonElement-frameless {
-  display: inline-block;
-  position: relative;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-  display: inline-block;
-  vertical-align: top;
-  text-align: center;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-  cursor: default;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button {
-  font-weight: bold;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  margin-right: 0;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-  margin-left: -0.75em;
-}
-.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  width: 2.2em;
-  height: 2.2em;
-}
-.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
-.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-  opacity: 0.2;
-}
-.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #ddd;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  margin-right: 0.25em;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #757575;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #444444;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
-  color: #598ad1;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #777777;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #015ccc;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
-  color: #00c697;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #777777;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #008c6d;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
-  color: #e81915;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #777777;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  color: #a7170f;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-  margin: 0.1em 0;
-  padding: 0.3em 1.2em;
-  border-radius: 0.3em;
-  -webkit-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
-  -moz-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
-  -ms-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
-  -o-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
-  transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  line-height: 2.2em;
-}
-.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  margin-right: -0.5em;
-  margin-left: -0.5em;
-}
-.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  margin-right: -0.5em;
-  margin-left: 0.3em;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
-  color: #ddd;
-  background: #fff;
-  border: solid 1px #cdcdcd;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
-  color: #757575;
-  background-color: #fff;
-  border: solid 1px #cdcdcd;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
-  box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2), 0 0.1em 0 0 rgba(0, 0, 0, 0.2);
-  border-color: #aaa;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-  background-color: #d0d0d0;
-  border-color: #d0d0d0;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button {
-  text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
-  color: #fff;
-  background-color: #0274ff;
-  border-color: #0274ff;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus {
-  box-shadow: inset 0 -0.2em 0 0 #015ccc, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
-  border-bottom-color: #015ccc;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-  background-color: #015ccc;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
-  text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
-  color: #fff;
-  background-color: #00af89;
-  border-color: #00af89;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
-  box-shadow: inset 0 -0.2em 0 0 #008c6d, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
-  border-bottom-color: #008c6d;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-  background-color: #008c6d;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
-  text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
-  color: #fff;
-  background-color: #d11d13;
-  border-color: #d11d13;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
-  box-shadow: inset 0 -0.2em 0 0 #a7170f, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
-  border-bottom-color: #a7170f;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-  background-color: #a7170f;
-}
-.oo-ui-clippableElement-clippable {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
-  overflow-y: hidden;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-  width: 100%;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
-  padding: 2em;
-}
-.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 3em;
-  overflow-y: auto;
-}
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-  position: absolute;
-  bottom: 0;
-  right: 0;
-  left: 0;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-  padding: 1.5em;
-}
-.oo-ui-bookletLayout-outlinePanel {
-  border-left: solid 1px #ddd;
-}
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-  box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-fieldLayout {
-  margin-bottom: 1em;
-}
-.oo-ui-fieldLayout:before,
-.oo-ui-fieldLayout:after {
-  content: " ";
-  display: table;
-}
-.oo-ui-fieldLayout:after {
-  clear: both;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-  display: block;
-  float: right;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-  display: block;
-  float: right;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-  text-align: left;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
-  display: inline-block;
-}
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
-  z-index: 1;
-}
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
-  float: left;
-}
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
-  padding: 0.5em 0.75em;
-}
-.oo-ui-fieldLayout:last-child {
-  margin-bottom: 0;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-  padding-top: 0.5em;
-  margin-left: 5%;
-  width: 35%;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-  width: 60%;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
-  padding: 0.75em 0.5em 0.5em 0.5em;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-  padding: 0.5em 0;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
-  padding: 0.5em 0;
-}
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  margin-top: 0.25em;
-}
-.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
-  color: #ccc;
-}
-.oo-ui-fieldsetLayout {
-  position: relative;
-  margin: 0;
-  padding: 0;
-  border: none;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-  display: block;
-  position: absolute;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
-  display: inline-block;
-}
-.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
-  margin-top: 2em;
-}
-.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
-  font-size: 1.5em;
-  margin-bottom: 0.5em;
-  padding: 0.25em 0;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
-  padding-right: 1.75em;
-  line-height: 1.33em;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-  right: 0;
-  top: 0.25em;
-  width: 2em;
-  height: 2em;
-}
-.oo-ui-gridLayout {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 0;
-}
-.oo-ui-panelLayout {
-  position: relative;
-}
-.oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-.oo-ui-panelLayout-expanded {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 0;
-}
-.oo-ui-panelLayout-padded {
-  padding: 1.25em;
-}
-.oo-ui-stackLayout > .oo-ui-panelLayout {
-  display: none;
-}
-.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
-  display: block;
-  position: relative;
-}
-.oo-ui-popupTool .oo-ui-popupWidget-popup,
-.oo-ui-popupTool .oo-ui-popupWidget-anchor {
-  z-index: 4;
-}
-.oo-ui-popupTool .oo-ui-popupWidget {
-  margin-right: 1.25em;
-  font-size: 0.8em;
-}
-.oo-ui-toolGroup {
-  display: inline-block;
-  vertical-align: middle;
-  margin: 0.3em;
-}
-.oo-ui-toolGroup-empty {
-  display: none;
-}
-.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
-  color: #000;
-}
-.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
-.oo-ui-barToolGroup > .oo-ui-labelElement-label {
-  display: none;
-}
-.oo-ui-barToolGroup .oo-ui-tool {
-  display: inline-block;
-  position: relative;
-  vertical-align: top;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link {
-  display: block;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  display: block;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  display: none;
-}
-.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-.oo-ui-barToolGroup .oo-ui-tool-title,
-.oo-ui-barToolGroup .oo-ui-tool-accel {
-  display: none;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
-  cursor: pointer;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link {
-  height: 1.5em;
-  padding: 0.25em;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  height: 1.5em;
-  width: 1.5em;
-  opacity: 0.8;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled {
-  background-color: #eee;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 0.8;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 1;
-}
-.oo-ui-barToolGroup.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-popupToolGroup {
-  position: relative;
-  height: 2em;
-  min-width: 2.5em;
-}
-.oo-ui-popupToolGroup-handle {
-  display: block;
-  cursor: pointer;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-  position: absolute;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
-  cursor: default;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-  display: none;
-  position: absolute;
-  z-index: 4;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
-  background-repeat: no-repeat;
-  background-position: center center;
-}
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
-  display: block;
-}
-.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
-  right: 0;
-}
-.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
-  left: 0;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-accel {
-  display: none;
-}
-.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
-  min-width: 3.5em;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-  top: 0;
-  width: 2em;
-  height: 2em;
-  opacity: 0.8;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
-  left: 0;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-  right: 0.25em;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-  line-height: 2.6em;
-  font-size: 0.8em;
-  margin: 0 1em;
-}
-.oo-ui-popupToolGroup-header {
-  line-height: 2.6em;
-  font-size: 0.8em;
-  margin: 0 0.6em;
-  font-weight: bold;
-}
-.oo-ui-popupToolGroup.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-  margin-right: 3em;
-}
-.oo-ui-popupToolGroup.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-  margin-left: 2.25em;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-  top: 2em;
-  background-color: white;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  height: 2em;
-  width: 2em;
-  margin-left: 0.25em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  line-height: 2em;
-  font-size: 0.8em;
-}
-.oo-ui-listToolGroup .oo-ui-tool {
-  display: inline-block;
-  width: 100%;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-  display: block;
-  cursor: pointer;
-  white-space: nowrap;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-.oo-ui-listToolGroup .oo-ui-tool {
-  padding: 0 0.25em;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-  padding-left: 0.5em;
-}
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
-  background-color: #eee;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
-  color: #ccc;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-listToolGroup.oo-ui-widget-disabled {
-  color: #ccc;
-}
-.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
-.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
-  padding: 0.25em 0 0.25em 0;
-  border: 1px solid #aaa;
-  box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2), 0 0.1em 0 0 rgba(0, 0, 0, 0.2);
-}
-.oo-ui-menuToolGroup {
-  border: solid 1px #ccc;
-  border-radius: 0.1em;
-}
-.oo-ui-menuToolGroup .oo-ui-tool {
-  display: block;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-  display: block;
-  cursor: pointer;
-  white-space: nowrap;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
-  min-width: 8em;
-}
-.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
-  margin-right: -1px;
-  padding: 0.25em 0 0.25em 0;
-  border: 1px solid #aaa;
-  box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2), 0 0.1em 0 0 rgba(0, 0, 0, 0.2);
-}
-.oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
-  border-color: #aaa;
-}
-.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
-  border-color: #aaa;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-  padding: 0 0.25em 0 1em;
-  display: block;
-  cursor: pointer;
-  white-space: nowrap;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  background-image: none;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/check.svg);
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
-  background-color: #e1f3ff;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
-  color: #ccc;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-menuToolGroup.oo-ui-widget-disabled {
-  color: #ccc;
-  border-color: #ccc;
-}
-.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
-.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
-  opacity: 0.2;
-}
-.oo-ui-toolbar {
-  clear: both;
-}
-.oo-ui-toolbar-bar {
-  line-height: 1em;
-}
-.oo-ui-toolbar-actions {
-  float: left;
-}
-.oo-ui-toolbar-tools {
-  display: inline;
-}
-.oo-ui-toolbar-tools,
-.oo-ui-toolbar-actions,
-.oo-ui-toolbar-shadow {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-toolbar-actions .oo-ui-popupWidget {
-  -webkit-touch-callout: default;
-  -webkit-user-select: all;
-  -moz-user-select: all;
-  -ms-user-select: all;
-  user-select: all;
-}
-.oo-ui-toolbar-shadow {
-  background-position: right top;
-  background-repeat: repeat-x;
-  position: absolute;
-  width: 100%;
-  pointer-events: none;
-}
-.oo-ui-toolbar-bar {
-  border-bottom: solid 1px #ccc;
-}
-.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
-  border: none;
-  background: none;
-}
-.oo-ui-toolbar-shadow {
-  display: none;
-}
-.oo-ui-selectWidget {
-  border-radius: 0.3em;
-}
-.oo-ui-selectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-  border-radius: 0;
-  margin-right: -1px;
-}
-.oo-ui-selectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
-  border-bottom-right-radius: 0.3em;
-  border-top-right-radius: 0.3em;
-  margin-right: 0;
-}
-.oo-ui-selectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
-  border-bottom-left-radius: 0.3em;
-  border-top-left-radius: 0.3em;
-}
-.oo-ui-optionWidget {
-  position: relative;
-  display: block;
-  cursor: pointer;
-  padding: 0.5em 3em 0.5em 2em;
-  border: none;
-}
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-  cursor: default;
-}
-.oo-ui-optionWidget .oo-ui-labelElement-label {
-  display: block;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-.oo-ui-optionWidget-highlighted {
-  background-color: #eee;
-}
-.oo-ui-optionWidget .oo-ui-labelElement-label {
-  line-height: 1.5em;
-}
-.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected {
-  background-color: #a7dcff;
-}
-.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
-  background-color: #a7dcff;
-}
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-  color: #ccc;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-  position: absolute;
-  background-repeat: no-repeat;
-  background-position: center center;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-  top: 50%;
-  width: 2em;
-  height: 2em;
-  margin-top: -1em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
-  right: 0.5em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-  left: 0.5em;
-}
-.oo-ui-buttonSelectWidget {
-  display: inline-block;
-  white-space: nowrap;
-  border-radius: 0.3em;
-}
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-  border-radius: 0;
-  margin-right: -1px;
-}
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
-  border-bottom-right-radius: 0.3em;
-  border-top-right-radius: 0.3em;
-  margin-right: 0;
-}
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
-  border-bottom-left-radius: 0.3em;
-  border-top-left-radius: 0.3em;
-}
-.oo-ui-buttonOptionWidget {
-  display: inline-block;
-  padding: 0;
-  background-color: transparent;
-}
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-  position: relative;
-}
-.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  position: static;
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-  height: 2.2em;
-}
-.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  height: 2.2em;
-  margin-top: 0;
-}
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
-  background-color: transparent;
-}
-.oo-ui-labelWidget {
-  display: inline-block;
-}
-.oo-ui-iconWidget {
-  display: inline-block;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-  line-height: 2.5em;
-  height: 2.2em;
-  width: 2.2em;
-}
-.oo-ui-iconWidget.oo-ui-widget-disabled {
-  opacity: 0.2;
-}
-.oo-ui-indicatorWidget {
-  display: inline-block;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-  line-height: 2.5em;
-  height: 2.2em;
-  width: 2.2em;
-}
-.oo-ui-indicatorWidget.oo-ui-widget-disabled {
-  opacity: 0.2;
-}
-.oo-ui-buttonWidget {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-buttonGroupWidget {
-  display: inline-block;
-  white-space: nowrap;
-  border-radius: 0.3em;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-  border-radius: 0;
-  margin-bottom: -1px;
-  margin-right: -1px;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
-  border-bottom-right-radius: 0.3em;
-  border-top-right-radius: 0.3em;
-  margin-right: 0;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
-  border-bottom-left-radius: 0.3em;
-  border-top-left-radius: 0.3em;
-}
-.oo-ui-toggleSwitchWidget {
-  position: relative;
-  display: inline-block;
-  vertical-align: middle;
-  overflow: hidden;
-  cursor: pointer;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  -webkit-transform: translateZ(0px);
-  -moz-transform: translateZ(0px);
-  -ms-transform: translateZ(0px);
-  -o-transform: translateZ(0px);
-  transform: translateZ(0px);
-  height: 2em;
-  width: 4em;
-  border-radius: 1em;
-  border: 1px #ddd solid;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-  cursor: default;
-}
-.oo-ui-toggleSwitchWidget-grip {
-  position: absolute;
-  display: block;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  right: 0;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-  display: none;
-}
-.oo-ui-toggleSwitchWidget-grip {
-  top: 0.25em;
-  right: 0.25em;
-  width: 1.5em;
-  height: 1.5em;
-  margin-top: -1px;
-  border-radius: 1em;
-  border: 1px #ddd solid;
-  background-color: #f7f7f7;
-  -webkit-transition: right 0.1s ease-in-out, margin-right 0.1s ease-in-out;
-  -moz-transition: right 0.1s ease-in-out, margin-right 0.1s ease-in-out;
-  -ms-transition: right 0.1s ease-in-out, margin-right 0.1s ease-in-out;
-  -o-transition: right 0.1s ease-in-out, margin-right 0.1s ease-in-out;
-  transition: right 0.1s ease-in-out, margin-right 0.1s ease-in-out;
-}
-.oo-ui-toggleSwitchWidget-glow {
-  border-radius: 1em;
-  background-color: #f7f7f7;
-  -webkit-transition: background-color 0.1s ease-in-out;
-  -moz-transition: background-color 0.1s ease-in-out;
-  -ms-transition: background-color 0.1s ease-in-out;
-  -o-transition: background-color 0.1s ease-in-out;
-  transition: background-color 0.1s ease-in-out;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
-  right: 2.25em;
-  margin-right: -2px;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-  display: block;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
-  right: 0.25em;
-  margin-right: 0;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled {
-  border: 1px #ccc solid;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover {
-  border-color: #aaa;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled .oo-ui-toggleSwitchWidget-grip {
-  background-color: #fff;
-  border-color: #aaa;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
-  background-color: #d0d0d0;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-  background-color: #fff;
-}
-.oo-ui-actionWidget.oo-ui-pendingElement-pending {
-  background-image: /* @embed */ url(images/textures/pending.gif);
-}
-.oo-ui-popupWidget-popup {
-  position: absolute;
-  overflow: hidden;
-  z-index: 1;
-}
-.oo-ui-popupWidget-anchor {
-  display: none;
-  z-index: 1;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
-  display: block;
-  position: absolute;
-  background-repeat: no-repeat;
-}
-.oo-ui-popupWidget-head {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-  float: left;
-}
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
-  float: right;
-  cursor: default;
-}
-.oo-ui-popupWidget-body {
-  clear: both;
-  overflow: hidden;
-}
-.oo-ui-popupWidget-popup {
-  border: solid 1px #aaa;
-  border-radius: 0.2em;
-  background-color: #fff;
-  box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
-  margin-top: 7px;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
-  content: "";
-  position: absolute;
-  width: 0;
-  height: 0;
-  border-style: solid;
-  border-color: transparent;
-  border-top: 0;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
-  bottom: -8px;
-  right: 11px;
-  border-bottom-color: #888;
-  border-width: 13px;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
-  bottom: -8px;
-  right: 12px;
-  border-bottom-color: #fff;
-  border-width: 12px;
-}
-.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
-  -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
-  -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
-  -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
-  -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
-  transition: width 100ms ease-in-out, height 100ms ease-in-out, right 100ms ease-in-out;
-}
-.oo-ui-popupWidget-head {
-  height: 2.5em;
-}
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-  margin: 0.25em;
-}
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
-  margin: 0.75em 1em;
-}
-.oo-ui-popupWidget-body {
-  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-popupWidget-body-padded {
-  padding: 0 1em;
-}
-.oo-ui-popupButtonWidget {
-  position: relative;
-}
-.oo-ui-popupButtonWidget .oo-ui-popupWidget {
-  position: absolute;
-  right: 1em;
-  cursor: auto;
-}
-.oo-ui-popupButtonWidget > .oo-ui-popupWidget {
-  margin-right: -1em;
-}
-.oo-ui-textInputWidget {
-  position: relative;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  width: 20em;
-}
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-  display: inline-block;
-  width: 100%;
-  resize: none;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-  background-image: /* @embed */ url(images/textures/pending.gif);
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
-  position: absolute;
-  top: 0;
-  height: 100%;
-  background-repeat: no-repeat;
-  cursor: pointer;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
-  right: 0;
-}
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
-  left: 0;
-}
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-  padding: 0.5em 0.9em 0.5em 0.5em;
-  margin: 0;
-  font-size: 1em;
-  font-family: sans-serif;
-  background-color: #fff;
-  border: solid 1px #ccc;
-  box-shadow: inset 0 0 0 0 #0274FF;
-  border-radius: 0.1em;
-  -webkit-transition: box-shadow 0.1s;
-  -moz-transition: box-shadow 0.1s;
-  -ms-transition: box-shadow 0.1s;
-  -o-transition: box-shadow 0.1s;
-  transition: box-shadow 0.1s;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-textInputWidget-decorated input,
-.oo-ui-textInputWidget-decorated textarea {
-  padding-right: 2em;
-}
-.oo-ui-textInputWidget-icon {
-  width: 2em;
-}
-.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
-  outline: none;
-  border-color: #aaa;
-  box-shadow: inset 0.4em 0 0 0 #0274ff;
-}
-.oo-ui-textInputWidget input[readonly],
-.oo-ui-textInputWidget textarea[readonly] {
-  color: #777;
-  text-shadow: 0 1px 1px #fff;
-}
-.oo-ui-textInputWidget input[readonly]:focus,
-.oo-ui-textInputWidget textarea[readonly]:focus {
-  box-shadow: inset 0.4em 0 0 0 #ccc;
-}
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-  background-color: transparent;
-}
-.oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
-  color: #ccc;
-  text-shadow: 0 1px 1px #fff;
-  border-color: #ddd;
-  background-color: #f3f3f3;
-}
-.oo-ui-textInputWidget.oo-ui-iconElement input,
-.oo-ui-textInputWidget.oo-ui-iconElement textarea {
-  padding-right: 2.4em;
-}
-.oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-  right: 0.4em;
-  width: 2em;
-  height: 100%;
-  background-position: left center;
-}
-.oo-ui-textInputWidget.oo-ui-indicatorElement input,
-.oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
-  padding-left: 2.2em;
-}
-.oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  width: 1.6em;
-  height: 100%;
-  background-position: right center;
-}
-.oo-ui-menuWidget {
-  position: absolute;
-  background: #fff;
-  margin-top: -1px;
-  border: solid 1px #aaa;
-  border-radius: 0 0 0.1em 0.1em;
-  padding-bottom: 0.25em;
-  box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2), 0 0.1em 0 0 rgba(0, 0, 0, 0.2);
-}
-.oo-ui-menuWidget input {
-  position: absolute;
-  width: 0;
-  height: 0;
-  overflow: hidden;
-  opacity: 0;
-}
-.oo-ui-menuItemWidget {
-  position: relative;
-}
-.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
-  display: none;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-  background-color: transparent;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
-  display: block;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-  background-color: transparent;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted,
-.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
-  background-color: #eee;
-}
-.oo-ui-menuSectionItemWidget {
-  cursor: default;
-  padding: 0.33em 0.75em;
-  color: #888;
-}
-.oo-ui-inlineMenuWidget {
-  position: relative;
-  display: inline-block;
-  margin: 0.25em 0;
-  min-width: 20em;
-}
-.oo-ui-inlineMenuWidget-handle {
-  width: 100%;
-  display: inline-block;
-  cursor: pointer;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
-  position: absolute;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
-  z-index: 1;
-  width: 100%;
-}
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
-  cursor: default;
-}
-.oo-ui-inlineMenuWidget-handle {
-  height: 2.5em;
-  border: solid 1px #ccc;
-  border-radius: 0.1em;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
-  left: 0;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
-  right: 0.25em;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
-  line-height: 2.5em;
-  margin: 0 1em;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
-  top: 0;
-  width: 2.5em;
-  height: 2.5em;
-}
-.oo-ui-inlineMenuWidget:hover .oo-ui-inlineMenuWidget-handle {
-  border-color: #aaa;
-}
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
-  color: #ccc;
-  text-shadow: 0 1px 1px #fff;
-  border-color: #ddd;
-  background-color: #f3f3f3;
-}
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
-  opacity: 0.2;
-}
-.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
-  margin-right: 3em;
-}
-.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
-  margin-left: 2em;
-}
-.oo-ui-inlineMenuWidget .oo-ui-selectWidget {
-  border-top-color: #fff;
-}
-.oo-ui-outlineItemWidget {
-  position: relative;
-  cursor: pointer;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-  float: right;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
-  float: right;
-  background-position: left center;
-  background-repeat: no-repeat;
-}
-.oo-ui-outlineControlsWidget-items {
-  float: right;
-}
-.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
-  float: right;
-}
-.oo-ui-outlineControlsWidget-movers {
-  float: left;
-}
-.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
-  float: left;
-}
-.oo-ui-comboBoxWidget {
-  display: inline-block;
-  position: relative;
-}
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
-  width: 100%;
-  z-index: 1;
-}
-.oo-ui-comboBoxWidget .oo-ui-textInputWidget input,
-.oo-ui-comboBoxWidget .oo-ui-textInputWidget textarea {
-  height: 2.35em;
-}
-.oo-ui-comboBoxWidget .oo-ui-textInputWidget.oo-ui-indicatorElement {
-  padding-left: 2.2em;
-}
-.oo-ui-comboBoxWidget .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  width: 2.2em;
-  background-position: center center;
-  border: solid 1px #ccc;
-  border-right: none;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-searchWidget-query {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-}
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-  width: 100%;
-}
-.oo-ui-searchWidget-results {
-  position: absolute;
-  bottom: 0;
-  right: 0;
-  left: 0;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-.oo-ui-window {
-  line-height: 1em;
-}
-.oo-ui-window-frame {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-window-frame > iframe {
-  width: 100%;
-  height: 100%;
-  margin: 0;
-  padding: 0;
-}
-.oo-ui-window-content:focus {
-  outline: none;
-}
-.oo-ui-window-head,
-.oo-ui-window-foot {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-window-body {
-  margin: 0;
-  padding: 0;
-  background: none;
-}
-.oo-ui-window-overlay {
-  position: absolute;
-  top: 0;
-  right: 0;
-}
-.oo-ui-window-isolated {
-  background: transparent;
-  font-family: sans-serif;
-  font-size: 0.8em;
-}
-.oo-ui-dialog-content > .oo-ui-window-head,
-.oo-ui-dialog-content > .oo-ui-window-body,
-.oo-ui-dialog-content > .oo-ui-window-foot {
-  position: absolute;
-  right: 0;
-  left: 0;
-  overflow: hidden;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-dialog-content > .oo-ui-window-head {
-  z-index: 1;
-  top: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-head.oo-ui-pendingElement-pending {
-  background-image: /* @embed */ url(images/textures/pending.gif);
-}
-.oo-ui-dialog-content > .oo-ui-window-body {
-  z-index: 2;
-  top: 0;
-  bottom: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-foot {
-  z-index: 1;
-  bottom: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-overlay {
-  z-index: 3;
-}
-.oo-ui-dialog-content > .oo-ui-window-body {
-  box-shadow: 0 0 1px 0 #aaa;
-}
-.oo-ui-messageDialog-actions-horizontal {
-  display: table;
-  table-layout: fixed;
-  width: 100%;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-  display: table-cell;
-  width: 1%;
-}
-.oo-ui-messageDialog-actions-vertical {
-  display: block;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-  display: block;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget {
-  position: relative;
-  text-align: center;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
-  display: block;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
-  position: relative;
-  top: auto;
-  bottom: auto;
-  display: inline;
-  white-space: nowrap;
-}
-.oo-ui-messageDialog-title,
-.oo-ui-messageDialog-message {
-  display: block;
-  text-align: center;
-  padding-top: 0.5em;
-}
-.oo-ui-messageDialog-title {
-  font-size: 1.5em;
-  line-height: 1em;
-  color: #000;
-}
-.oo-ui-messageDialog-message {
-  font-size: 0.9em;
-  line-height: 1.25em;
-  color: #666;
-}
-.oo-ui-messageDialog-message-verbose {
-  font-size: 1.1em;
-  line-height: 1.5em;
-  text-align: right;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-  border-left: solid 1px #e5e5e5;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
-  border-left-width: 0;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-  border-bottom: solid 1px #e5e5e5;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
-  border-bottom-width: 0;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
-  text-align: center;
-  line-height: 3.4em;
-  padding: 0 2em;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
-  background-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
-  background-color: rgba(8, 126, 204, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
-  background-color: rgba(8, 126, 204, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
-  font-weight: bold;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
-  background-color: rgba(118, 171, 54, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
-  background-color: rgba(118, 171, 54, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
-  background-color: rgba(212, 83, 83, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
-  background-color: rgba(212, 83, 83, 0.1);
-}
-.oo-ui-processDialog-location {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-.oo-ui-processDialog-title {
-  display: inline;
-  padding: 0;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
-  white-space: nowrap;
-}
-.oo-ui-processDialog-actions-safe,
-.oo-ui-processDialog-actions-primary {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-}
-.oo-ui-processDialog-actions-safe {
-  right: 0;
-}
-.oo-ui-processDialog-actions-primary {
-  left: 0;
-}
-.oo-ui-processDialog-errors {
-  display: none;
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 0;
-  z-index: 2;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-.oo-ui-processDialog-content .oo-ui-window-head {
-  height: 3.4em;
-}
-.oo-ui-processDialog-content .oo-ui-window-body {
-  top: 3.4em;
-  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
-}
-.oo-ui-processDialog-navigation {
-  position: relative;
-  height: 3.4em;
-  padding: 0 1em;
-}
-.oo-ui-processDialog-location {
-  padding: 0.75em 0;
-  height: 1.9em;
-  cursor: default;
-  text-align: center;
-}
-.oo-ui-processDialog-title {
-  font-weight: bold;
-  line-height: 1.9em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonElement-button {
-  padding-top: 0.75em;
-  padding-bottom: 0.75em;
-  min-width: 1.9em;
-  min-height: 1.9em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labelElement-label {
-  line-height: 1.9em;
-  padding: 0 1em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconElement-icon {
-  position: absolute;
-  margin-top: -0.125em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-  margin: 0.75em 0.75em 0.75em 0;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-  padding: 0;
-  vertical-align: middle;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:hover {
-  background-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:active {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-  margin: 0.75em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-  /* Adjust for border so text aligns with title */
-  margin: -1px;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
-  background-color: rgba(8, 126, 204, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
-  background-color: rgba(8, 126, 204, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
-  font-weight: bold;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
-  background-color: rgba(118, 171, 54, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
-  background-color: rgba(118, 171, 54, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
-  background-color: rgba(212, 83, 83, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
-  background-color: rgba(212, 83, 83, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-  right: 0.5em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
-  padding-right: 2.25em;
-}
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-  left: 0.5em;
-}
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
-  padding-left: 2.25em;
-}
-.oo-ui-processDialog > .oo-ui-window-frame {
-  min-height: 5em;
-}
-.oo-ui-processDialog-errors {
-  background-color: rgba(255, 255, 255, 0.9);
-  padding: 3em 3em 1.5em 3em;
-  text-align: center;
-}
-.oo-ui-processDialog-errors .oo-ui-buttonWidget {
-  margin: 2em 1em 2em 1em;
-}
-.oo-ui-processDialog-errors-title {
-  font-size: 1.5em;
-  color: #000;
-  margin-bottom: 2em;
-}
-.oo-ui-processDialog-error {
-  text-align: right;
-  margin: 1em;
-  padding: 1em;
-  border: solid 1px #ff9e9e;
-  background-color: #fff7f7;
-  border-radius: 0.25em;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-  position: fixed;
-  width: 0;
-  height: 0;
-  overflow: hidden;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
-  width: auto;
-  height: auto;
-  top: 0;
-  left: 0;
-  bottom: 0;
-  right: 0;
-  padding: 1em;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
-  position: absolute;
-  left: 0;
-  right: 0;
-  margin: auto;
-  overflow: hidden;
-  max-width: 100%;
-  max-height: 100%;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
-  width: 100%;
-  height: 100%;
-}
-.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
-  width: 100%;
-  height: 100%;
-  top: 0;
-  bottom: 0;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-  background-color: rgba(255, 255, 255, 0.5);
-  opacity: 0;
-  -webkit-transition: opacity 250ms ease-in-out;
-  -moz-transition: opacity 250ms ease-in-out;
-  -ms-transition: opacity 250ms ease-in-out;
-  -o-transition: opacity 250ms ease-in-out;
-  transition: opacity 250ms ease-in-out;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
-  top: 1em;
-  bottom: 1em;
-  background-color: #fff;
-  -webkit-transform: scale(0.5);
-  -moz-transform: scale(0.5);
-  -ms-transform: scale(0.5);
-  -o-transform: scale(0.5);
-  transform: scale(0.5);
-  -webkit-transition: all 250ms ease-in-out;
-  -moz-transition: all 250ms ease-in-out;
-  -ms-transition: all 250ms ease-in-out;
-  -o-transition: all 250ms ease-in-out;
-  transition: all 250ms ease-in-out;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
-  opacity: 1;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
-  -webkit-transform: scale(1);
-  -moz-transform: scale(1);
-  -ms-transform: scale(1);
-  -o-transform: scale(1);
-  transform: scale(1);
-}
-.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
-  border: solid 1px #aaa;
-  border-radius: 0.2em;
-  box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
-}
-
-.oo-ui-icon-add {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/add.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-add,
-.oo-ui-image-invert.oo-ui-icon-add {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/add-invert.svg);
-}
-.oo-ui-icon-advanced {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/advanced.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-advanced,
-.oo-ui-image-invert.oo-ui-icon-advanced {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/advanced-invert.svg);
-}
-.oo-ui-icon-alert {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/alert.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-alert,
-.oo-ui-image-invert.oo-ui-icon-alert {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/alert-invert.svg);
-}
-.oo-ui-icon-check {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/check.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-check,
-.oo-ui-image-invert.oo-ui-icon-check {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/check-invert.svg);
-}
-.oo-ui-icon-clear {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/clear.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-clear,
-.oo-ui-image-invert.oo-ui-icon-clear {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/clear-invert.svg);
-}
-.oo-ui-icon-close {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/close.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-close,
-.oo-ui-image-invert.oo-ui-icon-close {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/close-invert.svg);
-}
-.oo-ui-icon-code {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/code.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-code,
-.oo-ui-image-invert.oo-ui-icon-code {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/code-invert.svg);
-}
-.oo-ui-icon-collapse {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/collapse.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-collapse,
-.oo-ui-image-invert.oo-ui-icon-collapse {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/collapse-invert.svg);
-}
-.oo-ui-icon-comment {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/comment.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-comment,
-.oo-ui-image-invert.oo-ui-icon-comment {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/comment-invert.svg);
-}
-.oo-ui-icon-expand {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/expand.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-expand,
-.oo-ui-image-invert.oo-ui-icon-expand {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/expand-invert.svg);
-}
-.oo-ui-icon-help {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/help.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-help,
-.oo-ui-image-invert.oo-ui-icon-help {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/help-invert.svg);
-}
-.oo-ui-icon-info {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/info.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-info,
-.oo-ui-image-invert.oo-ui-icon-info {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/info-invert.svg);
-}
-.oo-ui-icon-link {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/link.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-link,
-.oo-ui-image-invert.oo-ui-icon-link {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/link-invert.svg);
-}
-.oo-ui-icon-menu {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/menu.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-menu,
-.oo-ui-image-invert.oo-ui-icon-menu {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/menu-invert.svg);
-}
-.oo-ui-icon-next {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/move-rtl.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-next,
-.oo-ui-image-invert.oo-ui-icon-next {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/move-rtl-invert.svg);
-}
-.oo-ui-icon-picture {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/picture.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-picture,
-.oo-ui-image-invert.oo-ui-icon-picture {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/picture-invert.svg);
-}
-.oo-ui-icon-previous {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/move-ltr.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-previous,
-.oo-ui-image-invert.oo-ui-icon-previous {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/move-ltr-invert.svg);
-}
-.oo-ui-icon-redo {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-rtl.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-redo,
-.oo-ui-image-invert.oo-ui-icon-redo {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-rtl-invert.svg);
-}
-.oo-ui-icon-remove {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/remove.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-remove,
-.oo-ui-image-invert.oo-ui-icon-remove {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/remove-invert.svg);
-}
-.oo-ui-icon-search {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/search.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-search,
-.oo-ui-image-invert.oo-ui-icon-search {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/search-invert.svg);
-}
-.oo-ui-icon-settings {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/settings.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-settings,
-.oo-ui-image-invert.oo-ui-icon-settings {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/settings-invert.svg);
-}
-.oo-ui-icon-tag {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/tag.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-tag,
-.oo-ui-image-invert.oo-ui-icon-tag {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/tag-invert.svg);
-}
-.oo-ui-icon-undo {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-ltr.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-undo,
-.oo-ui-image-invert.oo-ui-icon-undo {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/arched-arrow-ltr-invert.svg);
-}
-.oo-ui-icon-window {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/window.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-window,
-.oo-ui-image-invert.oo-ui-icon-window {
-  background-image: /* @embed */ url(themes/mediawiki/images/icons/window-invert.svg);
-}
-.oo-ui-indicator-alert {
-  background-image: /* @embed */ url(themes/mediawiki/images/indicators/alert.svg);
-}
-.oo-ui-image-invert .oo-ui-indicator-alert,
-.oo-ui-image-invert.oo-ui-indicator-alert {
-  background-image: /* @embed */ url(themes/mediawiki/images/indicators/alert-invert.svg);
-}
-.oo-ui-indicator-up {
-  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-up.svg);
-}
-.oo-ui-image-invert .oo-ui-indicator-up,
-.oo-ui-image-invert.oo-ui-indicator-up {
-  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-up-invert.svg);
-}
-.oo-ui-indicator-down {
-  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-down.svg);
-}
-.oo-ui-image-invert .oo-ui-indicator-down,
-.oo-ui-image-invert.oo-ui-indicator-down {
-  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-down-invert.svg);
-}
-.oo-ui-indicator-next {
-  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-rtl.svg);
-}
-.oo-ui-image-invert .oo-ui-indicator-next,
-.oo-ui-image-invert.oo-ui-indicator-next {
-  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-rtl-invert.svg);
-}
-.oo-ui-indicator-previous {
-  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-ltr.svg);
-}
-.oo-ui-image-invert .oo-ui-indicator-previous,
-.oo-ui-image-invert.oo-ui-indicator-previous {
-  background-image: /* @embed */ url(themes/mediawiki/images/indicators/arrow-ltr-invert.svg);
-}
-.oo-ui-indicator-required {
-  background-image: /* @embed */ url(themes/mediawiki/images/indicators/required.svg);
-}
-.oo-ui-image-invert .oo-ui-indicator-required,
-.oo-ui-image-invert.oo-ui-indicator-required {
-  background-image: /* @embed */ url(themes/mediawiki/images/indicators/required-invert.svg);
-}
-.oo-ui-texture-pending {
-  background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
-}
-.oo-ui-texture-transparency {
-  background-image: /* @embed */ url(themes/mediawiki/images/textures/transparency.svg);
-}
-.oo-ui-image-invert .oo-ui-texture-transparency,
-.oo-ui-image-invert.oo-ui-texture-transparency {
-  background-image: /* @embed */ url(themes/mediawiki/images/textures/transparency-invert.svg);
-}
diff --git a/resources/lib/oojs-ui/oojs-ui-minerva.css b/resources/lib/oojs-ui/oojs-ui-minerva.css
deleted file mode 100644
index 80bfe8da0c..0000000000
--- a/resources/lib/oojs-ui/oojs-ui-minerva.css
+++ /dev/null
@@ -1,1375 +0,0 @@
-/*!
- * OOjs UI v0.1.0-pre (1829141230)
- * https://www.mediawiki.org/wiki/OOjs_UI
- *
- * Copyright 2011–2014 OOjs Team and other contributors.
- * Released under the MIT license
- * http://oojs.mit-license.org
- *
- * Date: 2014-10-15T22:50:09Z
- */
-/* @noflip */
-.oo-ui-rtl {
-	direction: rtl;
-}
-/* @noflip */
-.oo-ui-ltr {
-	direction: ltr;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button {
-	cursor: pointer;
-	display: inline-block;
-	vertical-align: middle;
-	-webkit-touch-callout: none;
-	-webkit-user-select: none;
-	   -moz-user-select: none;
-	    -ms-user-select: none;
-	        user-select: none;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-	display: none;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-	display: none;
-}
-.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
-	cursor: default;
-}
-.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-	display: inline-block;
-	vertical-align: middle;
-	background-position: center center;
-	background-repeat: no-repeat;
-}
-.oo-ui-buttonElement-frameless {
-	display: inline-block;
-	position: relative;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-	display: inline-block;
-	vertical-align: middle;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-	display: inline-block;
-	vertical-align: top;
-	text-align: center;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-	display: inline-block;
-	vertical-align: middle;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-	cursor: default;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-	margin-left: 0;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-	margin-right: -0.75em;
-}
-.oo-ui-buttonElement.oo-ui-indicatorElement .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-	width: 3.35em;
-	height: 3.35em;
-	background-size: 2em auto;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-	margin-left: 0.25em;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-	line-height: 1.9em;
-}
-.oo-ui-clippableElement-clippable {
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
-	overflow-y: hidden;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-	width: 100%;
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
-	overflow-y: auto;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
-	padding: 2em;
-}
-.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
-	position: absolute;
-	top: 0;
-	left: 0;
-	right: 0;
-	bottom: 3em;
-	overflow-y: auto;
-}
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-	position: absolute;
-	bottom: 0;
-	left: 0;
-	right: 0;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-	padding: 0 0 1em;
-}
-.oo-ui-fieldLayout {
-	margin-bottom: 1em;
-}
-.oo-ui-fieldLayout:before,
-.oo-ui-fieldLayout:after {
-	content: " ";
-	display: table;
-}
-.oo-ui-fieldLayout:after {
-	clear: both;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-	display: block;
-	float: left;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-	display: block;
-	float: left;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-	text-align: right;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
-	display: inline-block;
-	vertical-align: middle;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-	display: inline-block;
-	vertical-align: middle;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
-	display: inline-block;
-}
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
-	z-index: 1;
-}
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
-	float: right;
-}
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
-	padding: 0.5em 0.75em;
-}
-.oo-ui-fieldLayout:last-child {
-	margin-bottom: 0;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-	padding-top: 0.5em;
-	margin-right: 5%;
-	width: 35%;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-	width: 60%;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
-	padding: 0.75em 0.5em 0.5em 0.5em;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-	padding: 0.5em 0;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
-	padding: 0.5em 0;
-}
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-	margin-top: 0.25em;
-}
-.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
-	color: #cccccc;
-}
-.oo-ui-fieldsetLayout {
-	position: relative;
-	margin: 0;
-	padding: 0;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-	display: block;
-	position: absolute;
-	background-position: center center;
-	background-repeat: no-repeat;
-}
-.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
-	display: inline-block;
-}
-.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
-	margin-top: 2em;
-}
-.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
-	margin-bottom: 0.5em;
-	padding: 0.25em 0;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
-	padding-left: 1.75em;
-	line-height: 1.33em;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-	left: 0;
-	top: 0.25em;
-	width: 2em;
-	height: 2em;
-}
-.oo-ui-gridLayout {
-	position: absolute;
-	top: 0;
-	left: 0;
-	right: 0;
-	bottom: 0;
-}
-.oo-ui-panelLayout {
-	position: relative;
-	padding: 1em 3.35em;
-}
-.oo-ui-panelLayout-scrollable {
-	overflow-y: auto;
-}
-.oo-ui-panelLayout-expanded {
-	position: absolute;
-	top: 0;
-	left: 0;
-	right: 0;
-	bottom: 0;
-}
-.oo-ui-stackLayout > .oo-ui-panelLayout {
-	display: none;
-}
-.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
-	display: block;
-	position: relative;
-}
-.oo-ui-popupTool .oo-ui-popupWidget-popup,
-.oo-ui-popupTool .oo-ui-popupWidget-anchor {
-	z-index: 4;
-}
-.oo-ui-popupTool .oo-ui-popupWidget {
-	margin-left: 1.25em;
-	font-size: 0.8em;
-}
-.oo-ui-toolGroup {
-	display: inline-block;
-	vertical-align: middle;
-	margin: 0.3em;
-}
-.oo-ui-toolGroup-empty {
-	display: none;
-}
-.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-	background-position: center center;
-	background-repeat: no-repeat;
-}
-.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
-.oo-ui-barToolGroup > .oo-ui-labelElement-label {
-	display: none;
-}
-.oo-ui-barToolGroup .oo-ui-tool {
-	display: inline-block;
-	position: relative;
-	vertical-align: top;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link {
-	display: block;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-	display: block;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-	display: none;
-}
-.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-	cursor: default;
-}
-.oo-ui-barToolGroup .oo-ui-tool-title,
-.oo-ui-barToolGroup .oo-ui-tool-accel {
-	display: none;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
-	cursor: pointer;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link {
-	height: 1.5em;
-	padding: 0.25em;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-	height: 1.5em;
-	width: 1.5em;
-}
-.oo-ui-popupToolGroup {
-	position: relative;
-	height: 2em;
-	min-width: 2.5em;
-}
-.oo-ui-popupToolGroup-handle {
-	display: block;
-	cursor: pointer;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-	position: absolute;
-	background-position: center center;
-	background-repeat: no-repeat;
-}
-.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
-	cursor: default;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-	display: none;
-	position: absolute;
-	z-index: 4;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
-	background-repeat: no-repeat;
-	background-position: center center;
-}
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
-	display: block;
-}
-.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
-	left: 0;
-}
-.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
-	right: 0;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-	display: inline-block;
-	vertical-align: middle;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-	display: inline-block;
-	vertical-align: middle;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-accel {
-	display: none;
-}
-.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
-	min-width: 3.5em;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-	top: 0;
-	width: 2em;
-	height: 2em;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
-	right: 0;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-	left: 0.25em;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-	line-height: 2.6em;
-	font-size: 0.8em;
-	margin: 0 1em;
-}
-.oo-ui-popupToolGroup-header {
-	line-height: 2.6em;
-	font-size: 0.8em;
-	margin: 0 0.6em;
-	font-weight: bold;
-}
-.oo-ui-popupToolGroup.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-	margin-left: 3em;
-}
-.oo-ui-popupToolGroup.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-	margin-right: 2.25em;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-	top: 2.3em;
-	margin: 0 -1px;
-	border: solid 1px #dddddd;
-	background-color: white;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-	height: 2em;
-	width: 2em;
-	margin-right: 0.25em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-	line-height: 2em;
-	font-size: 0.8em;
-}
-.oo-ui-listToolGroup .oo-ui-tool {
-	display: inline-block;
-	width: 100%;
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-	display: block;
-	cursor: pointer;
-	white-space: nowrap;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-	cursor: default;
-}
-.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
-	padding: 0.25em;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-	padding-right: 0.5em;
-}
-.oo-ui-menuToolGroup .oo-ui-tool {
-	display: block;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-	display: block;
-	cursor: pointer;
-	white-space: nowrap;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-	cursor: default;
-}
-.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
-	min-width: 8em;
-}
-.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
-	padding: 0.25em 0 0.25em 0;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-	padding: 0 1em 0 0.25em;
-}
-.oo-ui-toolbar {
-	clear: both;
-}
-.oo-ui-toolbar-bar {
-	line-height: 1em;
-}
-.oo-ui-toolbar-actions {
-	float: right;
-}
-.oo-ui-toolbar-tools {
-	display: inline;
-}
-.oo-ui-toolbar-tools,
-.oo-ui-toolbar-actions,
-.oo-ui-toolbar-shadow {
-	-webkit-touch-callout: none;
-	-webkit-user-select: none;
-	   -moz-user-select: none;
-	    -ms-user-select: none;
-	        user-select: none;
-}
-.oo-ui-toolbar-actions .oo-ui-popupWidget {
-	-webkit-touch-callout: default;
-	-webkit-user-select: all;
-	   -moz-user-select: all;
-	    -ms-user-select: all;
-	        user-select: all;
-}
-.oo-ui-toolbar-shadow {
-	background-position: left top;
-	background-repeat: repeat-x;
-	position: absolute;
-	width: 100%;
-	pointer-events: none;
-}
-.oo-ui-toolbar-bar {
-	border-bottom: solid 1px #dddddd;
-	background: white;
-}
-.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
-	border: none;
-	background: none;
-}
-.oo-ui-selectWidget {
-	margin: 0;
-	padding: 0;
-}
-.oo-ui-optionWidget {
-	position: relative;
-	display: block;
-	cursor: pointer;
-	padding: 0.8em 1em 0.8em 3.35em;
-	border: none;
-	font-weight: bold;
-}
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-	cursor: default;
-}
-.oo-ui-optionWidget .oo-ui-labelElement-label {
-	display: block;
-	white-space: nowrap;
-	text-overflow: ellipsis;
-	overflow: hidden;
-}
-.oo-ui-optionWidget .oo-ui-labelElement-label {
-	line-height: 1.5em;
-}
-.oo-ui-optionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
-	padding-right: 1.5em;
-}
-.oo-ui-optionWidget-level-0 {
-	padding-left: 3.5em;
-}
-.oo-ui-optionWidget-level-0 .oo-ui-iconElement-icon {
-	left: 1em;
-}
-.oo-ui-optionWidget-level-1 {
-	padding-left: 5em;
-}
-.oo-ui-optionWidget-level-1 .oo-ui-iconElement-icon {
-	left: 2.5em;
-}
-.oo-ui-optionWidget-level-2 {
-	padding-left: 6.5em;
-}
-.oo-ui-optionWidget-level-2 .oo-ui-iconElement-icon {
-	left: 4em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-	position: absolute;
-	background-repeat: no-repeat;
-	background-position: center center;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-	top: 50%;
-	width: 2em;
-	height: 2em;
-	margin-top: -1em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
-	left: 0.5em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-	right: 0.5em;
-}
-.oo-ui-buttonSelectWidget {
-	display: inline-block;
-	white-space: nowrap;
-}
-.oo-ui-buttonOptionWidget {
-	display: inline-block;
-	padding: 0;
-	background-color: transparent;
-}
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-	position: relative;
-}
-.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-	position: static;
-	display: inline-block;
-	vertical-align: middle;
-}
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-	height: 1.9em;
-}
-.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-	height: 1.9em;
-	margin-top: 0;
-}
-.oo-ui-labelWidget {
-	display: inline-block;
-	padding: 0.5em 0;
-}
-.oo-ui-iconWidget {
-	display: inline-block;
-	vertical-align: middle;
-	background-position: center center;
-	background-repeat: no-repeat;
-	line-height: 2.5em;
-	height: 1.9em;
-	width: 1.9em;
-	opacity: 0.8;
-}
-.oo-ui-iconWidget.oo-ui-widget-disabled {
-	opacity: 0.2;
-}
-.oo-ui-indicatorWidget {
-	display: inline-block;
-	vertical-align: middle;
-	background-position: center center;
-	background-repeat: no-repeat;
-	line-height: 2.5em;
-	height: 1.9em;
-	width: 1.9em;
-	opacity: 0.8;
-}
-.oo-ui-indicatorWidget.oo-ui-widget-disabled {
-	opacity: 0.2;
-}
-.oo-ui-buttonWidget {
-	display: inline-block;
-	vertical-align: middle;
-}
-.oo-ui-buttonGroupWidget {
-	border-radius: 0.3em;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-	border-radius: 0;
-	margin-bottom: -1px;
-	margin-left: -1px;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
-	border-bottom-left-radius: 0.3em;
-	border-top-left-radius: 0.3em;
-	margin-left: 0;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
-	border-bottom-right-radius: 0.3em;
-	border-top-right-radius: 0.3em;
-}
-.oo-ui-toggleSwitchWidget {
-	position: relative;
-	display: inline-block;
-	vertical-align: middle;
-	overflow: hidden;
-	cursor: pointer;
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-	-webkit-transform: translateZ(0px);
-	   -moz-transform: translateZ(0px);
-	    -ms-transform: translateZ(0px);
-	     -o-transform: translateZ(0px);
-	        transform: translateZ(0px);
-	height: 2em;
-	width: 4em;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-	cursor: default;
-}
-.oo-ui-toggleSwitchWidget-grip {
-	position: absolute;
-	display: block;
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-	position: absolute;
-	top: 0;
-	bottom: 0;
-	right: 0;
-	left: 0;
-	-webkit-touch-callout: none;
-	-webkit-user-select: none;
-	   -moz-user-select: none;
-	    -ms-user-select: none;
-	        user-select: none;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-	display: none;
-}
-.oo-ui-toggleSwitchWidget-grip {
-	top: 0.25em;
-	left: 0.25em;
-	width: 1.5em;
-	height: 1.5em;
-	margin-top: -1px;
-	-webkit-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-	   -moz-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-	    -ms-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-	     -o-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-	        transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-}
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-	-webkit-transition: opacity 200ms ease-in-out;
-	   -moz-transition: opacity 200ms ease-in-out;
-	    -ms-transition: opacity 200ms ease-in-out;
-	     -o-transition: opacity 200ms ease-in-out;
-	        transition: opacity 200ms ease-in-out;
-}
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
-	left: 2.25em;
-	margin-left: -2px;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
-	left: 0.25em;
-	margin-left: 0;
-}
-.oo-ui-popupWidget {
-	position: absolute;
-}
-.oo-ui-popupWidget-popup {
-	position: relative;
-	overflow: hidden;
-	z-index: 1;
-}
-.oo-ui-popupWidget-anchor {
-	display: none;
-	z-index: 1;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
-	display: block;
-	position: absolute;
-	top: 0;
-	background-repeat: no-repeat;
-}
-.oo-ui-popupWidget-head {
-	-webkit-touch-callout: none;
-	-webkit-user-select: none;
-	   -moz-user-select: none;
-	    -ms-user-select: none;
-	        user-select: none;
-}
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-	float: right;
-}
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
-	float: left;
-	cursor: default;
-}
-.oo-ui-popupWidget-body {
-	clear: both;
-	overflow: hidden;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
-	margin-top: 7px;
-}
-.oo-ui-popupWidget-head {
-	height: 2.5em;
-}
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-	margin: 0.25em;
-}
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
-	margin: 0.75em 1em;
-}
-.oo-ui-popupWidget-body-padded {
-	padding: 0 1em;
-}
-.oo-ui-popupButtonWidget {
-	position: relative;
-}
-.oo-ui-popupButtonWidget .oo-ui-popupWidget {
-	position: absolute;
-	cursor: auto;
-}
-.oo-ui-lookupInputWidget-menu {
-	background-color: #ffffff;
-}
-.oo-ui-textInputWidget {
-	position: relative;
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-	display: inline-block;
-	width: 100%;
-	resize: none;
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
-	position: absolute;
-	top: 0;
-	height: 100%;
-	background-repeat: no-repeat;
-	cursor: pointer;
-	-webkit-touch-callout: none;
-	-webkit-user-select: none;
-	   -moz-user-select: none;
-	    -ms-user-select: none;
-	        user-select: none;
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
-	left: 0;
-}
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
-	right: 0;
-}
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-	padding: 0.8em 1em;
-}
-.oo-ui-menuWidget {
-	position: absolute;
-	background: white;
-	border: solid 1px #dddddd;
-}
-.oo-ui-menuWidget input {
-	position: absolute;
-	width: 0;
-	height: 0;
-	overflow: hidden;
-	opacity: 0;
-}
-.oo-ui-menuItemWidget {
-	position: relative;
-}
-.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
-	display: none;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-	background-color: transparent;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
-	display: block;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-	background: #347bff;
-	color: #ffffff;
-}
-.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
-	background-size: 24px auto;
-}
-.oo-ui-menuSectionItemWidget {
-	cursor: default;
-	font-weight: normal;
-	color: #777777;
-	border: none;
-}
-.oo-ui-inlineMenuWidget {
-	position: relative;
-	display: inline-block;
-	margin: 0.25em 0;
-	min-width: 20em;
-}
-.oo-ui-inlineMenuWidget-handle {
-	width: 100%;
-	display: inline-block;
-	cursor: pointer;
-	-webkit-touch-callout: none;
-	-webkit-user-select: none;
-	   -moz-user-select: none;
-	    -ms-user-select: none;
-	        user-select: none;
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
-	position: absolute;
-	background-position: center center;
-	background-repeat: no-repeat;
-}
-.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
-	z-index: 1;
-	width: 100%;
-}
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
-	cursor: default;
-}
-.oo-ui-inlineMenuWidget-handle {
-	height: 2.5em;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
-	top: 0;
-	width: 2.5em;
-	height: 2.5em;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
-	right: 0;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
-	left: 0.25em;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
-	line-height: 2.5em;
-	margin: 0 0.5em;
-}
-.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
-	margin-left: 3em;
-}
-.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
-	margin-right: 2em;
-}
-.oo-ui-outlineItemWidget {
-	position: relative;
-	cursor: pointer;
-	-webkit-touch-callout: none;
-	-webkit-user-select: none;
-	   -moz-user-select: none;
-	    -ms-user-select: none;
-	        user-select: none;
-	padding: 0.75em;
-}
-.oo-ui-outlineControlsWidget {
-	height: 3em;
-}
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-	float: left;
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
-	float: left;
-	background-position: right center;
-	background-repeat: no-repeat;
-}
-.oo-ui-outlineControlsWidget-items {
-	float: left;
-}
-.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
-	float: left;
-}
-.oo-ui-outlineControlsWidget-movers {
-	float: right;
-}
-.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
-	float: right;
-}
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-	height: 2em;
-	margin: 0.5em;
-	padding: 0;
-}
-.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
-	width: 1.5em;
-	height: 2em;
-	margin: 0.5em 0 0.5em 0.5em;
-}
-.oo-ui-outlineControlsWidget-items {
-	margin-left: 0;
-}
-.oo-ui-comboBoxWidget {
-	display: inline-block;
-	position: relative;
-}
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
-	width: 100%;
-	z-index: 1;
-}
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
-	min-width: 20em;
-}
-.oo-ui-searchWidget-query {
-	position: absolute;
-	top: 0;
-	left: 0;
-	right: 0;
-}
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-	width: 100%;
-}
-.oo-ui-searchWidget-results {
-	position: absolute;
-	bottom: 0;
-	left: 0;
-	right: 0;
-	overflow-x: hidden;
-	overflow-y: auto;
-}
-.oo-ui-searchWidget-query {
-	height: 4em;
-	padding: 0 1em;
-}
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-	margin: 0.75em 0;
-}
-.oo-ui-searchWidget-results {
-	top: 4em;
-	padding: 1em;
-	line-height: 0;
-}
-.oo-ui-window {
-	line-height: 1em;
-}
-.oo-ui-window-frame {
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-.oo-ui-window-frame > iframe {
-	width: 100%;
-	height: 100%;
-	margin: 0;
-	padding: 0;
-}
-.oo-ui-window-content:focus {
-	outline: none;
-}
-.oo-ui-window-head,
-.oo-ui-window-foot {
-	-webkit-touch-callout: none;
-	-webkit-user-select: none;
-	   -moz-user-select: none;
-	    -ms-user-select: none;
-	        user-select: none;
-}
-.oo-ui-window-body {
-	margin: 0;
-	padding: 0;
-	background: none;
-}
-.oo-ui-window-overlay,
-.oo-ui-window-inner-overlay {
-	position: absolute;
-	top: 0;
-	left: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-head,
-.oo-ui-dialog-content > .oo-ui-window-body,
-.oo-ui-dialog-content > .oo-ui-window-foot {
-	position: absolute;
-	left: 0;
-	right: 0;
-	overflow: hidden;
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-.oo-ui-dialog-content > .oo-ui-window-head {
-	z-index: 1;
-	top: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-body {
-	z-index: 2;
-	top: 0;
-	bottom: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-foot {
-	z-index: 1;
-	bottom: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-inner-overlay {
-	z-index: 3;
-}
-.oo-ui-messageDialog-actions-horizontal {
-	display: table;
-	table-layout: fixed;
-	width: 100%;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-	display: table-cell;
-	width: 1%;
-}
-.oo-ui-messageDialog-actions-vertical {
-	display: block;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-	display: block;
-	overflow: hidden;
-	text-overflow: ellipsis;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget {
-	position: relative;
-	text-align: center;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
-	display: block;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
-	position: relative;
-	top: auto;
-	bottom: auto;
-	display: inline;
-	white-space: nowrap;
-}
-.oo-ui-messageDialog-title,
-.oo-ui-messageDialog-message {
-	display: block;
-	text-align: center;
-	padding-top: 0.5em;
-}
-.oo-ui-messageDialog-title {
-	font-size: 1.5em;
-	line-height: 1em;
-	color: #000000;
-}
-.oo-ui-messageDialog-message {
-	font-size: 0.9em;
-	line-height: 1.25em;
-	color: #666666;
-}
-.oo-ui-messageDialog-message-verbose {
-	font-size: 1.1em;
-	line-height: 1.5em;
-	text-align: left;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-	border-right: solid 1px #e5e5e5;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
-	border-right-width: 0;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-	border-bottom: solid 1px #e5e5e5;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
-	border-bottom-width: 0;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
-	text-align: center;
-	line-height: 3.4em;
-	padding: 0 2em;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
-	background-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
-	background-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
-	background-color: rgba(8, 126, 204, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
-	background-color: rgba(8, 126, 204, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
-	font-weight: bold;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
-	background-color: rgba(118, 171, 54, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
-	background-color: rgba(118, 171, 54, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
-	background-color: rgba(212, 83, 83, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
-	background-color: rgba(212, 83, 83, 0.1);
-}
-.oo-ui-processDialog-location {
-	overflow: hidden;
-	text-overflow: ellipsis;
-	white-space: nowrap;
-}
-.oo-ui-processDialog-title {
-	display: inline;
-	padding: 0;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
-	white-space: nowrap;
-}
-.oo-ui-processDialog-actions-safe,
-.oo-ui-processDialog-actions-primary {
-	position: absolute;
-	top: 0;
-	bottom: 0;
-}
-.oo-ui-processDialog-actions-safe {
-	left: 0;
-}
-.oo-ui-processDialog-actions-primary {
-	right: 0;
-}
-.oo-ui-processDialog-errors {
-	display: none;
-	position: absolute;
-	top: 0;
-	left: 0;
-	right: 0;
-	bottom: 0;
-	z-index: 2;
-	overflow-x: hidden;
-	overflow-y: auto;
-}
-.oo-ui-processDialog-content .oo-ui-window-head {
-	height: 3.35em;
-	border-bottom: 1px solid #dddddd;
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-.oo-ui-processDialog-content .oo-ui-window-body {
-	top: 3.35em;
-	padding: 2em 0;
-}
-.oo-ui-processDialog-navigation {
-	position: relative;
-	height: 3.35em;
-	padding: 0 1em;
-}
-.oo-ui-processDialog-location {
-	padding: 0.75em 0;
-	height: 1.85em;
-	cursor: default;
-	text-align: center;
-}
-.oo-ui-processDialog-title {
-	font-weight: bold;
-	line-height: 1.85em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonElement-button {
-	padding: 0.35em 0.75em;
-	min-width: 1.85em;
-	min-height: 1.85em;
-	border: 1px solid #dddddd;
-	border-radius: 4px;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labelElement-label {
-	line-height: 1.85em;
-	padding: 0 1em;
-	font-weight: bold;
-	color: #777777;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconElement-icon {
-	position: absolute;
-	margin-top: -0.125em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-	vertical-align: middle;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button {
-	border: 1px solid transparent;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label {
-	color: #d11d13;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button {
-	padding: 0.75em 0.35em;
-	border: none;
-	border-radius: 0;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-buttonElement-button {
-	background-color: #347bff;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
-	color: #ffffff;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-	left: 0.5em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
-	padding-left: 2.25em;
-}
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-	right: 0.5em;
-}
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
-	padding-right: 2.25em;
-}
-.oo-ui-processDialog-actions-other {
-	position: absolute;
-	bottom: 1em;
-}
-.oo-ui-processDialog > .oo-ui-window-frame {
-	min-height: 5em;
-}
-.oo-ui-processDialog-errors {
-	background-color: rgba(255, 255, 255, 0.9);
-	padding: 3em 3em 1.5em 3em;
-	text-align: center;
-}
-.oo-ui-processDialog-errors .oo-ui-buttonWidget {
-	margin: 2em 1em 2em 1em;
-}
-.oo-ui-processDialog-errors-title {
-	font-size: 1.5em;
-	color: #000000;
-	margin-bottom: 2em;
-}
-.oo-ui-processDialog-error {
-	text-align: left;
-	margin: 1em;
-	padding: 1em;
-	border: solid 1px #ff9e9e;
-	background-color: #fff7f7;
-	border-radius: 0.25em;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-	position: fixed;
-	width: 0;
-	height: 0;
-	overflow: hidden;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
-	width: auto;
-	height: auto;
-	top: 0;
-	right: 0;
-	bottom: 0;
-	left: 0;
-	padding: 1em;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
-	position: absolute;
-	right: 0;
-	left: 0;
-	margin: auto;
-	overflow: hidden;
-	max-width: 100%;
-	max-height: 100%;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
-	width: 100%;
-	height: 100%;
-}
-.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
-	width: 100%;
-	height: 100%;
-	top: 0;
-	bottom: 0;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-	background-color: rgba(255, 255, 255, 0.5);
-	opacity: 0;
-	-webkit-transition: opacity 250ms ease-in-out;
-	   -moz-transition: opacity 250ms ease-in-out;
-	    -ms-transition: opacity 250ms ease-in-out;
-	     -o-transition: opacity 250ms ease-in-out;
-	        transition: opacity 250ms ease-in-out;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
-	top: 0;
-	bottom: 0;
-	background-color: #ffffff;
-	-webkit-transform: translate3d(0, -200%, 0);
-	   -moz-transform: translate3d(0, -200%, 0);
-	    -ms-transform: translate3d(0, -200%, 0);
-	     -o-transform: translate3d(0, -200%, 0);
-	        transform: translate3d(0, -200%, 0);
-	-webkit-transition: transform 250ms ease-in-out;
-	   -moz-transition: transform 250ms ease-in-out;
-	    -ms-transition: transform 250ms ease-in-out;
-	     -o-transition: transform 250ms ease-in-out;
-	        transition: transform 250ms ease-in-out;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
-	opacity: 1;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
-	-webkit-transform: translate3d(0, 0, 0);
-	   -moz-transform: translate3d(0, 0, 0);
-	    -ms-transform: translate3d(0, 0, 0);
-	     -o-transform: translate3d(0, 0, 0);
-	        transform: translate3d(0, 0, 0);
-}
-.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
-	border: solid 1px #cccccc;
-	border-radius: 0.5em;
-	box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
-}
-
-.oo-ui-icon-check {
-	background-image: /* @embed */ url(themes/minerva/images/icons/check.png);
-}
-.oo-ui-image-invert .oo-ui-icon-check,
-.oo-ui-image-invert.oo-ui-icon-check {
-	background-image: /* @embed */ url(themes/minerva/images/icons/check-invert.png);
-}
diff --git a/resources/lib/oojs-ui/oojs-ui-minerva.js b/resources/lib/oojs-ui/oojs-ui-minerva.js
deleted file mode 100644
index 11b03f68a9..0000000000
--- a/resources/lib/oojs-ui/oojs-ui-minerva.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/*!
- * OOjs UI v0.1.0-pre (1829141230)
- * https://www.mediawiki.org/wiki/OOjs_UI
- *
- * Copyright 2011–2014 OOjs Team and other contributors.
- * Released under the MIT license
- * http://oojs.mit-license.org
- *
- * Date: 2014-10-15T22:49:59Z
- */
-/* Instantiation */
-
-OO.ui.theme = new OO.ui.Theme();
diff --git a/resources/lib/oojs-ui/oojs-ui-minerva.rtl.css b/resources/lib/oojs-ui/oojs-ui-minerva.rtl.css
deleted file mode 100644
index e452952a02..0000000000
--- a/resources/lib/oojs-ui/oojs-ui-minerva.rtl.css
+++ /dev/null
@@ -1,1381 +0,0 @@
-/*!
- * OOjs UI v0.1.0
- * https://www.mediawiki.org/wiki/OOjs_UI
- *
- * Copyright 2011–2014 OOjs Team and other contributors.
- * Released under the MIT license
- * http://oojs.mit-license.org
- *
- * Date: 2014-09-11T19:39:50Z
- */
-/*
- * Blank theme mixins.
- *
- * Base styles invoke these mixins at the end of their definitions. Override these mixins to add
- * additional rules to the base styles.
- */
-/*
- * Base styles.
- *
- * Themes should include this file after defining their variables and mixins.
- */
-/* @noflip */
-.oo-ui-rtl {
-  direction: rtl;
-}
-/* @noflip */
-.oo-ui-ltr {
-  direction: ltr;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button {
-  cursor: pointer;
-  display: inline-block;
-  vertical-align: middle;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  display: none;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-  display: none;
-}
-.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
-  cursor: default;
-}
-.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  display: inline-block;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-buttonElement-frameless {
-  display: inline-block;
-  position: relative;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-  display: inline-block;
-  vertical-align: top;
-  text-align: center;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-  cursor: default;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  margin-right: 0;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-  margin-left: -0.75em;
-}
-.oo-ui-buttonElement.oo-ui-indicatorElement .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  width: 3.35em;
-  height: 3.35em;
-  background-size: 2em auto;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  margin-right: 0.25em;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  line-height: 1.9em;
-}
-.oo-ui-clippableElement-clippable {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
-  overflow-y: hidden;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-  width: 100%;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
-  padding: 2em;
-}
-.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 3em;
-  overflow-y: auto;
-}
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-  position: absolute;
-  bottom: 0;
-  right: 0;
-  left: 0;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-  padding: 0 0 1em;
-}
-.oo-ui-fieldLayout {
-  margin-bottom: 1em;
-}
-.oo-ui-fieldLayout:before,
-.oo-ui-fieldLayout:after {
-  content: " ";
-  display: table;
-}
-.oo-ui-fieldLayout:after {
-  clear: both;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-  display: block;
-  float: right;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-  display: block;
-  float: right;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-  text-align: left;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
-  display: inline-block;
-}
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
-  z-index: 1;
-}
-.oo-ui-fieldLayout:last-child {
-  margin-bottom: 0;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-  padding-top: 0.5em;
-  margin-left: 5%;
-  width: 35%;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-  width: 60%;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
-  padding: 0.75em 0.5em 0.5em 0.5em;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-  padding: 0.5em 0;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
-  padding: 0.5em 0;
-}
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  margin-top: 0.25em;
-}
-.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
-  color: #ccc;
-}
-.oo-ui-fieldsetLayout {
-  position: relative;
-  margin: 0;
-  padding: 0;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-  display: block;
-  position: absolute;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
-  display: inline-block;
-}
-.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
-  margin-top: 2em;
-}
-.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
-  margin-bottom: 0.5em;
-  padding: 0.25em 0;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
-  padding-right: 1.75em;
-  line-height: 1.33em;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-  right: 0;
-  top: 0.25em;
-  width: 2em;
-  height: 2em;
-}
-.oo-ui-gridLayout {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 0;
-}
-.oo-ui-panelLayout {
-  position: relative;
-  padding: 1em 3.35em;
-}
-.oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-.oo-ui-panelLayout-expanded {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 0;
-}
-.oo-ui-stackLayout > .oo-ui-panelLayout {
-  display: none;
-}
-.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
-  display: block;
-  position: relative;
-}
-.oo-ui-popupTool .oo-ui-popupWidget-popup,
-.oo-ui-popupTool .oo-ui-popupWidget-anchor {
-  z-index: 4;
-}
-.oo-ui-popupTool .oo-ui-popupWidget {
-  margin-right: 1.25em;
-  font-size: 0.8em;
-}
-.oo-ui-toolGroup {
-  display: inline-block;
-  vertical-align: middle;
-  margin: 0.3em;
-}
-.oo-ui-toolGroup-empty {
-  display: none;
-}
-.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
-.oo-ui-barToolGroup > .oo-ui-labelElement-label {
-  display: none;
-}
-.oo-ui-barToolGroup .oo-ui-tool {
-  display: inline-block;
-  position: relative;
-  vertical-align: top;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link {
-  display: block;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  display: block;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  display: none;
-}
-.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-.oo-ui-barToolGroup .oo-ui-tool-title,
-.oo-ui-barToolGroup .oo-ui-tool-accel {
-  display: none;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
-  cursor: pointer;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link {
-  height: 1.5em;
-  padding: 0.25em;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  height: 1.5em;
-  width: 1.5em;
-}
-.oo-ui-popupToolGroup {
-  position: relative;
-  height: 2em;
-  min-width: 2.5em;
-}
-.oo-ui-popupToolGroup-handle {
-  display: block;
-  cursor: pointer;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-  position: absolute;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
-  cursor: default;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-  display: none;
-  position: absolute;
-  z-index: 4;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
-  background-repeat: no-repeat;
-  background-position: center center;
-}
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
-  display: block;
-}
-.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
-  right: 0;
-}
-.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
-  left: 0;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-accel {
-  display: none;
-}
-.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
-  min-width: 3.5em;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-  top: 0;
-  width: 2em;
-  height: 2em;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
-  left: 0;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-  right: 0.25em;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-  line-height: 2.6em;
-  font-size: 0.8em;
-  margin: 0 1em;
-}
-.oo-ui-popupToolGroup-header {
-  line-height: 2.6em;
-  font-size: 0.8em;
-  margin: 0 0.6em;
-  font-weight: bold;
-}
-.oo-ui-popupToolGroup.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-  margin-right: 3em;
-}
-.oo-ui-popupToolGroup.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-  margin-left: 2.25em;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-  top: 2.3em;
-  margin: 0 -1px;
-  border: solid 1px #dddddd;
-  background-color: white;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  height: 2em;
-  width: 2em;
-  margin-left: 0.25em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  line-height: 2em;
-  font-size: 0.8em;
-}
-.oo-ui-listToolGroup .oo-ui-tool {
-  display: inline-block;
-  width: 100%;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-  display: block;
-  cursor: pointer;
-  white-space: nowrap;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
-  padding: 0.25em;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-  padding-left: 0.5em;
-}
-.oo-ui-menuToolGroup .oo-ui-tool {
-  display: block;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-  display: block;
-  cursor: pointer;
-  white-space: nowrap;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  background-image: none;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
-  background-image: /* @embed */ url(images/icons/check.svg);
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
-  min-width: 8em;
-}
-.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
-  padding: 0.25em 0 0.25em 0;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-  padding: 0 0.25em 0 1em;
-}
-.oo-ui-toolbar {
-  clear: both;
-}
-.oo-ui-toolbar-bar {
-  line-height: 1em;
-}
-.oo-ui-toolbar-actions {
-  float: left;
-}
-.oo-ui-toolbar-tools {
-  display: inline;
-}
-.oo-ui-toolbar-tools,
-.oo-ui-toolbar-actions,
-.oo-ui-toolbar-shadow {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-toolbar-actions .oo-ui-popupWidget {
-  -webkit-touch-callout: default;
-  -webkit-user-select: all;
-  -moz-user-select: all;
-  -ms-user-select: all;
-  user-select: all;
-}
-.oo-ui-toolbar-shadow {
-  background-position: right top;
-  background-repeat: repeat-x;
-  position: absolute;
-  width: 100%;
-  pointer-events: none;
-}
-.oo-ui-toolbar-bar {
-  border-bottom: solid 1px #dddddd;
-  background: white;
-}
-.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
-  border: none;
-  background: none;
-}
-.oo-ui-selectWidget {
-  margin: 0;
-  padding: 0;
-}
-.oo-ui-optionWidget {
-  position: relative;
-  display: block;
-  cursor: pointer;
-  padding: 0.8em 3.35em 0.8em 1em;
-  border: none;
-  font-weight: bold;
-}
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-  cursor: default;
-}
-.oo-ui-optionWidget .oo-ui-labelElement-label {
-  display: block;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-.oo-ui-optionWidget .oo-ui-labelElement-label {
-  line-height: 1.5em;
-}
-.oo-ui-optionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
-  padding-left: 1.5em;
-}
-.oo-ui-optionWidget-level-0 {
-  padding-right: 3.5em;
-}
-.oo-ui-optionWidget-level-0 .oo-ui-iconElement-icon {
-  right: 1em;
-}
-.oo-ui-optionWidget-level-1 {
-  padding-right: 5em;
-}
-.oo-ui-optionWidget-level-1 .oo-ui-iconElement-icon {
-  right: 2.5em;
-}
-.oo-ui-optionWidget-level-2 {
-  padding-right: 6.5em;
-}
-.oo-ui-optionWidget-level-2 .oo-ui-iconElement-icon {
-  right: 4em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-  position: absolute;
-  background-repeat: no-repeat;
-  background-position: center center;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-  top: 50%;
-  width: 2em;
-  height: 2em;
-  margin-top: -1em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
-  right: 0.5em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-  left: 0.5em;
-}
-.oo-ui-buttonSelectWidget {
-  display: inline-block;
-  white-space: nowrap;
-}
-.oo-ui-buttonOptionWidget {
-  display: inline-block;
-  padding: 0;
-  background-color: transparent;
-}
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-  position: relative;
-}
-.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  position: static;
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-  height: 1.9em;
-}
-.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  height: 1.9em;
-  margin-top: 0;
-}
-.oo-ui-labelWidget {
-  display: inline-block;
-  padding: 0.5em 0;
-}
-.oo-ui-iconWidget {
-  display: inline-block;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-  line-height: 2.5em;
-  height: 1.9em;
-  width: 1.9em;
-  opacity: 0.8;
-}
-.oo-ui-iconWidget.oo-ui-widget-disabled {
-  opacity: 0.2;
-}
-.oo-ui-indicatorWidget {
-  display: inline-block;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-  line-height: 2.5em;
-  height: 1.9em;
-  width: 1.9em;
-  opacity: 0.8;
-}
-.oo-ui-indicatorWidget.oo-ui-widget-disabled {
-  opacity: 0.2;
-}
-.oo-ui-buttonWidget {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-buttonGroupWidget {
-  border-radius: 0.3em;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-  border-radius: 0;
-  margin-bottom: -1px;
-  margin-right: -1px;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
-  border-bottom-right-radius: 0.3em;
-  border-top-right-radius: 0.3em;
-  margin-right: 0;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
-  border-bottom-left-radius: 0.3em;
-  border-top-left-radius: 0.3em;
-}
-.oo-ui-toggleSwitchWidget {
-  position: relative;
-  display: inline-block;
-  vertical-align: middle;
-  overflow: hidden;
-  cursor: pointer;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  -webkit-transform: translateZ(0px);
-  -moz-transform: translateZ(0px);
-  -ms-transform: translateZ(0px);
-  -o-transform: translateZ(0px);
-  transform: translateZ(0px);
-  height: 2em;
-  width: 4em;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-  cursor: default;
-}
-.oo-ui-toggleSwitchWidget-grip {
-  position: absolute;
-  display: block;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  right: 0;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-  display: none;
-}
-.oo-ui-toggleSwitchWidget-grip {
-  top: 0.25em;
-  right: 0.25em;
-  width: 1.5em;
-  height: 1.5em;
-  margin-top: -1px;
-  -webkit-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-  -moz-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-  -ms-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-  -o-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-  transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-}
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-  -webkit-transition: opacity 200ms ease-in-out;
-  -moz-transition: opacity 200ms ease-in-out;
-  -ms-transition: opacity 200ms ease-in-out;
-  -o-transition: opacity 200ms ease-in-out;
-  transition: opacity 200ms ease-in-out;
-}
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
-  right: 2.25em;
-  margin-right: -2px;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
-  right: 0.25em;
-  margin-right: 0;
-}
-.oo-ui-popupWidget-popup {
-  position: absolute;
-  overflow: hidden;
-  z-index: 1;
-}
-.oo-ui-popupWidget-anchor {
-  display: none;
-  z-index: 1;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
-  display: block;
-  position: absolute;
-  background-repeat: no-repeat;
-}
-.oo-ui-popupWidget-head {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-  float: left;
-}
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
-  float: right;
-  cursor: default;
-}
-.oo-ui-popupWidget-body {
-  clear: both;
-  overflow: hidden;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
-  margin-top: 7px;
-}
-.oo-ui-popupWidget-head {
-  height: 2.5em;
-}
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-  margin: 0.25em;
-}
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
-  margin: 0.75em 1em;
-}
-.oo-ui-popupWidget-body-padded {
-  padding: 0 1em;
-}
-.oo-ui-popupButtonWidget {
-  position: relative;
-}
-.oo-ui-popupButtonWidget .oo-ui-popupWidget {
-  position: absolute;
-  right: 1em;
-  cursor: auto;
-}
-.oo-ui-lookupInputWidget-menu {
-  background-color: #fff;
-}
-.oo-ui-textInputWidget {
-  position: relative;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-  display: inline-block;
-  width: 100%;
-  resize: none;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
-  position: absolute;
-  top: 0;
-  height: 100%;
-  background-repeat: no-repeat;
-  cursor: pointer;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
-  right: 0;
-}
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
-  left: 0;
-}
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-  padding: .8em 1em;
-}
-.oo-ui-menuWidget {
-  position: absolute;
-  background: white;
-  border: solid 1px #dddddd;
-}
-.oo-ui-menuWidget input {
-  position: absolute;
-  width: 0;
-  height: 0;
-  overflow: hidden;
-  opacity: 0;
-}
-.oo-ui-menuItemWidget {
-  position: relative;
-}
-.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
-  display: none;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-  background-color: transparent;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
-  display: block;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-  background: #347bff;
-  color: #ffffff;
-}
-.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
-  background-size: 24px auto;
-}
-.oo-ui-menuSectionItemWidget {
-  cursor: default;
-  font-weight: normal;
-  color: #777777;
-  border: none;
-}
-.oo-ui-inlineMenuWidget {
-  position: relative;
-  display: inline-block;
-  margin: 0.25em 0;
-  min-width: 20em;
-}
-.oo-ui-inlineMenuWidget-handle {
-  width: 100%;
-  display: inline-block;
-  cursor: pointer;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
-  position: absolute;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
-  z-index: 1;
-  width: 100%;
-}
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
-  cursor: default;
-}
-.oo-ui-inlineMenuWidget-handle {
-  height: 2.5em;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
-  top: 0;
-  width: 2.5em;
-  height: 2.5em;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
-  left: 0;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
-  right: 0.25em;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
-  line-height: 2.5em;
-  margin: 0 0.5em;
-}
-.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
-  margin-right: 3em;
-}
-.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
-  margin-left: 2em;
-}
-.oo-ui-outlineItemWidget {
-  position: relative;
-  cursor: pointer;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  padding: 0.75em;
-}
-.oo-ui-outlineControlsWidget {
-  height: 3em;
-}
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-  float: right;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
-  float: right;
-  background-position: left center;
-  background-repeat: no-repeat;
-}
-.oo-ui-outlineControlsWidget-items {
-  float: right;
-}
-.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
-  float: right;
-}
-.oo-ui-outlineControlsWidget-movers {
-  float: left;
-}
-.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
-  float: left;
-}
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-  height: 2em;
-  margin: 0.5em;
-  padding: 0;
-}
-.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
-  width: 1.5em;
-  height: 2em;
-  margin: 0.5em 0.5em 0.5em 0;
-}
-.oo-ui-outlineControlsWidget-items {
-  margin-right: 0;
-}
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
-  z-index: 1;
-}
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget > .oo-ui-selectWidget {
-  min-width: 20em;
-}
-.oo-ui-searchWidget-query {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-}
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-  width: 100%;
-}
-.oo-ui-searchWidget-results {
-  position: absolute;
-  bottom: 0;
-  right: 0;
-  left: 0;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-.oo-ui-searchWidget-query {
-  height: 4em;
-  padding: 0 1em;
-}
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-  margin: 0.75em 0;
-}
-.oo-ui-searchWidget-results {
-  top: 4em;
-  padding: 1em;
-  line-height: 0;
-}
-.oo-ui-window {
-  line-height: 1em;
-  /* Content div takes focus when opened, so hide outline */
-}
-.oo-ui-window-frame {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-window-frame > iframe {
-  width: 100%;
-  height: 100%;
-  margin: 0;
-  padding: 0;
-}
-.oo-ui-window-content:focus {
-  outline: none;
-}
-.oo-ui-window-head,
-.oo-ui-window-foot {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-window-body {
-  margin: 0;
-  padding: 0;
-  background: none;
-}
-.oo-ui-window-overlay {
-  position: absolute;
-  top: 0;
-  right: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-head,
-.oo-ui-dialog-content > .oo-ui-window-body,
-.oo-ui-dialog-content > .oo-ui-window-foot {
-  position: absolute;
-  right: 0;
-  left: 0;
-  overflow: hidden;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-dialog-content > .oo-ui-window-head {
-  z-index: 1;
-  top: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-body {
-  z-index: 2;
-  top: 0;
-  bottom: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-foot {
-  z-index: 1;
-  bottom: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-overlay {
-  z-index: 3;
-}
-.oo-ui-messageDialog-actions-horizontal {
-  display: table;
-  table-layout: fixed;
-  width: 100%;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-  display: table-cell;
-  width: 1%;
-}
-.oo-ui-messageDialog-actions-vertical {
-  display: block;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-  display: block;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget {
-  position: relative;
-  text-align: center;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
-  display: block;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
-  position: relative;
-  top: auto;
-  bottom: auto;
-  display: inline;
-  white-space: nowrap;
-}
-.oo-ui-messageDialog-title,
-.oo-ui-messageDialog-message {
-  display: block;
-  text-align: center;
-  padding-top: 0.5em;
-}
-.oo-ui-messageDialog-title {
-  font-size: 1.5em;
-  line-height: 1em;
-  color: #000;
-}
-.oo-ui-messageDialog-message {
-  font-size: 0.9em;
-  line-height: 1.25em;
-  color: #666;
-}
-.oo-ui-messageDialog-message-verbose {
-  font-size: 1.1em;
-  line-height: 1.5em;
-  text-align: right;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-  border-left: solid 1px #e5e5e5;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
-  border-left-width: 0;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-  border-bottom: solid 1px #e5e5e5;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
-  border-bottom-width: 0;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
-  text-align: center;
-  line-height: 3.4em;
-  padding: 0 2em;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
-  background-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
-  background-color: rgba(8, 126, 204, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
-  background-color: rgba(8, 126, 204, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
-  font-weight: bold;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
-  background-color: rgba(118, 171, 54, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
-  background-color: rgba(118, 171, 54, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
-  background-color: rgba(212, 83, 83, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
-  background-color: rgba(212, 83, 83, 0.1);
-}
-.oo-ui-processDialog-location {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-.oo-ui-processDialog-title {
-  display: inline;
-  padding: 0;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
-  white-space: nowrap;
-}
-.oo-ui-processDialog-actions-safe,
-.oo-ui-processDialog-actions-primary {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-}
-.oo-ui-processDialog-actions-safe {
-  right: 0;
-}
-.oo-ui-processDialog-actions-primary {
-  left: 0;
-}
-.oo-ui-processDialog-errors {
-  display: none;
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 0;
-  z-index: 2;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-.oo-ui-processDialog-content .oo-ui-window-head {
-  height: 3.35em;
-  border-bottom: 1px solid #dddddd;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-processDialog-content .oo-ui-window-body {
-  top: 3.35em;
-  padding: 2em 0;
-}
-.oo-ui-processDialog-navigation {
-  position: relative;
-  height: 3.35em;
-  padding: 0 1em;
-}
-.oo-ui-processDialog-location {
-  padding: 0.75em 0;
-  height: 1.85em;
-  cursor: default;
-  text-align: center;
-}
-.oo-ui-processDialog-title {
-  font-weight: bold;
-  line-height: 1.85em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonElement-button {
-  padding: 0.35em 0.75em;
-  min-width: 1.85em;
-  min-height: 1.85em;
-  border: 1px solid #dddddd;
-  border-radius: 4px;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labelElement-label {
-  line-height: 1.85em;
-  padding: 0 1em;
-  font-weight: bold;
-  color: #777777;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconElement-icon {
-  position: absolute;
-  margin-top: -0.125em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-  vertical-align: middle;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button {
-  border: 1px solid transparent;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label {
-  color: #d11d13;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button {
-  padding: 0.75em 0.35em;
-  border: none;
-  border-radius: 0;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-buttonElement-button {
-  background-color: #347bff;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
-  color: #ffffff;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-  right: 0.5em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
-  padding-right: 2.25em;
-}
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-  left: 0.5em;
-}
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
-  padding-left: 2.25em;
-}
-.oo-ui-processDialog-actions-other {
-  position: absolute;
-  bottom: 1em;
-}
-.oo-ui-processDialog > .oo-ui-window-frame {
-  min-height: 5em;
-}
-.oo-ui-processDialog-errors {
-  background-color: rgba(255, 255, 255, 0.9);
-  padding: 3em 3em 1.5em 3em;
-  text-align: center;
-}
-.oo-ui-processDialog-errors .oo-ui-buttonWidget {
-  margin: 2em 1em 2em 1em;
-}
-.oo-ui-processDialog-errors-title {
-  font-size: 1.5em;
-  color: #000;
-  margin-bottom: 2em;
-}
-.oo-ui-processDialog-error {
-  text-align: right;
-  margin: 1em;
-  padding: 1em;
-  border: solid 1px #ff9e9e;
-  background-color: #fff7f7;
-  border-radius: 0.25em;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-  position: fixed;
-  width: 0;
-  height: 0;
-  overflow: hidden;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
-  width: auto;
-  height: auto;
-  top: 0;
-  left: 0;
-  bottom: 0;
-  right: 0;
-  padding: 1em;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
-  position: fixed;
-  left: 0;
-  right: 0;
-  margin: auto;
-  overflow: hidden;
-  max-width: 100%;
-  max-height: 100%;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
-  width: 100%;
-  height: 100%;
-}
-.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
-  width: 100%;
-  height: 100%;
-  top: 0;
-  bottom: 0;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-  background-color: rgba(255, 255, 255, 0.5);
-  opacity: 0;
-  -webkit-transition: opacity 250ms ease-in-out;
-  -moz-transition: opacity 250ms ease-in-out;
-  -ms-transition: opacity 250ms ease-in-out;
-  -o-transition: opacity 250ms ease-in-out;
-  transition: opacity 250ms ease-in-out;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
-  top: 0;
-  bottom: 0;
-  background-color: #fff;
-  -webkit-transform: translate3d(0, -200%, 0);
-  -moz-transform: translate3d(0, -200%, 0);
-  -ms-transform: translate3d(0, -200%, 0);
-  -o-transform: translate3d(0, -200%, 0);
-  transform: translate3d(0, -200%, 0);
-  -webkit-transition: transform 250ms ease-in-out;
-  -moz-transition: transform 250ms ease-in-out;
-  -ms-transition: transform 250ms ease-in-out;
-  -o-transition: transform 250ms ease-in-out;
-  transition: transform 250ms ease-in-out;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
-  opacity: 1;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
-  -webkit-transform: translate3d(0, 0, 0);
-  -moz-transform: translate3d(0, 0, 0);
-  -ms-transform: translate3d(0, 0, 0);
-  -o-transform: translate3d(0, 0, 0);
-  transform: translate3d(0, 0, 0);
-}
-.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
-  border: solid 1px #ccc;
-  border-radius: 0.5em;
-  box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
-}
-
-/*
- * Blank theme mixins.
- *
- * Base styles invoke these mixins at the end of their definitions. Override these mixins to add
- * additional rules to the base styles.
- */
-.oo-ui-icon-check {
-  background-image: /* @embed */ url(themes/minerva/images/icons/check.png);
-  background: #347bff;
-}
diff --git a/resources/lib/oojs-ui/oojs-ui-minerva.svg.css b/resources/lib/oojs-ui/oojs-ui-minerva.svg.css
deleted file mode 100644
index bb793c8cf6..0000000000
--- a/resources/lib/oojs-ui/oojs-ui-minerva.svg.css
+++ /dev/null
@@ -1,1375 +0,0 @@
-/*!
- * OOjs UI v0.1.0-pre (1829141230)
- * https://www.mediawiki.org/wiki/OOjs_UI
- *
- * Copyright 2011–2014 OOjs Team and other contributors.
- * Released under the MIT license
- * http://oojs.mit-license.org
- *
- * Date: 2014-10-15T22:50:09Z
- */
-/* @noflip */
-.oo-ui-rtl {
-	direction: rtl;
-}
-/* @noflip */
-.oo-ui-ltr {
-	direction: ltr;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button {
-	cursor: pointer;
-	display: inline-block;
-	vertical-align: middle;
-	-webkit-touch-callout: none;
-	-webkit-user-select: none;
-	   -moz-user-select: none;
-	    -ms-user-select: none;
-	        user-select: none;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-	display: none;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-	display: none;
-}
-.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
-	cursor: default;
-}
-.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-	display: inline-block;
-	vertical-align: middle;
-	background-position: center center;
-	background-repeat: no-repeat;
-}
-.oo-ui-buttonElement-frameless {
-	display: inline-block;
-	position: relative;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-	display: inline-block;
-	vertical-align: middle;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-	display: inline-block;
-	vertical-align: top;
-	text-align: center;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-	display: inline-block;
-	vertical-align: middle;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-	cursor: default;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-	margin-left: 0;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-	margin-right: -0.75em;
-}
-.oo-ui-buttonElement.oo-ui-indicatorElement .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-	width: 3.35em;
-	height: 3.35em;
-	background-size: 2em auto;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-	margin-left: 0.25em;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-	line-height: 1.9em;
-}
-.oo-ui-clippableElement-clippable {
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
-	overflow-y: hidden;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-	width: 100%;
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
-	overflow-y: auto;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
-	padding: 2em;
-}
-.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
-	position: absolute;
-	top: 0;
-	left: 0;
-	right: 0;
-	bottom: 3em;
-	overflow-y: auto;
-}
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-	position: absolute;
-	bottom: 0;
-	left: 0;
-	right: 0;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-	padding: 0 0 1em;
-}
-.oo-ui-fieldLayout {
-	margin-bottom: 1em;
-}
-.oo-ui-fieldLayout:before,
-.oo-ui-fieldLayout:after {
-	content: " ";
-	display: table;
-}
-.oo-ui-fieldLayout:after {
-	clear: both;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-	display: block;
-	float: left;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-	display: block;
-	float: left;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-	text-align: right;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
-	display: inline-block;
-	vertical-align: middle;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-	display: inline-block;
-	vertical-align: middle;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
-	display: inline-block;
-}
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
-	z-index: 1;
-}
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
-	float: right;
-}
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
-	padding: 0.5em 0.75em;
-}
-.oo-ui-fieldLayout:last-child {
-	margin-bottom: 0;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-	padding-top: 0.5em;
-	margin-right: 5%;
-	width: 35%;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-	width: 60%;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
-	padding: 0.75em 0.5em 0.5em 0.5em;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-	padding: 0.5em 0;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
-	padding: 0.5em 0;
-}
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-	margin-top: 0.25em;
-}
-.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
-	color: #cccccc;
-}
-.oo-ui-fieldsetLayout {
-	position: relative;
-	margin: 0;
-	padding: 0;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-	display: block;
-	position: absolute;
-	background-position: center center;
-	background-repeat: no-repeat;
-}
-.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
-	display: inline-block;
-}
-.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
-	margin-top: 2em;
-}
-.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
-	margin-bottom: 0.5em;
-	padding: 0.25em 0;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
-	padding-left: 1.75em;
-	line-height: 1.33em;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-	left: 0;
-	top: 0.25em;
-	width: 2em;
-	height: 2em;
-}
-.oo-ui-gridLayout {
-	position: absolute;
-	top: 0;
-	left: 0;
-	right: 0;
-	bottom: 0;
-}
-.oo-ui-panelLayout {
-	position: relative;
-	padding: 1em 3.35em;
-}
-.oo-ui-panelLayout-scrollable {
-	overflow-y: auto;
-}
-.oo-ui-panelLayout-expanded {
-	position: absolute;
-	top: 0;
-	left: 0;
-	right: 0;
-	bottom: 0;
-}
-.oo-ui-stackLayout > .oo-ui-panelLayout {
-	display: none;
-}
-.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
-	display: block;
-	position: relative;
-}
-.oo-ui-popupTool .oo-ui-popupWidget-popup,
-.oo-ui-popupTool .oo-ui-popupWidget-anchor {
-	z-index: 4;
-}
-.oo-ui-popupTool .oo-ui-popupWidget {
-	margin-left: 1.25em;
-	font-size: 0.8em;
-}
-.oo-ui-toolGroup {
-	display: inline-block;
-	vertical-align: middle;
-	margin: 0.3em;
-}
-.oo-ui-toolGroup-empty {
-	display: none;
-}
-.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-	background-position: center center;
-	background-repeat: no-repeat;
-}
-.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
-.oo-ui-barToolGroup > .oo-ui-labelElement-label {
-	display: none;
-}
-.oo-ui-barToolGroup .oo-ui-tool {
-	display: inline-block;
-	position: relative;
-	vertical-align: top;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link {
-	display: block;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-	display: block;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-	display: none;
-}
-.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-	cursor: default;
-}
-.oo-ui-barToolGroup .oo-ui-tool-title,
-.oo-ui-barToolGroup .oo-ui-tool-accel {
-	display: none;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
-	cursor: pointer;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link {
-	height: 1.5em;
-	padding: 0.25em;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-	height: 1.5em;
-	width: 1.5em;
-}
-.oo-ui-popupToolGroup {
-	position: relative;
-	height: 2em;
-	min-width: 2.5em;
-}
-.oo-ui-popupToolGroup-handle {
-	display: block;
-	cursor: pointer;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-	position: absolute;
-	background-position: center center;
-	background-repeat: no-repeat;
-}
-.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
-	cursor: default;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-	display: none;
-	position: absolute;
-	z-index: 4;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
-	background-repeat: no-repeat;
-	background-position: center center;
-}
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
-	display: block;
-}
-.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
-	left: 0;
-}
-.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
-	right: 0;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-	display: inline-block;
-	vertical-align: middle;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-	display: inline-block;
-	vertical-align: middle;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-accel {
-	display: none;
-}
-.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
-	min-width: 3.5em;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-	top: 0;
-	width: 2em;
-	height: 2em;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
-	right: 0;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-	left: 0.25em;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-	line-height: 2.6em;
-	font-size: 0.8em;
-	margin: 0 1em;
-}
-.oo-ui-popupToolGroup-header {
-	line-height: 2.6em;
-	font-size: 0.8em;
-	margin: 0 0.6em;
-	font-weight: bold;
-}
-.oo-ui-popupToolGroup.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-	margin-left: 3em;
-}
-.oo-ui-popupToolGroup.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-	margin-right: 2.25em;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-	top: 2.3em;
-	margin: 0 -1px;
-	border: solid 1px #dddddd;
-	background-color: white;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-	height: 2em;
-	width: 2em;
-	margin-right: 0.25em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-	line-height: 2em;
-	font-size: 0.8em;
-}
-.oo-ui-listToolGroup .oo-ui-tool {
-	display: inline-block;
-	width: 100%;
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-	display: block;
-	cursor: pointer;
-	white-space: nowrap;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-	cursor: default;
-}
-.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
-	padding: 0.25em;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-	padding-right: 0.5em;
-}
-.oo-ui-menuToolGroup .oo-ui-tool {
-	display: block;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-	display: block;
-	cursor: pointer;
-	white-space: nowrap;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-	cursor: default;
-}
-.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
-	min-width: 8em;
-}
-.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
-	padding: 0.25em 0 0.25em 0;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-	padding: 0 1em 0 0.25em;
-}
-.oo-ui-toolbar {
-	clear: both;
-}
-.oo-ui-toolbar-bar {
-	line-height: 1em;
-}
-.oo-ui-toolbar-actions {
-	float: right;
-}
-.oo-ui-toolbar-tools {
-	display: inline;
-}
-.oo-ui-toolbar-tools,
-.oo-ui-toolbar-actions,
-.oo-ui-toolbar-shadow {
-	-webkit-touch-callout: none;
-	-webkit-user-select: none;
-	   -moz-user-select: none;
-	    -ms-user-select: none;
-	        user-select: none;
-}
-.oo-ui-toolbar-actions .oo-ui-popupWidget {
-	-webkit-touch-callout: default;
-	-webkit-user-select: all;
-	   -moz-user-select: all;
-	    -ms-user-select: all;
-	        user-select: all;
-}
-.oo-ui-toolbar-shadow {
-	background-position: left top;
-	background-repeat: repeat-x;
-	position: absolute;
-	width: 100%;
-	pointer-events: none;
-}
-.oo-ui-toolbar-bar {
-	border-bottom: solid 1px #dddddd;
-	background: white;
-}
-.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
-	border: none;
-	background: none;
-}
-.oo-ui-selectWidget {
-	margin: 0;
-	padding: 0;
-}
-.oo-ui-optionWidget {
-	position: relative;
-	display: block;
-	cursor: pointer;
-	padding: 0.8em 1em 0.8em 3.35em;
-	border: none;
-	font-weight: bold;
-}
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-	cursor: default;
-}
-.oo-ui-optionWidget .oo-ui-labelElement-label {
-	display: block;
-	white-space: nowrap;
-	text-overflow: ellipsis;
-	overflow: hidden;
-}
-.oo-ui-optionWidget .oo-ui-labelElement-label {
-	line-height: 1.5em;
-}
-.oo-ui-optionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
-	padding-right: 1.5em;
-}
-.oo-ui-optionWidget-level-0 {
-	padding-left: 3.5em;
-}
-.oo-ui-optionWidget-level-0 .oo-ui-iconElement-icon {
-	left: 1em;
-}
-.oo-ui-optionWidget-level-1 {
-	padding-left: 5em;
-}
-.oo-ui-optionWidget-level-1 .oo-ui-iconElement-icon {
-	left: 2.5em;
-}
-.oo-ui-optionWidget-level-2 {
-	padding-left: 6.5em;
-}
-.oo-ui-optionWidget-level-2 .oo-ui-iconElement-icon {
-	left: 4em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-	position: absolute;
-	background-repeat: no-repeat;
-	background-position: center center;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-	top: 50%;
-	width: 2em;
-	height: 2em;
-	margin-top: -1em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
-	left: 0.5em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-	right: 0.5em;
-}
-.oo-ui-buttonSelectWidget {
-	display: inline-block;
-	white-space: nowrap;
-}
-.oo-ui-buttonOptionWidget {
-	display: inline-block;
-	padding: 0;
-	background-color: transparent;
-}
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-	position: relative;
-}
-.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-	position: static;
-	display: inline-block;
-	vertical-align: middle;
-}
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-	height: 1.9em;
-}
-.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-	height: 1.9em;
-	margin-top: 0;
-}
-.oo-ui-labelWidget {
-	display: inline-block;
-	padding: 0.5em 0;
-}
-.oo-ui-iconWidget {
-	display: inline-block;
-	vertical-align: middle;
-	background-position: center center;
-	background-repeat: no-repeat;
-	line-height: 2.5em;
-	height: 1.9em;
-	width: 1.9em;
-	opacity: 0.8;
-}
-.oo-ui-iconWidget.oo-ui-widget-disabled {
-	opacity: 0.2;
-}
-.oo-ui-indicatorWidget {
-	display: inline-block;
-	vertical-align: middle;
-	background-position: center center;
-	background-repeat: no-repeat;
-	line-height: 2.5em;
-	height: 1.9em;
-	width: 1.9em;
-	opacity: 0.8;
-}
-.oo-ui-indicatorWidget.oo-ui-widget-disabled {
-	opacity: 0.2;
-}
-.oo-ui-buttonWidget {
-	display: inline-block;
-	vertical-align: middle;
-}
-.oo-ui-buttonGroupWidget {
-	border-radius: 0.3em;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-	border-radius: 0;
-	margin-bottom: -1px;
-	margin-left: -1px;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
-	border-bottom-left-radius: 0.3em;
-	border-top-left-radius: 0.3em;
-	margin-left: 0;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
-	border-bottom-right-radius: 0.3em;
-	border-top-right-radius: 0.3em;
-}
-.oo-ui-toggleSwitchWidget {
-	position: relative;
-	display: inline-block;
-	vertical-align: middle;
-	overflow: hidden;
-	cursor: pointer;
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-	-webkit-transform: translateZ(0px);
-	   -moz-transform: translateZ(0px);
-	    -ms-transform: translateZ(0px);
-	     -o-transform: translateZ(0px);
-	        transform: translateZ(0px);
-	height: 2em;
-	width: 4em;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-	cursor: default;
-}
-.oo-ui-toggleSwitchWidget-grip {
-	position: absolute;
-	display: block;
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-	position: absolute;
-	top: 0;
-	bottom: 0;
-	right: 0;
-	left: 0;
-	-webkit-touch-callout: none;
-	-webkit-user-select: none;
-	   -moz-user-select: none;
-	    -ms-user-select: none;
-	        user-select: none;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-	display: none;
-}
-.oo-ui-toggleSwitchWidget-grip {
-	top: 0.25em;
-	left: 0.25em;
-	width: 1.5em;
-	height: 1.5em;
-	margin-top: -1px;
-	-webkit-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-	   -moz-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-	    -ms-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-	     -o-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-	        transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-}
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-	-webkit-transition: opacity 200ms ease-in-out;
-	   -moz-transition: opacity 200ms ease-in-out;
-	    -ms-transition: opacity 200ms ease-in-out;
-	     -o-transition: opacity 200ms ease-in-out;
-	        transition: opacity 200ms ease-in-out;
-}
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
-	left: 2.25em;
-	margin-left: -2px;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
-	left: 0.25em;
-	margin-left: 0;
-}
-.oo-ui-popupWidget {
-	position: absolute;
-}
-.oo-ui-popupWidget-popup {
-	position: relative;
-	overflow: hidden;
-	z-index: 1;
-}
-.oo-ui-popupWidget-anchor {
-	display: none;
-	z-index: 1;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
-	display: block;
-	position: absolute;
-	top: 0;
-	background-repeat: no-repeat;
-}
-.oo-ui-popupWidget-head {
-	-webkit-touch-callout: none;
-	-webkit-user-select: none;
-	   -moz-user-select: none;
-	    -ms-user-select: none;
-	        user-select: none;
-}
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-	float: right;
-}
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
-	float: left;
-	cursor: default;
-}
-.oo-ui-popupWidget-body {
-	clear: both;
-	overflow: hidden;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
-	margin-top: 7px;
-}
-.oo-ui-popupWidget-head {
-	height: 2.5em;
-}
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-	margin: 0.25em;
-}
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
-	margin: 0.75em 1em;
-}
-.oo-ui-popupWidget-body-padded {
-	padding: 0 1em;
-}
-.oo-ui-popupButtonWidget {
-	position: relative;
-}
-.oo-ui-popupButtonWidget .oo-ui-popupWidget {
-	position: absolute;
-	cursor: auto;
-}
-.oo-ui-lookupInputWidget-menu {
-	background-color: #ffffff;
-}
-.oo-ui-textInputWidget {
-	position: relative;
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-	display: inline-block;
-	width: 100%;
-	resize: none;
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
-	position: absolute;
-	top: 0;
-	height: 100%;
-	background-repeat: no-repeat;
-	cursor: pointer;
-	-webkit-touch-callout: none;
-	-webkit-user-select: none;
-	   -moz-user-select: none;
-	    -ms-user-select: none;
-	        user-select: none;
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
-	left: 0;
-}
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
-	right: 0;
-}
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-	padding: 0.8em 1em;
-}
-.oo-ui-menuWidget {
-	position: absolute;
-	background: white;
-	border: solid 1px #dddddd;
-}
-.oo-ui-menuWidget input {
-	position: absolute;
-	width: 0;
-	height: 0;
-	overflow: hidden;
-	opacity: 0;
-}
-.oo-ui-menuItemWidget {
-	position: relative;
-}
-.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
-	display: none;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-	background-color: transparent;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
-	display: block;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-	background: #347bff;
-	color: #ffffff;
-}
-.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
-	background-size: 24px auto;
-}
-.oo-ui-menuSectionItemWidget {
-	cursor: default;
-	font-weight: normal;
-	color: #777777;
-	border: none;
-}
-.oo-ui-inlineMenuWidget {
-	position: relative;
-	display: inline-block;
-	margin: 0.25em 0;
-	min-width: 20em;
-}
-.oo-ui-inlineMenuWidget-handle {
-	width: 100%;
-	display: inline-block;
-	cursor: pointer;
-	-webkit-touch-callout: none;
-	-webkit-user-select: none;
-	   -moz-user-select: none;
-	    -ms-user-select: none;
-	        user-select: none;
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
-	position: absolute;
-	background-position: center center;
-	background-repeat: no-repeat;
-}
-.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
-	z-index: 1;
-	width: 100%;
-}
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
-	cursor: default;
-}
-.oo-ui-inlineMenuWidget-handle {
-	height: 2.5em;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
-	top: 0;
-	width: 2.5em;
-	height: 2.5em;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
-	right: 0;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
-	left: 0.25em;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
-	line-height: 2.5em;
-	margin: 0 0.5em;
-}
-.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
-	margin-left: 3em;
-}
-.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
-	margin-right: 2em;
-}
-.oo-ui-outlineItemWidget {
-	position: relative;
-	cursor: pointer;
-	-webkit-touch-callout: none;
-	-webkit-user-select: none;
-	   -moz-user-select: none;
-	    -ms-user-select: none;
-	        user-select: none;
-	padding: 0.75em;
-}
-.oo-ui-outlineControlsWidget {
-	height: 3em;
-}
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-	float: left;
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
-	float: left;
-	background-position: right center;
-	background-repeat: no-repeat;
-}
-.oo-ui-outlineControlsWidget-items {
-	float: left;
-}
-.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
-	float: left;
-}
-.oo-ui-outlineControlsWidget-movers {
-	float: right;
-}
-.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
-	float: right;
-}
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-	height: 2em;
-	margin: 0.5em;
-	padding: 0;
-}
-.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
-	width: 1.5em;
-	height: 2em;
-	margin: 0.5em 0 0.5em 0.5em;
-}
-.oo-ui-outlineControlsWidget-items {
-	margin-left: 0;
-}
-.oo-ui-comboBoxWidget {
-	display: inline-block;
-	position: relative;
-}
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
-	width: 100%;
-	z-index: 1;
-}
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
-	min-width: 20em;
-}
-.oo-ui-searchWidget-query {
-	position: absolute;
-	top: 0;
-	left: 0;
-	right: 0;
-}
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-	width: 100%;
-}
-.oo-ui-searchWidget-results {
-	position: absolute;
-	bottom: 0;
-	left: 0;
-	right: 0;
-	overflow-x: hidden;
-	overflow-y: auto;
-}
-.oo-ui-searchWidget-query {
-	height: 4em;
-	padding: 0 1em;
-}
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-	margin: 0.75em 0;
-}
-.oo-ui-searchWidget-results {
-	top: 4em;
-	padding: 1em;
-	line-height: 0;
-}
-.oo-ui-window {
-	line-height: 1em;
-}
-.oo-ui-window-frame {
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-.oo-ui-window-frame > iframe {
-	width: 100%;
-	height: 100%;
-	margin: 0;
-	padding: 0;
-}
-.oo-ui-window-content:focus {
-	outline: none;
-}
-.oo-ui-window-head,
-.oo-ui-window-foot {
-	-webkit-touch-callout: none;
-	-webkit-user-select: none;
-	   -moz-user-select: none;
-	    -ms-user-select: none;
-	        user-select: none;
-}
-.oo-ui-window-body {
-	margin: 0;
-	padding: 0;
-	background: none;
-}
-.oo-ui-window-overlay,
-.oo-ui-window-inner-overlay {
-	position: absolute;
-	top: 0;
-	left: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-head,
-.oo-ui-dialog-content > .oo-ui-window-body,
-.oo-ui-dialog-content > .oo-ui-window-foot {
-	position: absolute;
-	left: 0;
-	right: 0;
-	overflow: hidden;
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-.oo-ui-dialog-content > .oo-ui-window-head {
-	z-index: 1;
-	top: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-body {
-	z-index: 2;
-	top: 0;
-	bottom: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-foot {
-	z-index: 1;
-	bottom: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-inner-overlay {
-	z-index: 3;
-}
-.oo-ui-messageDialog-actions-horizontal {
-	display: table;
-	table-layout: fixed;
-	width: 100%;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-	display: table-cell;
-	width: 1%;
-}
-.oo-ui-messageDialog-actions-vertical {
-	display: block;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-	display: block;
-	overflow: hidden;
-	text-overflow: ellipsis;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget {
-	position: relative;
-	text-align: center;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
-	display: block;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
-	position: relative;
-	top: auto;
-	bottom: auto;
-	display: inline;
-	white-space: nowrap;
-}
-.oo-ui-messageDialog-title,
-.oo-ui-messageDialog-message {
-	display: block;
-	text-align: center;
-	padding-top: 0.5em;
-}
-.oo-ui-messageDialog-title {
-	font-size: 1.5em;
-	line-height: 1em;
-	color: #000000;
-}
-.oo-ui-messageDialog-message {
-	font-size: 0.9em;
-	line-height: 1.25em;
-	color: #666666;
-}
-.oo-ui-messageDialog-message-verbose {
-	font-size: 1.1em;
-	line-height: 1.5em;
-	text-align: left;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-	border-right: solid 1px #e5e5e5;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
-	border-right-width: 0;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-	border-bottom: solid 1px #e5e5e5;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
-	border-bottom-width: 0;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
-	text-align: center;
-	line-height: 3.4em;
-	padding: 0 2em;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
-	background-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
-	background-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
-	background-color: rgba(8, 126, 204, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
-	background-color: rgba(8, 126, 204, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
-	font-weight: bold;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
-	background-color: rgba(118, 171, 54, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
-	background-color: rgba(118, 171, 54, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
-	background-color: rgba(212, 83, 83, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
-	background-color: rgba(212, 83, 83, 0.1);
-}
-.oo-ui-processDialog-location {
-	overflow: hidden;
-	text-overflow: ellipsis;
-	white-space: nowrap;
-}
-.oo-ui-processDialog-title {
-	display: inline;
-	padding: 0;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
-	white-space: nowrap;
-}
-.oo-ui-processDialog-actions-safe,
-.oo-ui-processDialog-actions-primary {
-	position: absolute;
-	top: 0;
-	bottom: 0;
-}
-.oo-ui-processDialog-actions-safe {
-	left: 0;
-}
-.oo-ui-processDialog-actions-primary {
-	right: 0;
-}
-.oo-ui-processDialog-errors {
-	display: none;
-	position: absolute;
-	top: 0;
-	left: 0;
-	right: 0;
-	bottom: 0;
-	z-index: 2;
-	overflow-x: hidden;
-	overflow-y: auto;
-}
-.oo-ui-processDialog-content .oo-ui-window-head {
-	height: 3.35em;
-	border-bottom: 1px solid #dddddd;
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-.oo-ui-processDialog-content .oo-ui-window-body {
-	top: 3.35em;
-	padding: 2em 0;
-}
-.oo-ui-processDialog-navigation {
-	position: relative;
-	height: 3.35em;
-	padding: 0 1em;
-}
-.oo-ui-processDialog-location {
-	padding: 0.75em 0;
-	height: 1.85em;
-	cursor: default;
-	text-align: center;
-}
-.oo-ui-processDialog-title {
-	font-weight: bold;
-	line-height: 1.85em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonElement-button {
-	padding: 0.35em 0.75em;
-	min-width: 1.85em;
-	min-height: 1.85em;
-	border: 1px solid #dddddd;
-	border-radius: 4px;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labelElement-label {
-	line-height: 1.85em;
-	padding: 0 1em;
-	font-weight: bold;
-	color: #777777;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconElement-icon {
-	position: absolute;
-	margin-top: -0.125em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-	vertical-align: middle;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button {
-	border: 1px solid transparent;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label {
-	color: #d11d13;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button {
-	padding: 0.75em 0.35em;
-	border: none;
-	border-radius: 0;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-buttonElement-button {
-	background-color: #347bff;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
-	color: #ffffff;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-	left: 0.5em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
-	padding-left: 2.25em;
-}
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-	right: 0.5em;
-}
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
-	padding-right: 2.25em;
-}
-.oo-ui-processDialog-actions-other {
-	position: absolute;
-	bottom: 1em;
-}
-.oo-ui-processDialog > .oo-ui-window-frame {
-	min-height: 5em;
-}
-.oo-ui-processDialog-errors {
-	background-color: rgba(255, 255, 255, 0.9);
-	padding: 3em 3em 1.5em 3em;
-	text-align: center;
-}
-.oo-ui-processDialog-errors .oo-ui-buttonWidget {
-	margin: 2em 1em 2em 1em;
-}
-.oo-ui-processDialog-errors-title {
-	font-size: 1.5em;
-	color: #000000;
-	margin-bottom: 2em;
-}
-.oo-ui-processDialog-error {
-	text-align: left;
-	margin: 1em;
-	padding: 1em;
-	border: solid 1px #ff9e9e;
-	background-color: #fff7f7;
-	border-radius: 0.25em;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-	position: fixed;
-	width: 0;
-	height: 0;
-	overflow: hidden;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
-	width: auto;
-	height: auto;
-	top: 0;
-	right: 0;
-	bottom: 0;
-	left: 0;
-	padding: 1em;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
-	position: absolute;
-	right: 0;
-	left: 0;
-	margin: auto;
-	overflow: hidden;
-	max-width: 100%;
-	max-height: 100%;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
-	width: 100%;
-	height: 100%;
-}
-.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
-	width: 100%;
-	height: 100%;
-	top: 0;
-	bottom: 0;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-	background-color: rgba(255, 255, 255, 0.5);
-	opacity: 0;
-	-webkit-transition: opacity 250ms ease-in-out;
-	   -moz-transition: opacity 250ms ease-in-out;
-	    -ms-transition: opacity 250ms ease-in-out;
-	     -o-transition: opacity 250ms ease-in-out;
-	        transition: opacity 250ms ease-in-out;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
-	top: 0;
-	bottom: 0;
-	background-color: #ffffff;
-	-webkit-transform: translate3d(0, -200%, 0);
-	   -moz-transform: translate3d(0, -200%, 0);
-	    -ms-transform: translate3d(0, -200%, 0);
-	     -o-transform: translate3d(0, -200%, 0);
-	        transform: translate3d(0, -200%, 0);
-	-webkit-transition: transform 250ms ease-in-out;
-	   -moz-transition: transform 250ms ease-in-out;
-	    -ms-transition: transform 250ms ease-in-out;
-	     -o-transition: transform 250ms ease-in-out;
-	        transition: transform 250ms ease-in-out;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
-	opacity: 1;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
-	-webkit-transform: translate3d(0, 0, 0);
-	   -moz-transform: translate3d(0, 0, 0);
-	    -ms-transform: translate3d(0, 0, 0);
-	     -o-transform: translate3d(0, 0, 0);
-	        transform: translate3d(0, 0, 0);
-}
-.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
-	border: solid 1px #cccccc;
-	border-radius: 0.5em;
-	box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
-}
-
-.oo-ui-icon-check {
-	background-image: /* @embed */ url(themes/minerva/images/icons/check.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-check,
-.oo-ui-image-invert.oo-ui-icon-check {
-	background-image: /* @embed */ url(themes/minerva/images/icons/check-invert.svg);
-}
diff --git a/resources/lib/oojs-ui/oojs-ui-minerva.svg.rtl.css b/resources/lib/oojs-ui/oojs-ui-minerva.svg.rtl.css
deleted file mode 100644
index 513f2a734e..0000000000
--- a/resources/lib/oojs-ui/oojs-ui-minerva.svg.rtl.css
+++ /dev/null
@@ -1,1381 +0,0 @@
-/*!
- * OOjs UI v0.1.0
- * https://www.mediawiki.org/wiki/OOjs_UI
- *
- * Copyright 2011–2014 OOjs Team and other contributors.
- * Released under the MIT license
- * http://oojs.mit-license.org
- *
- * Date: 2014-09-24T23:21:42Z
- */
-/* @noflip */
-.oo-ui-rtl {
-  direction: rtl;
-}
-/* @noflip */
-.oo-ui-ltr {
-  direction: ltr;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button {
-  cursor: pointer;
-  display: inline-block;
-  vertical-align: middle;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  display: none;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-  display: none;
-}
-.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
-  cursor: default;
-}
-.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  display: inline-block;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-buttonElement-frameless {
-  display: inline-block;
-  position: relative;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-  display: inline-block;
-  vertical-align: top;
-  text-align: center;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-  cursor: default;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  margin-right: 0;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-  margin-left: -0.75em;
-}
-.oo-ui-buttonElement.oo-ui-indicatorElement .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  width: 3.35em;
-  height: 3.35em;
-  background-size: 2em auto;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  margin-right: 0.25em;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  line-height: 1.9em;
-}
-.oo-ui-clippableElement-clippable {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
-  overflow-y: hidden;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-  width: 100%;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
-  padding: 2em;
-}
-.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 3em;
-  overflow-y: auto;
-}
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-  position: absolute;
-  bottom: 0;
-  right: 0;
-  left: 0;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-  padding: 0 0 1em;
-}
-.oo-ui-fieldLayout {
-  margin-bottom: 1em;
-}
-.oo-ui-fieldLayout:before,
-.oo-ui-fieldLayout:after {
-  content: " ";
-  display: table;
-}
-.oo-ui-fieldLayout:after {
-  clear: both;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-  display: block;
-  float: right;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-  display: block;
-  float: right;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-  text-align: left;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
-  display: inline-block;
-}
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
-  z-index: 1;
-}
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help {
-  float: left;
-}
-.oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
-  padding: 0.5em 0.75em;
-}
-.oo-ui-fieldLayout:last-child {
-  margin-bottom: 0;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
-  padding-top: 0.5em;
-  margin-left: 5%;
-  width: 35%;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
-  width: 60%;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
-  padding: 0.75em 0.5em 0.5em 0.5em;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
-  padding: 0.5em 0;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
-  padding: 0.5em 0;
-}
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  margin-top: 0.25em;
-}
-.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
-  color: #ccc;
-}
-.oo-ui-fieldsetLayout {
-  position: relative;
-  margin: 0;
-  padding: 0;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-  display: block;
-  position: absolute;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
-  display: inline-block;
-}
-.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
-  margin-top: 2em;
-}
-.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
-  margin-bottom: 0.5em;
-  padding: 0.25em 0;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
-  padding-right: 1.75em;
-  line-height: 1.33em;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-  right: 0;
-  top: 0.25em;
-  width: 2em;
-  height: 2em;
-}
-.oo-ui-gridLayout {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 0;
-}
-.oo-ui-panelLayout {
-  position: relative;
-  padding: 1em 3.35em;
-}
-.oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-.oo-ui-panelLayout-expanded {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 0;
-}
-.oo-ui-stackLayout > .oo-ui-panelLayout {
-  display: none;
-}
-.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
-  display: block;
-  position: relative;
-}
-.oo-ui-popupTool .oo-ui-popupWidget-popup,
-.oo-ui-popupTool .oo-ui-popupWidget-anchor {
-  z-index: 4;
-}
-.oo-ui-popupTool .oo-ui-popupWidget {
-  margin-right: 1.25em;
-  font-size: 0.8em;
-}
-.oo-ui-toolGroup {
-  display: inline-block;
-  vertical-align: middle;
-  margin: 0.3em;
-}
-.oo-ui-toolGroup-empty {
-  display: none;
-}
-.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
-.oo-ui-barToolGroup > .oo-ui-labelElement-label {
-  display: none;
-}
-.oo-ui-barToolGroup .oo-ui-tool {
-  display: inline-block;
-  position: relative;
-  vertical-align: top;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link {
-  display: block;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  display: block;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  display: none;
-}
-.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-.oo-ui-barToolGroup .oo-ui-tool-title,
-.oo-ui-barToolGroup .oo-ui-tool-accel {
-  display: none;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
-  cursor: pointer;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link {
-  height: 1.5em;
-  padding: 0.25em;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  height: 1.5em;
-  width: 1.5em;
-}
-.oo-ui-popupToolGroup {
-  position: relative;
-  height: 2em;
-  min-width: 2.5em;
-}
-.oo-ui-popupToolGroup-handle {
-  display: block;
-  cursor: pointer;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-  position: absolute;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
-  cursor: default;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-  display: none;
-  position: absolute;
-  z-index: 4;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
-  background-repeat: no-repeat;
-  background-position: center center;
-}
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
-  display: block;
-}
-.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
-  right: 0;
-}
-.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
-  left: 0;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-accel {
-  display: none;
-}
-.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
-  min-width: 3.5em;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-  top: 0;
-  width: 2em;
-  height: 2em;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
-  left: 0;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-  right: 0.25em;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-  line-height: 2.6em;
-  font-size: 0.8em;
-  margin: 0 1em;
-}
-.oo-ui-popupToolGroup-header {
-  line-height: 2.6em;
-  font-size: 0.8em;
-  margin: 0 0.6em;
-  font-weight: bold;
-}
-.oo-ui-popupToolGroup.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-  margin-right: 3em;
-}
-.oo-ui-popupToolGroup.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-  margin-left: 2.25em;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-  top: 2.3em;
-  margin: 0 -1px;
-  border: solid 1px #dddddd;
-  background-color: white;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-  height: 2em;
-  width: 2em;
-  margin-left: 0.25em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-  line-height: 2em;
-  font-size: 0.8em;
-}
-.oo-ui-listToolGroup .oo-ui-tool {
-  display: inline-block;
-  width: 100%;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-  display: block;
-  cursor: pointer;
-  white-space: nowrap;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
-  padding: 0.25em;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-  padding-left: 0.5em;
-}
-.oo-ui-menuToolGroup .oo-ui-tool {
-  display: block;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-  display: block;
-  cursor: pointer;
-  white-space: nowrap;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-  cursor: default;
-}
-.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
-  min-width: 8em;
-}
-.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
-  padding: 0.25em 0 0.25em 0;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-  padding: 0 0.25em 0 1em;
-}
-.oo-ui-toolbar {
-  clear: both;
-}
-.oo-ui-toolbar-bar {
-  line-height: 1em;
-}
-.oo-ui-toolbar-actions {
-  float: left;
-}
-.oo-ui-toolbar-tools {
-  display: inline;
-}
-.oo-ui-toolbar-tools,
-.oo-ui-toolbar-actions,
-.oo-ui-toolbar-shadow {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-toolbar-actions .oo-ui-popupWidget {
-  -webkit-touch-callout: default;
-  -webkit-user-select: all;
-  -moz-user-select: all;
-  -ms-user-select: all;
-  user-select: all;
-}
-.oo-ui-toolbar-shadow {
-  background-position: right top;
-  background-repeat: repeat-x;
-  position: absolute;
-  width: 100%;
-  pointer-events: none;
-}
-.oo-ui-toolbar-bar {
-  border-bottom: solid 1px #dddddd;
-  background: white;
-}
-.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
-  border: none;
-  background: none;
-}
-.oo-ui-selectWidget {
-  margin: 0;
-  padding: 0;
-}
-.oo-ui-optionWidget {
-  position: relative;
-  display: block;
-  cursor: pointer;
-  padding: 0.8em 3.35em 0.8em 1em;
-  border: none;
-  font-weight: bold;
-}
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-  cursor: default;
-}
-.oo-ui-optionWidget .oo-ui-labelElement-label {
-  display: block;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-.oo-ui-optionWidget .oo-ui-labelElement-label {
-  line-height: 1.5em;
-}
-.oo-ui-optionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
-  padding-left: 1.5em;
-}
-.oo-ui-optionWidget-level-0 {
-  padding-right: 3.5em;
-}
-.oo-ui-optionWidget-level-0 .oo-ui-iconElement-icon {
-  right: 1em;
-}
-.oo-ui-optionWidget-level-1 {
-  padding-right: 5em;
-}
-.oo-ui-optionWidget-level-1 .oo-ui-iconElement-icon {
-  right: 2.5em;
-}
-.oo-ui-optionWidget-level-2 {
-  padding-right: 6.5em;
-}
-.oo-ui-optionWidget-level-2 .oo-ui-iconElement-icon {
-  right: 4em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-  position: absolute;
-  background-repeat: no-repeat;
-  background-position: center center;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-  top: 50%;
-  width: 2em;
-  height: 2em;
-  margin-top: -1em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
-  right: 0.5em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-  left: 0.5em;
-}
-.oo-ui-buttonSelectWidget {
-  display: inline-block;
-  white-space: nowrap;
-}
-.oo-ui-buttonOptionWidget {
-  display: inline-block;
-  padding: 0;
-  background-color: transparent;
-}
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-  position: relative;
-}
-.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  position: static;
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-  height: 1.9em;
-}
-.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  height: 1.9em;
-  margin-top: 0;
-}
-.oo-ui-labelWidget {
-  display: inline-block;
-  padding: 0.5em 0;
-}
-.oo-ui-iconWidget {
-  display: inline-block;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-  line-height: 2.5em;
-  height: 1.9em;
-  width: 1.9em;
-  opacity: 0.8;
-}
-.oo-ui-iconWidget.oo-ui-widget-disabled {
-  opacity: 0.2;
-}
-.oo-ui-indicatorWidget {
-  display: inline-block;
-  vertical-align: middle;
-  background-position: center center;
-  background-repeat: no-repeat;
-  line-height: 2.5em;
-  height: 1.9em;
-  width: 1.9em;
-  opacity: 0.8;
-}
-.oo-ui-indicatorWidget.oo-ui-widget-disabled {
-  opacity: 0.2;
-}
-.oo-ui-buttonWidget {
-  display: inline-block;
-  vertical-align: middle;
-}
-.oo-ui-buttonGroupWidget {
-  border-radius: 0.3em;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-  border-radius: 0;
-  margin-bottom: -1px;
-  margin-right: -1px;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
-  border-bottom-right-radius: 0.3em;
-  border-top-right-radius: 0.3em;
-  margin-right: 0;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
-  border-bottom-left-radius: 0.3em;
-  border-top-left-radius: 0.3em;
-}
-.oo-ui-toggleSwitchWidget {
-  position: relative;
-  display: inline-block;
-  vertical-align: middle;
-  overflow: hidden;
-  cursor: pointer;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  -webkit-transform: translateZ(0px);
-  -moz-transform: translateZ(0px);
-  -ms-transform: translateZ(0px);
-  -o-transform: translateZ(0px);
-  transform: translateZ(0px);
-  height: 2em;
-  width: 4em;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-  cursor: default;
-}
-.oo-ui-toggleSwitchWidget-grip {
-  position: absolute;
-  display: block;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  right: 0;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-  display: none;
-}
-.oo-ui-toggleSwitchWidget-grip {
-  top: 0.25em;
-  right: 0.25em;
-  width: 1.5em;
-  height: 1.5em;
-  margin-top: -1px;
-  -webkit-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-  -moz-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-  -ms-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-  -o-transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-  transition: right 200ms ease-in-out, margin-right 200ms ease-in-out;
-}
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-  -webkit-transition: opacity 200ms ease-in-out;
-  -moz-transition: opacity 200ms ease-in-out;
-  -ms-transition: opacity 200ms ease-in-out;
-  -o-transition: opacity 200ms ease-in-out;
-  transition: opacity 200ms ease-in-out;
-}
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
-  right: 2.25em;
-  margin-right: -2px;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
-  right: 0.25em;
-  margin-right: 0;
-}
-.oo-ui-actionWidget.oo-ui-pendingElement-pending {
-  background-image: /* @embed */ url(images/textures/pending.gif);
-}
-.oo-ui-popupWidget-popup {
-  position: absolute;
-  overflow: hidden;
-  z-index: 1;
-}
-.oo-ui-popupWidget-anchor {
-  display: none;
-  z-index: 1;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
-  display: block;
-  position: absolute;
-  background-repeat: no-repeat;
-}
-.oo-ui-popupWidget-head {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-  float: left;
-}
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
-  float: right;
-  cursor: default;
-}
-.oo-ui-popupWidget-body {
-  clear: both;
-  overflow: hidden;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
-  margin-top: 7px;
-}
-.oo-ui-popupWidget-head {
-  height: 2.5em;
-}
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-  margin: 0.25em;
-}
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
-  margin: 0.75em 1em;
-}
-.oo-ui-popupWidget-body-padded {
-  padding: 0 1em;
-}
-.oo-ui-popupButtonWidget {
-  position: relative;
-}
-.oo-ui-popupButtonWidget .oo-ui-popupWidget {
-  position: absolute;
-  right: 1em;
-  cursor: auto;
-}
-.oo-ui-lookupInputWidget-menu {
-  background-color: #fff;
-}
-.oo-ui-textInputWidget {
-  position: relative;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-  display: inline-block;
-  width: 100%;
-  resize: none;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-  background-image: /* @embed */ url(images/textures/pending.gif);
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
-  position: absolute;
-  top: 0;
-  height: 100%;
-  background-repeat: no-repeat;
-  cursor: pointer;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
-  right: 0;
-}
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
-  left: 0;
-}
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-  padding: .8em 1em;
-}
-.oo-ui-menuWidget {
-  position: absolute;
-  background: white;
-  border: solid 1px #dddddd;
-}
-.oo-ui-menuWidget input {
-  position: absolute;
-  width: 0;
-  height: 0;
-  overflow: hidden;
-  opacity: 0;
-}
-.oo-ui-menuItemWidget {
-  position: relative;
-}
-.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
-  display: none;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-  background-color: transparent;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
-  display: block;
-}
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
-  background: #347bff;
-  color: #ffffff;
-}
-.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
-  background-size: 24px auto;
-}
-.oo-ui-menuSectionItemWidget {
-  cursor: default;
-  font-weight: normal;
-  color: #777777;
-  border: none;
-}
-.oo-ui-inlineMenuWidget {
-  position: relative;
-  display: inline-block;
-  margin: 0.25em 0;
-  min-width: 20em;
-}
-.oo-ui-inlineMenuWidget-handle {
-  width: 100%;
-  display: inline-block;
-  cursor: pointer;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
-  position: absolute;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
-  z-index: 1;
-  width: 100%;
-}
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
-  cursor: default;
-}
-.oo-ui-inlineMenuWidget-handle {
-  height: 2.5em;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
-  top: 0;
-  width: 2.5em;
-  height: 2.5em;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
-  left: 0;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
-  right: 0.25em;
-}
-.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
-  line-height: 2.5em;
-  margin: 0 0.5em;
-}
-.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
-  margin-right: 3em;
-}
-.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
-  margin-left: 2em;
-}
-.oo-ui-outlineItemWidget {
-  position: relative;
-  cursor: pointer;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  padding: 0.75em;
-}
-.oo-ui-outlineControlsWidget {
-  height: 3em;
-}
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-  float: right;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
-  float: right;
-  background-position: left center;
-  background-repeat: no-repeat;
-}
-.oo-ui-outlineControlsWidget-items {
-  float: right;
-}
-.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
-  float: right;
-}
-.oo-ui-outlineControlsWidget-movers {
-  float: left;
-}
-.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
-  float: left;
-}
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-  height: 2em;
-  margin: 0.5em;
-  padding: 0;
-}
-.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
-  width: 1.5em;
-  height: 2em;
-  margin: 0.5em 0.5em 0.5em 0;
-}
-.oo-ui-outlineControlsWidget-items {
-  margin-right: 0;
-}
-.oo-ui-comboBoxWidget {
-  display: inline-block;
-  position: relative;
-}
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
-  width: 100%;
-  z-index: 1;
-}
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
-  min-width: 20em;
-}
-.oo-ui-searchWidget-query {
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-}
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-  width: 100%;
-}
-.oo-ui-searchWidget-results {
-  position: absolute;
-  bottom: 0;
-  right: 0;
-  left: 0;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-.oo-ui-searchWidget-query {
-  height: 4em;
-  padding: 0 1em;
-}
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-  margin: 0.75em 0;
-}
-.oo-ui-searchWidget-results {
-  top: 4em;
-  padding: 1em;
-  line-height: 0;
-}
-.oo-ui-window {
-  line-height: 1em;
-}
-.oo-ui-window-frame {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-window-frame > iframe {
-  width: 100%;
-  height: 100%;
-  margin: 0;
-  padding: 0;
-}
-.oo-ui-window-content:focus {
-  outline: none;
-}
-.oo-ui-window-head,
-.oo-ui-window-foot {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-.oo-ui-window-body {
-  margin: 0;
-  padding: 0;
-  background: none;
-}
-.oo-ui-window-overlay {
-  position: absolute;
-  top: 0;
-  right: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-head,
-.oo-ui-dialog-content > .oo-ui-window-body,
-.oo-ui-dialog-content > .oo-ui-window-foot {
-  position: absolute;
-  right: 0;
-  left: 0;
-  overflow: hidden;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-dialog-content > .oo-ui-window-head {
-  z-index: 1;
-  top: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-head.oo-ui-pendingElement-pending {
-  background-image: /* @embed */ url(images/textures/pending.gif);
-}
-.oo-ui-dialog-content > .oo-ui-window-body {
-  z-index: 2;
-  top: 0;
-  bottom: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-foot {
-  z-index: 1;
-  bottom: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-overlay {
-  z-index: 3;
-}
-.oo-ui-messageDialog-actions-horizontal {
-  display: table;
-  table-layout: fixed;
-  width: 100%;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-  display: table-cell;
-  width: 1%;
-}
-.oo-ui-messageDialog-actions-vertical {
-  display: block;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-  display: block;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget {
-  position: relative;
-  text-align: center;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
-  display: block;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
-  position: relative;
-  top: auto;
-  bottom: auto;
-  display: inline;
-  white-space: nowrap;
-}
-.oo-ui-messageDialog-title,
-.oo-ui-messageDialog-message {
-  display: block;
-  text-align: center;
-  padding-top: 0.5em;
-}
-.oo-ui-messageDialog-title {
-  font-size: 1.5em;
-  line-height: 1em;
-  color: #000;
-}
-.oo-ui-messageDialog-message {
-  font-size: 0.9em;
-  line-height: 1.25em;
-  color: #666;
-}
-.oo-ui-messageDialog-message-verbose {
-  font-size: 1.1em;
-  line-height: 1.5em;
-  text-align: right;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-  border-left: solid 1px #e5e5e5;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
-  border-left-width: 0;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-  border-bottom: solid 1px #e5e5e5;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
-  border-bottom-width: 0;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
-  text-align: center;
-  line-height: 3.4em;
-  padding: 0 2em;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
-  background-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
-  background-color: rgba(8, 126, 204, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
-  background-color: rgba(8, 126, 204, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
-  font-weight: bold;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
-  background-color: rgba(118, 171, 54, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
-  background-color: rgba(118, 171, 54, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
-  background-color: rgba(212, 83, 83, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
-  background-color: rgba(212, 83, 83, 0.1);
-}
-.oo-ui-processDialog-location {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-.oo-ui-processDialog-title {
-  display: inline;
-  padding: 0;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
-  white-space: nowrap;
-}
-.oo-ui-processDialog-actions-safe,
-.oo-ui-processDialog-actions-primary {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-}
-.oo-ui-processDialog-actions-safe {
-  right: 0;
-}
-.oo-ui-processDialog-actions-primary {
-  left: 0;
-}
-.oo-ui-processDialog-errors {
-  display: none;
-  position: absolute;
-  top: 0;
-  right: 0;
-  left: 0;
-  bottom: 0;
-  z-index: 2;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-.oo-ui-processDialog-content .oo-ui-window-head {
-  height: 3.35em;
-  border-bottom: 1px solid #dddddd;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.oo-ui-processDialog-content .oo-ui-window-body {
-  top: 3.35em;
-  padding: 2em 0;
-}
-.oo-ui-processDialog-navigation {
-  position: relative;
-  height: 3.35em;
-  padding: 0 1em;
-}
-.oo-ui-processDialog-location {
-  padding: 0.75em 0;
-  height: 1.85em;
-  cursor: default;
-  text-align: center;
-}
-.oo-ui-processDialog-title {
-  font-weight: bold;
-  line-height: 1.85em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonElement-button {
-  padding: 0.35em 0.75em;
-  min-width: 1.85em;
-  min-height: 1.85em;
-  border: 1px solid #dddddd;
-  border-radius: 4px;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labelElement-label {
-  line-height: 1.85em;
-  padding: 0 1em;
-  font-weight: bold;
-  color: #777777;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconElement-icon {
-  position: absolute;
-  margin-top: -0.125em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-  vertical-align: middle;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button {
-  border: 1px solid transparent;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label {
-  color: #d11d13;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button {
-  padding: 0.75em 0.35em;
-  border: none;
-  border-radius: 0;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-buttonElement-button {
-  background-color: #347bff;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
-  color: #ffffff;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-  right: 0.5em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
-  padding-right: 2.25em;
-}
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-  left: 0.5em;
-}
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
-  padding-left: 2.25em;
-}
-.oo-ui-processDialog-actions-other {
-  position: absolute;
-  bottom: 1em;
-}
-.oo-ui-processDialog > .oo-ui-window-frame {
-  min-height: 5em;
-}
-.oo-ui-processDialog-errors {
-  background-color: rgba(255, 255, 255, 0.9);
-  padding: 3em 3em 1.5em 3em;
-  text-align: center;
-}
-.oo-ui-processDialog-errors .oo-ui-buttonWidget {
-  margin: 2em 1em 2em 1em;
-}
-.oo-ui-processDialog-errors-title {
-  font-size: 1.5em;
-  color: #000;
-  margin-bottom: 2em;
-}
-.oo-ui-processDialog-error {
-  text-align: right;
-  margin: 1em;
-  padding: 1em;
-  border: solid 1px #ff9e9e;
-  background-color: #fff7f7;
-  border-radius: 0.25em;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-  position: fixed;
-  width: 0;
-  height: 0;
-  overflow: hidden;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
-  width: auto;
-  height: auto;
-  top: 0;
-  left: 0;
-  bottom: 0;
-  right: 0;
-  padding: 1em;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
-  position: absolute;
-  left: 0;
-  right: 0;
-  margin: auto;
-  overflow: hidden;
-  max-width: 100%;
-  max-height: 100%;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
-  width: 100%;
-  height: 100%;
-}
-.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
-  width: 100%;
-  height: 100%;
-  top: 0;
-  bottom: 0;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-  background-color: rgba(255, 255, 255, 0.5);
-  opacity: 0;
-  -webkit-transition: opacity 250ms ease-in-out;
-  -moz-transition: opacity 250ms ease-in-out;
-  -ms-transition: opacity 250ms ease-in-out;
-  -o-transition: opacity 250ms ease-in-out;
-  transition: opacity 250ms ease-in-out;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
-  top: 0;
-  bottom: 0;
-  background-color: #fff;
-  -webkit-transform: translate3d(0, -200%, 0);
-  -moz-transform: translate3d(0, -200%, 0);
-  -ms-transform: translate3d(0, -200%, 0);
-  -o-transform: translate3d(0, -200%, 0);
-  transform: translate3d(0, -200%, 0);
-  -webkit-transition: transform 250ms ease-in-out;
-  -moz-transition: transform 250ms ease-in-out;
-  -ms-transition: transform 250ms ease-in-out;
-  -o-transition: transform 250ms ease-in-out;
-  transition: transform 250ms ease-in-out;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
-  opacity: 1;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
-  -webkit-transform: translate3d(0, 0, 0);
-  -moz-transform: translate3d(0, 0, 0);
-  -ms-transform: translate3d(0, 0, 0);
-  -o-transform: translate3d(0, 0, 0);
-  transform: translate3d(0, 0, 0);
-}
-.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
-  border: solid 1px #ccc;
-  border-radius: 0.5em;
-  box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
-}
-
-.oo-ui-icon-check {
-  background-image: /* @embed */ url(themes/minerva/images/icons/check.svg);
-}
-.oo-ui-image-invert .oo-ui-icon-check,
-.oo-ui-image-invert.oo-ui-icon-check {
-  background-image: /* @embed */ url(themes/minerva/images/icons/check-invert.svg);
-}
diff --git a/resources/lib/oojs-ui/oojs-ui.js b/resources/lib/oojs-ui/oojs-ui.js
index 94ae50e0cd..41ef826b4f 100644
--- a/resources/lib/oojs-ui/oojs-ui.js
+++ b/resources/lib/oojs-ui/oojs-ui.js
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (1829141230)
+ * OOjs UI v0.1.0-pre (db065e5a9f)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-10-15T22:49:59Z
+ * Date: 2014-10-20T14:47:45Z
  */
 ( function ( OO ) {
 
@@ -111,6 +111,10 @@ OO.ui.getLocalValue = function ( obj, lang, fallback ) {
 		'ooui-outline-control-remove': 'Remove item',
 		// Label for the toolbar group that contains a list of all other available tools
 		'ooui-toolbar-more': 'More',
+		// Label for the fake tool that expands the full list of tools in a toolbar group
+		'ooui-toolgroup-expand': 'More',
+		// Label for the fake tool that collapses the full list of tools in a toolbar group
+		'ooui-toolgroup-collapse': 'Fewer',
 		// Default label for the accept button of a confirmation dialog
 		'ooui-dialog-message-accept': 'OK',
 		// Default label for the reject button of a confirmation dialog
@@ -701,9 +705,7 @@ OO.ui.Element = function OoUiElement( config ) {
 	this.$ = config.$ || OO.ui.Element.getJQuery( document );
 	this.$element = this.$( this.$.context.createElement( this.getTagName() ) );
 	this.elementGroup = null;
-	this.debouncedUpdateThemeClassesHandler = OO.ui.bind(
-		this.debouncedUpdateThemeClasses, this
-	);
+	this.debouncedUpdateThemeClassesHandler = this.debouncedUpdateThemeClasses.bind( this );
 	this.updateThemeClassesPending = false;
 
 	// Initialization
@@ -727,7 +729,7 @@ OO.initClass( OO.ui.Element );
 /**
  * HTML tag name.
  *
- * This may be ignored if getTagName is overridden.
+ * This may be ignored if #getTagName is overridden.
  *
  * @static
  * @inheritable
@@ -865,15 +867,35 @@ OO.ui.Element.getFrameOffset = function ( from, to, offset ) {
 /**
  * Get the offset between two elements.
  *
+ * The two elements may be in a different frame, but in that case the frame $element is in must
+ * be contained in the frame $anchor is in.
+ *
  * @static
- * @param {jQuery} $from
- * @param {jQuery} $to
+ * @param {jQuery} $element Element whose position to get
+ * @param {jQuery} $anchor Element to get $element's position relative to
  * @return {Object} Translated position coordinates, containing top and left properties
  */
-OO.ui.Element.getRelativePosition = function ( $from, $to ) {
-	var from = $from.offset(),
-		to = $to.offset();
-	return { top: Math.round( from.top - to.top ), left: Math.round( from.left - to.left ) };
+OO.ui.Element.getRelativePosition = function ( $element, $anchor ) {
+	var iframe, iframePos,
+		pos = $element.offset(),
+		anchorPos = $anchor.offset(),
+		elementDocument = this.getDocument( $element ),
+		anchorDocument = this.getDocument( $anchor );
+
+	// If $element isn't in the same document as $anchor, traverse up
+	while ( elementDocument !== anchorDocument ) {
+		iframe = elementDocument.defaultView.frameElement;
+		if ( !iframe ) {
+			throw new Error( '$element frame is not contained in $anchor frame' );
+		}
+		iframePos = $( iframe ).offset();
+		pos.left += iframePos.left;
+		pos.top += iframePos.top;
+		elementDocument = iframe.ownerDocument;
+	}
+	pos.left -= anchorPos.left;
+	pos.top -= anchorPos.top;
+	return pos;
 };
 
 /**
@@ -1086,6 +1108,26 @@ OO.ui.Element.offDOMEvent = function ( el, event, callback ) {
 
 /* Methods */
 
+/**
+ * Check if element supports one or more methods.
+ *
+ * @param {string|string[]} methods Method or list of methods to check
+ * @return boolean All methods are supported
+ */
+OO.ui.Element.prototype.supports = function ( methods ) {
+	var i, len,
+		support = 0;
+
+	methods = $.isArray( methods ) ? methods : [ methods ];
+	for ( i = 0, len = methods.length; i < len; i++ ) {
+		if ( $.isFunction( this[methods[i]] ) ) {
+			support++;
+		}
+	}
+
+	return methods.length === support;
+};
+
 /**
  * Update the theme-provided classes.
  *
@@ -1903,7 +1945,7 @@ OO.ui.Window.prototype.initialize = function () {
 	this.$innerOverlay = this.$( '
' ); // Events - this.$element.on( 'mousedown', OO.ui.bind( this.onMouseDown, this ) ); + this.$element.on( 'mousedown', this.onMouseDown.bind( this ) ); // Initialization this.$head.addClass( 'oo-ui-window-head' ); @@ -2375,7 +2417,7 @@ OO.ui.Dialog.prototype.initialize = function () { // Events if ( this.constructor.static.escapable ) { - this.$document.on( 'keydown', OO.ui.bind( this.onDocumentKeyDown, this ) ); + this.$document.on( 'keydown', this.onDocumentKeyDown.bind( this ) ); } // Initialization @@ -2415,7 +2457,7 @@ OO.ui.Dialog.prototype.detachActions = function () { OO.ui.Dialog.prototype.executeAction = function ( action ) { this.pushPending(); return this.getActionProcess( action ).execute() - .always( OO.ui.bind( this.popPending, this ) ); + .always( this.popPending.bind( this ) ); }; /** @@ -2487,10 +2529,10 @@ OO.ui.WindowManager = function OoUiWindowManager( config ) { this.$ariaHidden = null; this.requestedSize = null; this.onWindowResizeTimeout = null; - this.onWindowResizeHandler = OO.ui.bind( this.onWindowResize, this ); - this.afterWindowResizeHandler = OO.ui.bind( this.afterWindowResize, this ); - this.onWindowMouseWheelHandler = OO.ui.bind( this.onWindowMouseWheel, this ); - this.onDocumentKeyDownHandler = OO.ui.bind( this.onDocumentKeyDown, this ); + this.onWindowResizeHandler = this.onWindowResize.bind( this ); + this.afterWindowResizeHandler = this.afterWindowResize.bind( this ); + this.onWindowMouseWheelHandler = this.onWindowMouseWheel.bind( this ); + this.onDocumentKeyDownHandler = this.onDocumentKeyDown.bind( this ); // Initialization this.$element @@ -2604,8 +2646,10 @@ OO.ui.WindowManager.prototype.afterWindowResize = function () { * * @param {jQuery.Event} e Mouse wheel event */ -OO.ui.WindowManager.prototype.onWindowMouseWheel = function () { - return false; +OO.ui.WindowManager.prototype.onWindowMouseWheel = function ( e ) { + // Kill all events in the parent window if the child window is isolated, + // or if the event didn't come from the child window + return !( this.shouldIsolate() || !$.contains( this.getCurrentWindow().$frame[0], e.target ) ); }; /** @@ -2623,8 +2667,9 @@ OO.ui.WindowManager.prototype.onDocumentKeyDown = function ( e ) { case OO.ui.Keys.UP: case OO.ui.Keys.RIGHT: case OO.ui.Keys.DOWN: - // Prevent any key events that might cause scrolling - return false; + // Kill all events in the parent window if the child window is isolated, + // or if the event didn't come from the child window + return !( this.shouldIsolate() || !$.contains( this.getCurrentWindow().$frame[0], e.target ) ); } }; @@ -2866,7 +2911,7 @@ OO.ui.WindowManager.prototype.closeWindow = function ( win, data ) { var manager = this, preparing = [], closing = $.Deferred(), - opened = this.opened; + opened; // Argument handling if ( typeof win === 'string' ) { @@ -2903,6 +2948,7 @@ OO.ui.WindowManager.prototype.closeWindow = function ( win, data ) { manager.closing = closing; manager.preparingToClose = null; manager.emit( 'closing', win, closing, data ); + opened = manager.opened; manager.opened = null; opened.resolve( closing.promise(), data ); setTimeout( function () { @@ -2984,7 +3030,7 @@ OO.ui.WindowManager.prototype.removeWindows = function ( names ) { if ( !win ) { throw new Error( 'Cannot remove window' ); } - promises.push( this.closeWindow( name ).then( OO.ui.bind( cleanup, null, name, win ) ) ); + promises.push( this.closeWindow( name ).then( cleanup.bind( null, name, win ) ) ); } return $.when.apply( $, promises ); @@ -3551,8 +3597,8 @@ OO.ui.ButtonElement = function OoUiButtonElement( config ) { this.tabIndex = null; this.accessKey = null; this.active = false; - this.onMouseUpHandler = OO.ui.bind( this.onMouseUp, this ); - this.onMouseDownHandler = OO.ui.bind( this.onMouseDown, this ); + this.onMouseUpHandler = this.onMouseUp.bind( this ); + this.onMouseDownHandler = this.onMouseDown.bind( this ); // Initialization this.$element.addClass( 'oo-ui-buttonElement' ); @@ -3839,7 +3885,7 @@ OO.ui.GroupElement.prototype.aggregate = function ( events ) { * * Adding an existing item (by value) will move it. * - * @param {OO.ui.Element[]} items Item + * @param {OO.ui.Element[]} items Items * @param {number} [index] Index to insert items at * @chainable */ @@ -4721,8 +4767,8 @@ OO.ui.ClippableElement = function OoUiClippableElement( config ) { this.$clippableWindow = null; this.idealWidth = null; this.idealHeight = null; - this.onClippableContainerScrollHandler = OO.ui.bind( this.clip, this ); - this.onClippableWindowResizeHandler = OO.ui.bind( this.clip, this ); + this.onClippableContainerScrollHandler = this.clip.bind( this ); + this.onClippableWindowResizeHandler = this.clip.bind( this ); // Initialization this.setClippableElement( config.$clippable || this.$element ); @@ -5190,7 +5236,7 @@ OO.ui.Toolbar = function OoUiToolbar( toolFactory, toolGroupFactory, config ) { // Events this.$element .add( this.$bar ).add( this.$group ).add( this.$actions ) - .on( 'mousedown touchstart', OO.ui.bind( this.onPointerDown, this ) ); + .on( 'mousedown touchstart', this.onPointerDown.bind( this ) ); // Initialization this.$group.addClass( 'oo-ui-toolbar-tools' ); @@ -5402,14 +5448,14 @@ OO.ui.ToolGroup = function OoUiToolGroup( toolbar, config ) { this.exclude = config.exclude || []; this.promote = config.promote || []; this.demote = config.demote || []; - this.onCapturedMouseUpHandler = OO.ui.bind( this.onCapturedMouseUp, this ); + this.onCapturedMouseUpHandler = this.onCapturedMouseUp.bind( this ); // Events this.$element.on( { - 'mousedown touchstart': OO.ui.bind( this.onPointerDown, this ), - 'mouseup touchend': OO.ui.bind( this.onPointerUp, this ), - mouseover: OO.ui.bind( this.onMouseOver, this ), - mouseout: OO.ui.bind( this.onMouseOut, this ) + 'mousedown touchstart': this.onPointerDown.bind( this ), + 'mouseup touchend': this.onPointerUp.bind( this ), + mouseover: this.onMouseOver.bind( this ), + mouseout: this.onMouseOut.bind( this ) } ); this.toolbar.getToolFactory().connect( this, { register: 'onToolFactoryRegister' } ); this.aggregate( { disable: 'itemDisable' } ); @@ -6062,7 +6108,7 @@ OO.ui.ProcessDialog.prototype.attachActions = function () { */ OO.ui.ProcessDialog.prototype.executeAction = function ( action ) { OO.ui.ProcessDialog.super.prototype.executeAction.call( this, action ) - .fail( OO.ui.bind( this.showErrors, this ) ); + .fail( this.showErrors.bind( this ) ); }; /** @@ -6171,7 +6217,7 @@ OO.ui.BookletLayout = function OoUiBookletLayout( config ) { } if ( this.autoFocus ) { // Event 'focus' does not bubble, but 'focusin' does - this.stackLayout.onDOMEvent( 'focusin', OO.ui.bind( this.onStackLayoutFocus, this ) ); + this.stackLayout.onDOMEvent( 'focusin', this.onStackLayoutFocus.bind( this ) ); } // Initialization @@ -6558,18 +6604,18 @@ OO.ui.BookletLayout.prototype.updateOutlineWidget = function () { * scanning for a specific label in a form with many fields * - right: Label is before the field and aligned toward it, best for forms the user is very * familiar with and will tab through field checking quickly to verify which field they are in - * - top: Label is before the field and above it, best for when the use will need to fill out all + * - top: Label is before the field and above it, best for when the user will need to fill out all * fields from top to bottom in a form with few fields * - inline: Label is after the field and aligned toward it, best for small boolean fields like * checkboxes or radio buttons * * @constructor - * @param {OO.ui.Widget} field Field widget + * @param {OO.ui.Widget} fieldWidget Field widget * @param {Object} [config] Configuration options * @cfg {string} [align='left'] Alignment mode, either 'left', 'right', 'top' or 'inline' * @cfg {string} [help] Explanatory text shown as a '?' icon. */ -OO.ui.FieldLayout = function OoUiFieldLayout( field, config ) { +OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) { // Config initialization config = $.extend( { align: 'left' }, config ); @@ -6581,7 +6627,7 @@ OO.ui.FieldLayout = function OoUiFieldLayout( field, config ) { // Properties this.$field = this.$( '
' ); - this.field = field; + this.fieldWidget = fieldWidget; this.align = null; if ( config.help ) { this.popupButtonWidget = new OO.ui.PopupButtonWidget( { @@ -6602,17 +6648,17 @@ OO.ui.FieldLayout = function OoUiFieldLayout( field, config ) { } // Events - if ( this.field instanceof OO.ui.InputWidget ) { - this.$label.on( 'click', OO.ui.bind( this.onLabelClick, this ) ); + if ( this.fieldWidget instanceof OO.ui.InputWidget ) { + this.$label.on( 'click', this.onLabelClick.bind( this ) ); } - this.field.connect( this, { disable: 'onFieldDisable' } ); + this.fieldWidget.connect( this, { disable: 'onFieldDisable' } ); // Initialization this.$element.addClass( 'oo-ui-fieldLayout' ); this.$field .addClass( 'oo-ui-fieldLayout-field' ) - .toggleClass( 'oo-ui-fieldLayout-disable', this.field.isDisabled() ) - .append( this.field.$element ); + .toggleClass( 'oo-ui-fieldLayout-disable', this.fieldWidget.isDisabled() ) + .append( this.fieldWidget.$element ); this.setAlignment( config.align ); }; @@ -6638,7 +6684,7 @@ OO.ui.FieldLayout.prototype.onFieldDisable = function ( value ) { * @param {jQuery.Event} e Mouse click event */ OO.ui.FieldLayout.prototype.onLabelClick = function () { - this.field.simulateLabelClick(); + this.fieldWidget.simulateLabelClick(); return false; }; @@ -6648,7 +6694,7 @@ OO.ui.FieldLayout.prototype.onLabelClick = function () { * @return {OO.ui.Widget} Field widget */ OO.ui.FieldLayout.prototype.getField = function () { - return this.field; + return this.fieldWidget; }; /** @@ -6669,17 +6715,16 @@ OO.ui.FieldLayout.prototype.setAlignment = function ( value ) { } else { this.$element.append( this.$help, this.$label, this.$field ); } - // Set classes + // Set classes. The following classes can be used here: + // * oo-ui-fieldLayout-align-left + // * oo-ui-fieldLayout-align-right + // * oo-ui-fieldLayout-align-top + // * oo-ui-fieldLayout-align-inline if ( this.align ) { this.$element.removeClass( 'oo-ui-fieldLayout-align-' + this.align ); } + this.$element.addClass( 'oo-ui-fieldLayout-align-' + value ); this.align = value; - // The following classes can be used here: - // oo-ui-fieldLayout-align-left - // oo-ui-fieldLayout-align-right - // oo-ui-fieldLayout-align-top - // oo-ui-fieldLayout-align-inline - this.$element.addClass( 'oo-ui-fieldLayout-align-' + this.align ); } return this; @@ -6698,7 +6743,6 @@ OO.ui.FieldLayout.prototype.setAlignment = function ( value ) { * * @constructor * @param {Object} [config] Configuration options - * @cfg {string} [icon] Symbolic icon name * @cfg {OO.ui.FieldLayout[]} [items] Items to add */ OO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) { @@ -6729,10 +6773,6 @@ OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.IconElement ); OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.LabelElement ); OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.GroupElement ); -/* Static Properties */ - -OO.ui.FieldsetLayout.static.tagName = 'div'; - /** * Layout with an HTML form. * @@ -6750,7 +6790,7 @@ OO.ui.FormLayout = function OoUiFormLayout( config ) { OO.ui.FormLayout.super.call( this, config ); // Events - this.$element.on( 'submit', OO.ui.bind( this.onFormSubmit, this ) ); + this.$element.on( 'submit', this.onFormSubmit.bind( this ) ); // Initialization this.$element.addClass( 'oo-ui-formLayout' ); @@ -6793,7 +6833,7 @@ OO.ui.FormLayout.prototype.onFormSubmit = function () { * @param {OO.ui.PanelLayout[]} panels Panels in the grid * @param {Object} [config] Configuration options * @cfg {number[]} [widths] Widths of columns as ratios - * @cfg {number[]} [heights] Heights of columns as ratios + * @cfg {number[]} [heights] Heights of rows as ratios */ OO.ui.GridLayout = function OoUiGridLayout( panels, config ) { var i, len, widths; @@ -6819,10 +6859,7 @@ OO.ui.GridLayout = function OoUiGridLayout( panels, config ) { this.layout( config.widths || [ 1 ], config.heights || [ 1 ] ); } else { // Arrange in columns by default - widths = []; - for ( i = 0, len = this.panels.length; i < len; i++ ) { - widths[i] = 1; - } + widths = this.panels.map( function () { return 1; } ); this.layout( widths, [ 1 ] ); } }; @@ -6841,10 +6878,6 @@ OO.inheritClass( OO.ui.GridLayout, OO.ui.Layout ); * @event update */ -/* Static Properties */ - -OO.ui.GridLayout.static.tagName = 'div'; - /* Methods */ /** @@ -6894,27 +6927,22 @@ OO.ui.GridLayout.prototype.layout = function ( widths, heights ) { * @fires update */ OO.ui.GridLayout.prototype.update = function () { - var x, y, panel, + var x, y, panel, width, height, dimensions, i = 0, - left = 0, top = 0, - dimensions, - width = 0, - height = 0, + left = 0, cols = this.widths.length, rows = this.heights.length; for ( y = 0; y < rows; y++ ) { height = this.heights[y]; for ( x = 0; x < cols; x++ ) { - panel = this.panels[i]; width = this.widths[x]; + panel = this.panels[i]; dimensions = { width: Math.round( width * 100 ) + '%', height: Math.round( height * 100 ) + '%', - top: Math.round( top * 100 ) + '%', - // HACK: Work around IE bug by setting visibility: hidden; if width or height is zero - visibility: width === 0 || height === 0 ? 'hidden' : '' + top: Math.round( top * 100 ) + '%' }; // If RTL, reverse: if ( OO.ui.Element.getDir( this.$.context ) === 'rtl' ) { @@ -6922,6 +6950,10 @@ OO.ui.GridLayout.prototype.update = function () { } else { dimensions.left = Math.round( left * 100 ) + '%'; } + // HACK: Work around IE bug by setting visibility: hidden; if width or height is zero + if ( width === 0 || height === 0 ) { + dimensions.visibility = 'hidden'; + } panel.$element.css( dimensions ); i++; left += width; @@ -6943,7 +6975,7 @@ OO.ui.GridLayout.prototype.update = function () { * @return {OO.ui.PanelLayout} The panel at the given postion */ OO.ui.GridLayout.prototype.getPanel = function ( x, y ) { - return this.panels[( x * this.widths.length ) + y]; + return this.panels[ ( x * this.widths.length ) + y ]; }; /** @@ -6960,7 +6992,11 @@ OO.ui.GridLayout.prototype.getPanel = function ( x, y ) { */ OO.ui.PanelLayout = function OoUiPanelLayout( config ) { // Config initialization - config = config || {}; + config = $.extend( { + scrollable: false, + padded: false, + expanded: true + }, config ); // Parent constructor OO.ui.PanelLayout.super.call( this, config ); @@ -6970,12 +7006,10 @@ OO.ui.PanelLayout = function OoUiPanelLayout( config ) { if ( config.scrollable ) { this.$element.addClass( 'oo-ui-panelLayout-scrollable' ); } - if ( config.padded ) { this.$element.addClass( 'oo-ui-panelLayout-padded' ); } - - if ( config.expanded === undefined || config.expanded ) { + if ( config.expanded ) { this.$element.addClass( 'oo-ui-panelLayout-expanded' ); } }; @@ -7333,13 +7367,13 @@ OO.ui.PopupToolGroup = function OoUiPopupToolGroup( toolbar, config ) { // Properties this.active = false; this.dragging = false; - this.onBlurHandler = OO.ui.bind( this.onBlur, this ); + this.onBlurHandler = this.onBlur.bind( this ); this.$handle = this.$( '' ); // Events this.$handle.on( { - 'mousedown touchstart': OO.ui.bind( this.onHandlePointerDown, this ), - 'mouseup touchend': OO.ui.bind( this.onHandlePointerUp, this ) + 'mousedown touchstart': this.onHandlePointerDown.bind( this ), + 'mouseup touchend': this.onHandlePointerUp.bind( this ) } ); // Initialization @@ -7469,14 +7503,29 @@ OO.ui.PopupToolGroup.prototype.setActive = function ( value ) { /** * Drop down list layout of tools as labeled icon buttons. * + * This layout allows some tools to be collapsible, controlled by a "More" / "Fewer" option at the + * bottom of the main list. These are not automatically positioned at the bottom of the list; you + * may want to use the 'promote' and 'demote' configuration options to achieve this. + * * @class * @extends OO.ui.PopupToolGroup * * @constructor * @param {OO.ui.Toolbar} toolbar * @param {Object} [config] Configuration options + * @cfg {Array} [allowCollapse] List of tools that can be collapsed. Remaining tools will be always + * shown. + * @cfg {Array} [forceExpand] List of tools that *may not* be collapsed. All remaining tools will be + * allowed to be collapsed. + * @cfg {boolean} [expanded=false] Whether the collapsible tools are expanded by default */ OO.ui.ListToolGroup = function OoUiListToolGroup( toolbar, config ) { + // Properties (must be set before parent constructor, which calls #populate) + this.allowCollapse = config.allowCollapse; + this.forceExpand = config.forceExpand; + this.expanded = config.expanded !== undefined ? config.expanded : false; + this.collapsibleTools = []; + // Parent constructor OO.ui.ListToolGroup.super.call( this, toolbar, config ); @@ -7494,6 +7543,96 @@ OO.ui.ListToolGroup.static.accelTooltips = true; OO.ui.ListToolGroup.static.name = 'list'; +/* Methods */ + +/** + * @inheritdoc + */ +OO.ui.ListToolGroup.prototype.populate = function () { + var i, len, allowCollapse = []; + + OO.ui.ListToolGroup.super.prototype.populate.call( this ); + + // Update the list of collapsible tools + if ( this.allowCollapse !== undefined ) { + allowCollapse = this.allowCollapse; + } else if ( this.forceExpand !== undefined ) { + allowCollapse = OO.simpleArrayDifference( Object.keys( this.tools ), this.forceExpand ); + } + + this.collapsibleTools = []; + for ( i = 0, len = allowCollapse.length; i < len; i++ ) { + if ( this.tools[ allowCollapse[i] ] !== undefined ) { + this.collapsibleTools.push( this.tools[ allowCollapse[i] ] ); + } + } + + // Keep at the end, even when tools are added + this.$group.append( this.getExpandCollapseTool().$element ); + + this.getExpandCollapseTool().toggle( this.collapsibleTools.length !== 0 ); + + // Calling jQuery's .hide() and then .show() on a detached element caches the default value of its + // 'display' attribute and restores it, and the tool uses a and can be hidden and re-shown. + // Is this a jQuery bug? http://jsfiddle.net/gtj4hu3h/ + if ( this.getExpandCollapseTool().$element.css( 'display' ) === 'inline' ) { + this.getExpandCollapseTool().$element.css( 'display', 'inline-block' ); + } + + this.updateCollapsibleState(); +}; + +OO.ui.ListToolGroup.prototype.getExpandCollapseTool = function () { + if ( this.expandCollapseTool === undefined ) { + var ExpandCollapseTool = function () { + ExpandCollapseTool.super.apply( this, arguments ); + }; + + OO.inheritClass( ExpandCollapseTool, OO.ui.Tool ); + + ExpandCollapseTool.prototype.onSelect = function () { + this.toolGroup.expanded = !this.toolGroup.expanded; + this.toolGroup.updateCollapsibleState(); + this.setActive( false ); + }; + ExpandCollapseTool.prototype.onUpdateState = function () { + // Do nothing. Tool interface requires an implementation of this function. + }; + + ExpandCollapseTool.static.name = 'more-fewer'; + + this.expandCollapseTool = new ExpandCollapseTool( this ); + } + return this.expandCollapseTool; +}; + +/** + * @inheritdoc + */ +OO.ui.ListToolGroup.prototype.onPointerUp = function ( e ) { + var ret = OO.ui.ListToolGroup.super.prototype.onPointerUp.call( this, e ); + + // Do not close the popup when the user wants to show more/fewer tools + if ( this.$( e.target ).closest( '.oo-ui-tool-name-more-fewer' ).length ) { + // Prevent the popup list from being hidden + this.setActive( true ); + } + + return ret; +}; + +OO.ui.ListToolGroup.prototype.updateCollapsibleState = function () { + var i, len; + + this.getExpandCollapseTool() + .setIcon( this.expanded ? 'collapse' : 'expand' ) + .setTitle( OO.ui.msg( this.expanded ? 'ooui-toolgroup-collapse' : 'ooui-toolgroup-expand' ) ); + + for ( i = 0, len = this.collapsibleTools.length; i < len; i++ ) { + this.collapsibleTools[i].toggle( this.expanded ); + } +}; + /** * Drop down menu layout of tools as selectable menu items. * @@ -7736,9 +7875,9 @@ OO.ui.LookupInputWidget = function OoUiLookupInputWidget( input, config ) { this.$overlay.append( this.lookupMenu.$element ); this.lookupInput.$input.on( { - focus: OO.ui.bind( this.onLookupInputFocus, this ), - blur: OO.ui.bind( this.onLookupInputBlur, this ), - mousedown: OO.ui.bind( this.onLookupInputMouseDown, this ) + focus: this.onLookupInputFocus.bind( this ), + blur: this.onLookupInputBlur.bind( this ), + mousedown: this.onLookupInputMouseDown.bind( this ) } ); this.lookupInput.connect( this, { change: 'onLookupInputChange' } ); @@ -8174,7 +8313,7 @@ OO.ui.ButtonWidget = function OoUiButtonWidget( config ) { OO.ui.IconElement.call( this, config ); OO.ui.IndicatorElement.call( this, config ); OO.ui.LabelElement.call( this, config ); - OO.ui.TitledElement.call( this, config, $.extend( {}, config, { $titled: this.$button } ) ); + OO.ui.TitledElement.call( this, $.extend( {}, config, { $titled: this.$button } ) ); OO.ui.FlaggedElement.call( this, config ); // Properties @@ -8184,8 +8323,8 @@ OO.ui.ButtonWidget = function OoUiButtonWidget( config ) { // Events this.$button.on( { - click: OO.ui.bind( this.onClick, this ), - keypress: OO.ui.bind( this.onKeyPress, this ) + click: this.onClick.bind( this ), + keypress: this.onKeyPress.bind( this ) } ); // Initialization @@ -8682,7 +8821,7 @@ OO.ui.InlineMenuWidget = function OoUiInlineMenuWidget( config ) { this.$handle = this.$( '' ); // Events - this.$element.on( { click: OO.ui.bind( this.onClick, this ) } ); + this.$element.on( { click: this.onClick.bind( this ) } ); this.menu.connect( this, { select: 'onMenuSelect' } ); // Initialization @@ -8788,7 +8927,7 @@ OO.ui.InputWidget = function OoUiInputWidget( config ) { this.inputFilter = config.inputFilter; // Events - this.$input.on( 'keydown mouseup cut paste change input select', OO.ui.bind( this.onEdit, this ) ); + this.$input.on( 'keydown mouseup cut paste change input select', this.onEdit.bind( this ) ); // Initialization this.$input @@ -8968,6 +9107,140 @@ OO.ui.InputWidget.prototype.blur = function () { return this; }; +/** + * A button that is an input widget. Intended to be used within FormLayouts. + * + * @class + * @extends OO.ui.InputWidget + * @mixins OO.ui.ButtonElement + * @mixins OO.ui.IconElement + * @mixins OO.ui.IndicatorElement + * @mixins OO.ui.LabelElement + * @mixins OO.ui.TitledElement + * @mixins OO.ui.FlaggedElement + * + * @constructor + * @param {Object} [config] Configuration options + * @cfg {string} [type='button'] HTML tag `type` attribute, may be 'button', 'submit' or 'reset' + * @cfg {boolean} [useInputTag=false] Whether to use `` rather than `